2012-06-20 19 views
25

quiero encontrar un lugar más próximo desde la base de datos siguiente tabla¿Cómo encontrar la ubicación más cercana utilizando latitud y longitud desde la base de datos sql?

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 rebuscado este todos los 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.

+0

has mirado los enlaces * relacionados * a la izquierda >>> algunos de ellos miran el tema por ti. –

+2

@Dagon - Supongo que te refieres al * otro * que queda? –

+0

@Damien_The_Unbeliever um yo vivo en el hemisferio sur, nuestra izquierda está a su derecha :-) –

Respuesta

16

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;

Ésta es la mejor consulta

+0

distancia 25 aquí está en millas ?? – Sripaul

+7

Sí. 3959 - Miles, 6371 - Kilómetros –

+0

@Krishna Karki, ¿devolverá lat y lon si lo pongo en funcionamiento? –

67

Búsqueda de ubicaciones cercanas con MySQL

Aquí está la instrucción SQL que se encuentran los 20 lugares más cercanos que se encuentran dentro de un radio de 25 millas al 37, -122 coordenadas. 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 tabla:

id,name,address,lat,lng 

NOTA - Aquí latitud = 37 & 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 los detalles here.

+3

También acceda éste. Explica todo de una manera agradable. https://developers.google.com/maps/articles/phpsqlsearch – Scorpion

+0

Muchas gracias por la consulta. Tengo que encontrar la ubicación más cercana de Surkhet, cuya latitud es 28.6 y la longitud es 81.6. Cómo incluir este punto en esta consulta ... Por favor sugiérame ... :) –

+0

Ver la nota. Edité mi respuesta. Necesita pasar su lat & lng en lugar de 37 & -122, – Scorpion

3

Para encontrar la ubicación cercana, puede utilizar la clase Geocoder.Puesto que tiene los Geopoints (latitud y longitud), se puede utilizar la geocodificación inversa. Geocodificación inversa es el proceso de transformación de una coordenada (latitud, longitud) en una dirección (parcial). Consulte this para obtener más información.

0

El SQL tienen 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`)) 

El cambio id_ubicacion cuando el uso:

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 
0
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']; 
0

Cuando el método debe realizar es más agradable al primer filtro de la latitud y longitud, y luego calcular el aproximado distancia al cuadrado . Para los países nórdicos, será alrededor del 0.3 por ciento de descuento dentro de los 1000 km.

Así que 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) 

se puede calcular el valor aproximado (asumir 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) 

Ordenar por Dist_App 2 , y simplemente elimine la raíz cuadrada del resultado.

0
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 en la que para empezar a medir la distancia y 25 es la distancia en kms.

Se recomienda realizar un procedimiento almacenado para utilizar la consulta, ya que sería comprobar un montón de filas para encontrar el resultado.

Cuestiones relacionadas