Je veux trouver un emplacement le plus proche de la table de base de données suivante
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
J'ai récupéré toutes ces données de google maps. Ici, je dois trouver l'emplacement le plus proche d'un endroit. Supposons que je sois à la place Surkhet, sa latitude est de 28,6 et sa longitude de 81,6, comment puis-je trouver l'endroit le plus proche de la place 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;
Ceci est la meilleure requête
Recherche de lieux à proximité avec MySQL
Voici l'instruction SQL qui trouvera les 20 emplacements les plus proches dans un rayon de 25 miles par rapport aux coordonnées 37, -122. Il calcule la distance en fonction de la latitude/longitude de cette ligne et de la latitude/longitude cible, puis demande uniquement les lignes dont la valeur de distance est inférieure à 25, ordonne la requête entière par distance et la limite à 20 résultats. Pour rechercher par kilomètres au lieu de miles, remplacez 3959 par 6371.
Structure de la table:
id,name,address,lat,lng
NOTE - Ici latitude = 37 & longitude = -122. Vous passez donc le vôtre.
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;
Vous pouvez trouver des détails ici .
Pour trouver l'emplacement à proximité, vous pouvez utiliser la classe Géocoder . Puisque vous avez les Géopoints (latitude et longitude), le géocodage inversé peut être utilisé. Le géocodage inversé est le processus de transformation d'une coordonnée (latitude, longitude) en une adresse (partielle). Consultez this pour plus d'informations.
Le SQL a un problème. Dans le tableau comme:
`ubicacion` (
`id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT ,
`latitud` DOUBLE NOT NULL ,
`longitud` DOUBLE NOT NULL ,
PRIMARY KEY (`id_ubicacion`) )
Le changement d'id_ubicacion lors de l'utilisation:
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
Lorsque la méthode doit fonctionner, il est préférable de filtrer d'abord la latitude et la longitude, puis de calculer approximativement la distance au carré. Pour les pays nordiques, ce sera environ 0,3% de réduction dans un rayon de 1000 km.
Donc au lieu de calculer la distance comme:
dist_Sphere = r_earth * acos ( sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1)
on peut calculer la valeur approximative (supposons que lat = lat 1 est proche de lat 2) comme
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)
Triez par Dist_App 2, puis retirez simplement la racine carrée du résultat.
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;
où [starlat] et [startlng] est la position où commencer à mesurer la distance et 25 est la distance en km.
Il est conseillé de créer une procédure stockée pour utiliser la requête, car ce serait vérifier un grand nombre de lignes pour trouver le résultat.
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'];