Sí, hay una mejor manera. Necesita usar un índice espacial . Estos índices organizan metadatos sobre geometrías para filtrar geometrías lejanas muy rápidamente, ahorrando muchos ciclos de CPU al evitar los cálculos que usted describe. No debería molestarse en implementar uno usted mismo, ya que todas las principales bases de datos relacionales proporcionan un tipo de geometría espacial e índices para acompañarlas.
Lo que desea examinar son consultas "a distancia" (consultas de geometrías dentro de una cierta distancia de alguna otra geometría). Estos son un problema muy estándar y muy resuelto y son posibles en todas las bases de datos anteriores (e integradas en varias):
- PostGIS:
ST_DWithin
- SQL Server:
STDistance
(no está claro que el uso del índice en la versión de geografía 3D de esta función sea compatible)
- Oracle:
SDO_WITHIN_DISTANCE
(Esto no dice explícitamente que activará el uso del índice. Verificaría dos veces el plan de consulta. Es posible que deba aplicar un SDO_FILTER
para que use el índice).
- MySQL: Todavía estoy resolviendo esto.
Solución alternativa para activar el uso del índice
En el peor de los casos en el que tiene problemas para que el sistema use el índice espacial con estas consultas, puede agregar un filtro adicional. Crearía un cuadro delimitador cuadrado con lados de longitud 2 * (distancia de búsqueda) centrados en su punto de búsqueda y compararía los cuadros delimitadores de las geometrías de la tabla con eso antes de verificar la distancia real. Eso es lo que PostGIS ST_DWithin
hace arriba internamente de todos modos.
Distancia en SIG
Si bien los índices espaciales son fantásticos y absolutamente la solución correcta para su problema, el cálculo de la distancia puede ser lógicamente complicado. En particular, debe preocuparse sobre en qué proyección (básicamente todos los parámetros para el sistema de coordenadas) se almacenan sus datos. La mayoría de las proyecciones 2D (que no sean sistemas de coordenadas angulares como las diversas proyecciones lat / long) distorsionan la longitud significativamente. Por ejemplo, la proyección de Web Mercator (la utilizada por Google, Bing y cualquier otro proveedor de mapas base importante) expande áreas y distancias cada vez más a medida que la ubicación se aleja del ecuador . Podría estar equivocado ya que no tengo educación formal en SIG, pero lo mejor que he visto para proyecciones 2D son algunas específicas que prometen distancias correctas desde unpunto único y constante en todo el mundo. (No, no es práctico usar una proyección diferente para cada consulta; eso haría que sus índices sean inútiles).
La conclusión es que debe asegurarse de que sus cálculos sean precisos. La forma más simple de hacerlo desde una perspectiva de desarrollo es usar proyecciones angulares (a menudo se las denomina "geográficas") y funciones que apoyan hacer las matemáticas usando un modelo de esferoides, pero estos cálculos son un poco más caros que las contrapartes 2D y algunos DB pueden no admitir su indexación. Sin embargo, si puede obtener un rendimiento aceptable al usarlos, ese es probablemente el camino a seguir. Otra opción común son las proyecciones regionales (como las zonas UTM) que consiguen distancias y áreas bastante cercanas para corregir si sus datos se limitan a una parte particular del mundo. Lo mejor para su aplicación dependerá de sus requisitos específicos,
Esto se aplica incluso si no utiliza índices espaciales integrados. Sus datos tienen cierta proyección, independientemente de la tecnología o técnica que esté utilizando o use actualmente en el futuro, y ya está afectando cualquier consulta y cálculo que esté haciendo.