php - obtener - mapa con coordenadas geográficas
¿Cómo encontrar la ubicación más cercana usando latitud y longitud desde la base de datos sql? (7)
Quiero encontrar una ubicación más cercana de la siguiente tabla de la base de datos
Address Latitude longitude
Kathmandu 44600, Nepal 27.7 85.33333330000005
Los, Antoniterstraße 37.09024 -95.71289100000001
Sydney NSW, Australia 49.7480755 8.111794700000019
goa india 15.2993265 74.12399600000003
He obtenido todos estos datos de los mapas de Google. Aquí tengo que encontrar la ubicación más cercana de un lugar. Supongamos que estoy en el lugar Surkhet, su latitud es 28.6 y la longitud es 81.6, ¿cómo puedo encontrar el lugar más cercano desde el lugar Surkhet?
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
Esta es la mejor consulta
Cuando el método debe funcionar, es mejor primero filtrar en latitud y longitud, y luego calcular la distancia cuadrada aproximativa. Para los países nórdicos, será alrededor del 0.3 por ciento de descuento dentro de los 1000 km.
Entonces, en lugar de calcular la distancia como:
dist_Sphere = r_earth * acos ( sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1)
uno puede calcular el valor aproximado (suponiendo que lat = lat 1 está cerca de lat 2) como
const cLat2 = cos lat ^ 2
const r_earth2 = r_earth ^ 2
dist_App ^2 = r_earth2 * ((lat 2 - lat 1) ^2 + clat2 *(lon 2 - lon 1) ^2)
Ordene por Dist_App 2, y luego simplemente tome la raíz cuadrada del resultado.
El SQL tiene un problema. En la tabla como:
`ubicacion` (
`id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT ,
`latitud` DOUBLE NOT NULL ,
`longitud` DOUBLE NOT NULL ,
PRIMARY KEY (`id_ubicacion`) )
La id_ubicacion cambia cuando se usa:
SELECT `id_ubicacion` , ( 3959 * ACOS( COS( RADIANS( 9.053933 ) ) * COS( RADIANS( latitud ) ) * COS( RADIANS( longitud ) - RADIANS( - 79.421215 ) ) + SIN( RADIANS( 9.053933 ) ) * SIN( RADIANS( latitud ) ) ) ) AS distance
FROM ubicacion
HAVING distance <25
ORDER BY distance
LIMIT 0 , 20
Para encontrar la ubicación cercana, puede usar la clase Geocoder. Como tiene los Geopoints (latitud y longitud), se puede usar la geocodificación inversa. La geocodificación inversa es el proceso de transformar una coordenada (latitud, longitud) en una dirección (parcial). Mira this para más información.
Encontrar lugares cercanos con MySQL
Aquí está la declaración de SQL que encontrará las 20 ubicaciones más cercanas que se encuentran dentro de un radio de 25 millas con 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.
Estructura de la tabla:
id,name,address,lat,lng
NOTA - Aquí la latitud = 37 y la longitud = -122. Entonces solo pasa el tuyo.
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) *
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) *
sin( radians( lat ) ) ) ) AS distance FROM your_table_name HAVING
distance < 25 ORDER BY distance LIMIT 0 , 20;
Puede encontrar detalles here .
SELECT latitude, longitude, SQRT(
POW(69.1 * (latitude - [startlat]), 2) +
POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;
donde [starlat] y [startlng] es la posición donde comenzar a medir la distancia y 25 es la distancia en kms.
Se recomienda hacer un procedimiento almacenado para usar la consulta, ya que sería comprobar un montón de filas para encontrar el resultado.
sesach : ( 3959 * acos( cos( radians(''.$_REQUEST[''latitude''].'') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(''.$_REQUEST[''longitude''].'') ) + sin( radians(''.$_REQUEST[''latitude''].'') ) * sin( radians( latitude ) ) ) ) <=''.$_REQUEST[''mile''];