Tengo latitud y longitud y quiero extraer el registro de la base de datos, que tiene la latitud y longitud más cercanas por la distancia, si esa distancia es más larga que la especificada, entonces no la recupere.
Estructura de la mesa:
id
latitude
longitude
place name
city
country
state
zip
sealevel
mysql
sql
coordinates
geospatial
Basit
fuente
fuente
Respuestas:
donde [starlat] y [startlng] es la posición donde comenzar a medir la distancia.
fuente
La solución de Google:
Creando la tabla
Cuando crea la tabla MySQL, desea prestar especial atención a los atributos lat y lng. Con las capacidades de zoom actuales de Google Maps, solo debería necesitar 6 dígitos de precisión después del decimal. Para mantener al mínimo el espacio de almacenamiento requerido para su tabla, puede especificar que los atributos lat y lng sean flotantes de tamaño (10,6). Eso permitirá que los campos almacenen 6 dígitos después del decimal, más hasta 4 dígitos antes del decimal, por ejemplo, -123.456789 grados. Su tabla también debe tener un atributo id para servir como clave principal.
Poblar la mesa
Después de crear la tabla, es hora de llenarla con datos. Los datos de muestra que se proporcionan a continuación corresponden a unas 180 pizzarias diseminadas por los Estados Unidos. En phpMyAdmin, puede usar la pestaña IMPORTAR para importar varios formatos de archivo, incluido CSV (valores separados por comas). Microsoft Excel y Google Spreadsheets exportan a formato CSV, por lo que puede transferir fácilmente datos de hojas de cálculo a tablas MySQL mediante la exportación / importación de archivos CSV.
Encontrar ubicaciones con MySQL
Para buscar ubicaciones en su tabla de marcadores que estén dentro de una cierta distancia de radio de una latitud / longitud dada, puede usar una instrucción SELECT basada en la fórmula de Haversine. La fórmula de Haversine se usa generalmente para calcular distancias de gran círculo entre dos pares de coordenadas en una esfera. Wikipedia da una explicación matemática en profundidad y una buena discusión de la fórmula en relación con la programación se encuentra en el sitio de Movable Type.
Aquí está la instrucción SQL que encontrará las 20 ubicaciones más cercanas que están dentro de un radio de 25 millas a la coordenada 37, -122. Calcula la distancia en función de la latitud / longitud de esa fila y la latitud / longitud objetivo, y luego solicita solo filas donde el valor de la distancia es inferior a 25, ordena toda la consulta por distancia y la limita a 20 resultados. Para buscar por kilómetros en lugar de millas, reemplace 3959 con 6371.
Este es encontrar latitudes y longitudes en una distancia de menos de 28 millas.
Otro es encontrarlos en una distancia entre 28 y 29 millas:
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map
fuente
HAVING distance < 25
cuando consultamos ubicaciones dentro de un radio de 25 millas?Aquí está mi solución completa implementada en PHP.
Esta solución utiliza la fórmula de Haversine como se presenta en http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL .
Cabe señalar que la fórmula de Haversine experimenta debilidades alrededor de los polos. Esta respuesta muestra cómo implementar la fórmula Vincenty Great Circle Distance para evitar esto, sin embargo, elegí usar Haversine porque es lo suficientemente bueno para mis propósitos.
Estoy almacenando la latitud como DECIMAL (10,8) y la longitud como DECIMAL (11,8). ¡Ojalá esto ayude!
showClosest.php
./assets/db/db.php
./assets/db/dbSettings.php
Es posible aumentar el rendimiento mediante el uso de un procedimiento almacenado de MySQL como lo sugiere el artículo "Geo-Distance-Search-with-MySQL" publicado anteriormente.
Tengo una base de datos de ~ 17,000 lugares y el tiempo de ejecución de la consulta es de 0.054 segundos.
fuente
abs
debe ser eliminado. No es necesario tomar el valor de abs al convertir de grados a radianes e, incluso si lo hiciste, lo estás haciendo solo en una de las latitudes. Edítelo para que corrija el error.69
con111,044736
(olvidé eso en el comentario anterior)En caso de que seas perezoso como yo, aquí hay una solución amalgamada de esta y otras respuestas sobre SO.
fuente
bounding_distance
representa exactamente ? ¿este valor limita los resultados a una cantidad de millas? entonces, en este caso, ¿devolverá resultados dentro de 1 milla?Fácil ;)
Simplemente reemplace las coordenadas con las requeridas. Los valores deben almacenarse como dobles. Este es un ejemplo de MySQL 5.x que funciona.
Salud
fuente
dx+dy
Intente esto, muestra los puntos más cercanos a las coordenadas proporcionadas (a menos de 50 km). Funciona perfectamente:
Solo cambia
<table_name>
.<userLat>
y<userLon>
Puede leer más sobre esta solución aquí: http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
fuente
Las respuestas originales a la pregunta son buenas, pero las versiones más recientes de mysql (MySQL 5.7.6 en adelante) admiten consultas geográficas, por lo que ahora puede usar la funcionalidad integrada en lugar de hacer consultas complejas.
Ahora puedes hacer algo como:
Los resultados se devuelven en
meters
. Entonces, si lo desea,KM
simplemente use en.001
lugar de.000621371192
(que es por millas).Los documentos de MySQL están aquí
fuente
ST_Distance_Sphere
no existe en la instalación de mi host (mysql Ver 15.1 Distrib 10.2.23-MariaDB
). Leí en alguna parte para sustituir,ST_Distance
pero las distancias están muy lejos.ST_Distance_Sphere
Estás buscando cosas como la fórmula de Haversine . Mira aquí también.
Hay otros, pero este es el más comúnmente citado.
Si está buscando algo aún más robusto, es posible que desee ver las capacidades SIG de sus bases de datos. Son capaces de algunas cosas interesantes como decirle si un punto (Ciudad) aparece dentro de un polígono dado (Región, País, Continente).
fuente
Verifique este código basado en el artículo Geo-Distance-Search-with-MySQL :
Ejemplo: encontrar los 10 hoteles más cercanos a mi ubicación actual en un radio de 10 millas:
fuente
fuente
Parece que quiere hacer una búsqueda de vecino más cercano con algunos límites en la distancia. SQL no admite nada de esto, por lo que yo sé, y necesitaría usar una estructura de datos alternativa, como un árbol R o un árbol kd .
fuente
Encuentra usuarios más cercanos a mi:
Distancia en metros
Basado en la fórmula de Vincenty
Tengo tabla de usuario:
sql:
radio de la tierra: 6371000 (en metros)
fuente
MS SQL Edition aquí:
fuente
Parece que debería usar PostGIS, SpatialLite, SQLServer2008 u Oracle Spatial. Todos pueden responder esta pregunta por usted con SQL espacial.
fuente
En casos extremos, este enfoque falla, pero por rendimiento, he omitido la trigonometría y simplemente calculé la diagonal al cuadrado.
fuente
Este problema no es muy difícil en absoluto, pero se vuelve más complicado si necesita optimizarlo.
Lo que quiero decir es, ¿tiene 100 ubicaciones en su base de datos o 100 millones? Eso hace una gran diferencia.
Si el número de ubicaciones es pequeño, sáquelas del SQL y del código simplemente haciendo ->
Una vez que los ingrese en el código, calcule la distancia entre cada lat / lon y su original con la fórmula Haversine y ordénelo.
fuente