Qual SRS usar para consultas de distância global?

8

Eu tenho um banco de dados com muitos pontos no WGS84. Agora estou construindo um cache que executa NN e aponta consultas de intervalo usando um KDtree. O ponto [sic] é que o raio de pesquisa será fornecido em metros e que lat / lon não é um bom SRS para essas consultas geométricas.

Estou procurando uma SRS geométrica que seja aplicável a todo o mundo e que preserve distâncias. Não me importo com erros de alguns décimos de metros.

RickyA
fonte
Por que não converter todos os pontos em coordenadas xyz 3D (geocêntricas) e construir sua árvore KD com base nisso? Embora não preserve distâncias, as distâncias na esfera são facilmente convertidas em distâncias em 3D para fins de consulta. Na verdade, é tão fácil converter lat-lon em xyz com um modelo elipsoidal que você não precisa sacrificar absolutamente nenhuma precisão, mas mesmo se você usar um modelo esférico, todas as distâncias devem ser precisas em cerca de 0,3% (na pior das hipóteses) )
whuber

Respostas:

2

Eu pesquisei no "Spherical Spatial Index" no Google. Existem vários métodos possíveis usando a decomposição triangular da esfera, ou inclinações voronoi. Um método que parece facilmente implementável é considerar seus dados em 3d, como na seção "Caixa delimitadora 3D" aqui:

http://lin-ear-th-inking.blogspot.co.uk/2007/09/geodetic-data-in-postgis-spherical.html

Então você precisa de algum tipo de índice espacial 3d, para encontrar rapidamente todos os pontos em um quilômetro. Este seria um raio de pesquisa 3D de 1 km , tão ligeiramente diferente de um raio de 1 km ao longo da superfície da Terra, mas para raios de pesquisa pequenos, seria efetivamente idêntico (faça as contas para calcular a correção).

Se você deseja precisão absoluta, use isso como um primeiro passo e depois calcule as distâncias através de um grande círculo para eliminá-las mais longe (a distância ao longo de uma esfera é sempre maior que a distância através de uma esfera).

Spacedman
fonte
Ei, isso é uma ideia! Eu poderia me espremer em outra dimensão no meu KDTree e trabalhar com isso. Vai precisar de algum retrabalho embora :)
RickyA
4

Com as projeções SRS / Map, é sempre uma troca. Realmente não existe um que seja adequado para todos os lugares do mundo. Pode muito bem assumir que a terra é uma esfera.

Em vez de procurar um SRS que se encaixe no mundo inteiro, acho melhor você procurar algoritmos de cálculo de distância . Um exemplo é a grande distância do círculo, baseada na trigonometria esférica. Faz suposições embora como:

  • 1 minuto de arco é 1 milha náutica
  • 1 milha náutica é de 1.852 km.

A fórmula é:

D = 1.852 * 60 * ARCOS ( SIN(L1) * SIN(L2) + COS(L1) * COS(L2) * COS(DG)

Onde:

L1  =   latitude at the first point (degrees)
L2  =   latitude at the second point (degrees)
G1  =   longitude at the first point (degrees)
G2  =   longitude at the second point (degrees)
DG  =   longitude of the second point minus longitude of the first point (degrees)
DL  =   latitude of the second point minus latitude of the first point (degrees)
D   =   computed distance (km)

Você pode testá-lo primeiro com seus dados e ver os resultados. Btw, você está usando um banco de dados espacial como o PostGIS?

RK
fonte
Bem, esse é o ponto. O Postgis não é rápido o suficiente para mim. O que eu faço agora é colocar todos os pontos em redis e criar um índice KDtree em cima dele. MAS o KDtree é uma solução geométrica. Se eu fizer uma pergunta como "dê todos os pontos em um raio de 1k", ela percorre a distância geometricamente. Eu não posso fazer haversine lá. Preciso convertê-lo previamente para um SRS aproximadamente equidistante. Mas qual deles?
RickyA
Atualizei minha resposta com a fórmula. Esse é o problema, não há SRS / CRS (geométrico) projetado que seja aplicável a todo o mundo.
RK
E o melhor aprox? Eu realmente não me importo com os pólos, apenas com os pingüins, mas com algo que tenha um desempenho geometricamente melhor que o WGS84?
RickyA
O Postgis suporta plano esférico ao usar o tipo de geografia em vez da geometria. postgis.refractions.net/docs/…
nickves
1
@ Nickves sim eu vi isso, mas postgis não é realmente rápido o suficiente para mim. Preciso de menos de 2ms de latência e deve ser capaz de lidar com 1000 solicitações por segundo. Eu poderia reverter soluções de engenharia de PostGIS embora :)
RickyA