web-dev-qa-db-fra.com

Comment trouver l'emplacement le plus proche en utilisant la latitude et la longitude de la base de données SQL?

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.

36
Krishna Karki

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

21
Krishna Karki

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 .

83
Scorpion

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.

3
Ankit Saxena

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
0
user2142645

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.

0
Jesper Kleis
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;

[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.

0
Himanshu Upadhyay
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
Nilesh Prajapati