Búsqueda de información geocodificada por distancia
Pregunta
Tengo una base de datos de direcciones, todas geocodificadas.
¿Cuál es la mejor manera de encontrar todas las direcciones en nuestra base de datos dentro de un cierto radio de un lat, lng dado?
En otras palabras, un usuario ingresa (lat, lng) de una ubicación y devolvemos todos los registros de nuestra base de datos que se encuentran dentro de 10, 20, 50 ... etc. millas de la ubicación dada.
No tiene que ser muy preciso.
Estoy usando MySQL DB como back-end.
Solución
Hay extensiones espaciales disponibles para MySQL 5: una página de entrada a la documentación está aquí:
http://dev.mysql.com/doc /refman/5.0/en/spatial-extensions.html
Hay muchos detalles sobre cómo lograr lo que está pidiendo, dependiendo de cómo se representen sus datos espaciales en la base de datos.
Otra opción es hacer una función para calcular la distancia usando la fórmula de Haversine mencionada anteriormente. Las matemáticas detrás de esto se pueden encontrar aquí:
www.movable-type.co.uk/scripts/latlong.html
Espero que esto ayude.
Otros consejos
No mencionó su base de datos, pero en SQL Server 2008 es tan fácil cuando usa los tipos de datos geográficos
Esto encontrará todos los códigos postales a menos de 20 millas del código postal 10028
SELECT h.*
FROM zipcodes g
JOIN zipcodes h ON g.zipcode <> h.zipcode
AND g.zipcode = '10028'
AND h.zipcode <> '10028'
WHERE g.GeogCol1.STDistance(h.GeogCol1)<=(20 * 1609.344)
vea también aquí Búsqueda de proximidad de SQL Server 2008 con el tipo de datos de geografía
La versión de SQL Server 2000 está aquí: S QL Server Zipcode Latitud / Longitud búsqueda de distancia de proximidad
Este es un problema típico de búsqueda espacial.
1 > qué db está utilizando, sql2008, oracle, geodatabase ESRI y postgis son algunos motores de db espacial que tienen esta funcionalidad. 2 > De lo contrario, probablemente busque alguna biblioteca espacial de Algo si desea lograr esto. Podría codificarlo usted mismo, pero no lo sugeriré porque la geometría de la computación es un problema complicado.
Si está utilizando una base de datos que admite tipos espaciales, puede crear la consulta directamente y la base de datos la manejará. PostgreSQL, Oracle y la última versión de MS SQL son compatibles con esto, al igual que algunos otros.
Si no, y la precisión no es un problema, puede hacer una búsqueda en un cuadro en lugar de por radio, ya que será muy rápido. De lo contrario, las cosas se complican, ya que la conversión real de lat-long - > las distancias deben suceder en un espacio proyectado (dado que las distancias cambian en diferentes áreas del planeta), y la vida se vuelve un poco más desagradable.
No recuerdo la ecuación de la parte superior de mi cabeza, pero la fórmula de Haversine es la que se usa para calcular las distancias entre dos puntos en la Tierra. Puedes buscar en Google la ecuación y ver si eso te da alguna idea. Lo siento, sé que esto no es de mucha ayuda, pero tal vez le dará un lugar para comenzar.
Si no tiene que ser muy preciso, y supongo que tiene una columna xey en su tabla, simplemente seleccione todas las filas en un gran rectángulo delimitador y use pythagorus (o Haversine) para recortar el resultados en las esquinas.
ej. seleccione * desde ubicaciones donde (x entre xpos-10 millas y xpos + 10 millas) y (y entre xpos -10 millas y ypos + 10 millas).
Recuerde que Pythagorus es sqrt (x_dist ^ 2 + y_dist ^ 2).
Es rápido y simple, fácil de entender y no necesita combinaciones divertidas.