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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top