¿Qué SRS usar para consultas de distancia global?


8

Tengo una base de datos con muchos puntos en WGS84. Ahora estoy construyendo un caché que realiza consultas NN y puntos en rango usando un KDtree. El punto [sic] es que el radio de búsqueda se proporcionará en metros y que lat / lon no es un buen SRS para estas consultas geométricas.

Estoy buscando un SRS geométrico que sea aplicable a todo el mundo y que conserve las distancias. No me importan los errores de un par de décimas de metro.


¿Por qué no convertir todos los puntos a coordenadas 3D xyz (geocéntricas) y construir su árbol KD sobre eso? Aunque no conserva las distancias, las distancias en la esfera se convierten fácilmente en distancias en 3D para fines de consulta. De hecho, es tan fácil convertir lat-lon a xyz con un modelo elipsoidal que no necesita sacrificar ninguna precisión en absoluto, pero incluso si usa un modelo esférico, todas las distancias deben ser precisas a aproximadamente 0.3% (en el peor de los casos) )
whuber

Respuestas:


2

Busqué en Google el "Índice espacial esférico". Hay un montón de métodos posibles que utilizan la descomposición triangular de la esfera, o inclinaciones de voronoi. Sin embargo, un método que parece fácilmente implementable es considerar sus datos en 3d, como en la sección "Cuadro de límite 3D" aquí:

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

Luego necesita un índice espacial 3d de algún tipo, luego puede encontrar rápidamente todos los puntos dentro de su 1 km. Este sería un radio de búsqueda 3D de 1 km , tan ligeramente diferente a un radio de 1 km a lo largo de la superficie de la tierra, pero para radios de búsqueda pequeños, sería efectivamente idéntico (haga los cálculos para resolver la corrección).

Si desea una precisión absoluta, use esto como un primer paso y luego calcule las distancias a través de un gran círculo para eliminarlas más lejos (la distancia a lo largo de una esfera siempre es mayor que la distancia a través de una esfera).


Hey, esa es una idea! Podría exprimirme en otra dimensión en mi KDTree y trabajar con eso. Aunque necesitará un poco de trabajo :)
RickyA

4

Con las proyecciones SRS / Map, siempre es una compensación. Realmente no hay uno que se ajuste bien a todos los lugares del mundo. También podría suponer que la tierra es una esfera.

En lugar de buscar un SRS que se ajuste a todo el mundo, creo que es mejor buscar algoritmos de cálculo de distancia . Un ejemplo es el Great Circle Distanc e, que se basa en la trigonometría esférica. Sin embargo, hace suposiciones como:

  • 1 minuto de arco es 1 milla náutica
  • 1 milla náutica es 1.852 km.

La formula es:

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

Dónde:

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)

Sin embargo, es posible que desee probarlo primero con sus datos y ver los resultados. Por cierto, ¿estás usando una base de datos espacial como PostGIS?


Bueno, ese es el punto. Postgis no es lo suficientemente rápido para mí. Lo que hago ahora es poner todos los puntos en redis y hacer un índice KDtree encima. PERO el KDtree es una solución geométrica. Si le hago una pregunta como "dar todos los puntos en un radio de 1k", pisa la distancia geométricamente. No puedo hacer haversine allí. Necesito convertirlo de antemano a un SRS más o menos equidistante. ¿Pero cual?
RickyA

Actualicé mi respuesta con la fórmula. Ese es el problema, no hay SRS / CRS (geométrico) proyectado que sea aplicable a todo el mundo.
RK

¿Y el mejor aprox? Realmente no me importan los polos, solo los pingüinos, pero ¿algo que funcione geométricamente mejor que WGS84?
RickyA

Postgis admite el plano esférico cuando se usa el tipo de geografía en lugar de la geometría. postgis.refractions.net/docs/…
nickves

1
@nickves sí, lo vi, pero postgis realmente no es lo suficientemente rápido para mí. Necesito menos de 2 ms de latencia y debería poder manejar 1000 solicitudes por segundo. Aunque podría aplicar ingeniería inversa a las soluciones de postgis :)
RickyA
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.