J'ai la latitude et la longitude et je veux extraire l'enregistrement de la base de données, qui a la latitude et la longitude les plus proches en fonction de la distance, si cette distance est plus longue que celle spécifiée, ne la récupérez pas.
Structure de la table:
id
latitude
longitude
place name
city
country
state
zip
sealevel
mysql
sql
coordinates
geospatial
Basit
la source
la source
Réponses:
où [starlat] et [startlng] est la position où commencer à mesurer la distance.
la source
La solution de Google:
Créer la table
Lorsque vous créez la table MySQL, vous souhaitez porter une attention particulière aux attributs lat et lng. Avec les capacités de zoom actuelles de Google Maps, vous ne devriez avoir besoin que de 6 chiffres de précision après la décimale. Pour conserver au minimum l'espace de stockage requis pour votre table, vous pouvez spécifier que les attributs lat et lng sont des flottants de taille (10,6). Cela permettra aux champs de stocker 6 chiffres après la décimale, plus jusqu'à 4 chiffres avant la décimale, par exemple -123,456789 degrés. Votre table doit également avoir un attribut id pour servir de clé primaire.
Remplir la table
Après avoir créé la table, il est temps de la remplir avec des données. Les exemples de données ci-dessous concernent environ 180 pizzarias disséminées aux États-Unis. Dans phpMyAdmin, vous pouvez utiliser l'onglet IMPORT pour importer divers formats de fichiers, y compris CSV (valeurs séparées par des virgules). Les feuilles de calcul Microsoft Excel et Google sont toutes deux exportées au format CSV, ce qui vous permet de transférer facilement des données de feuilles de calcul vers des tables MySQL via l'exportation / l'importation de fichiers CSV.
Recherche d'emplacements avec MySQL
Pour rechercher des emplacements dans votre table de marqueurs qui se trouvent à une certaine distance de rayon d'une latitude / longitude donnée, vous pouvez utiliser une instruction SELECT basée sur la formule Haversine. La formule Haversine est généralement utilisée pour calculer les distances des grands cercles entre deux paires de coordonnées sur une sphère. Une explication mathématique approfondie est donnée par Wikipedia et une bonne discussion de la formule en ce qui concerne la programmation est sur le site de Movable Type.
Voici l'instruction SQL qui trouvera les 20 emplacements les plus proches dans un rayon de 25 miles de la coordonnée 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 où la valeur de distance est inférieure à 25, classe la requête entière par distance et la limite à 20 résultats. Pour rechercher en kilomètres au lieu de miles, remplacez 3959 par 6371.
Celui-ci consiste à trouver des latitudes et des longitudes sur une distance inférieure à 28 milles.
Une autre consiste à les trouver à une distance comprise entre 28 et 29 miles:
https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map
la source
HAVING distance < 25
comme nous interrogeons des emplacements dans un rayon de 25 miles?Voici ma solution complète implémentée en PHP.
Cette solution utilise la formule Haversine telle que présentée dans http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL .
Il est à noter que la formule Haversine connaît des faiblesses autour des pôles. Cette réponse montre comment implémenter la formule de vincenty Great Circle Distance pour contourner ce problème , mais j'ai choisi d'utiliser simplement Haversine car c'est assez bon pour mes besoins.
Je stocke la latitude comme DECIMAL (10,8) et la longitude comme DECIMAL (11,8). Espérons que cela aide!
showClosest.php
./assets/db/db.php
./assets/db/dbSettings.php
Il peut être possible d'augmenter les performances en utilisant une procédure stockée MySQL comme suggéré par l'article "Geo-Distance-Search-with-MySQL" posté ci-dessus.
J'ai une base de données d'environ 17 000 emplacements et le temps d'exécution de la requête est de 0,054 seconde.
la source
abs
devraient être supprimés. Il n'est pas nécessaire de prendre la valeur abs lors de la conversion des degrés en radians et, même si vous l'avez fait, vous le faites sous une seule des latitudes. Veuillez le modifier pour qu'il corrige le bogue.69
par111,044736
(j'ai oublié cela dans le commentaire ci-dessus)Juste au cas où vous êtes paresseux comme moi, voici une solution amalgamée à partir de ceci et d'autres réponses sur SO.
la source
bounding_distance
représente exactement ? cette valeur limite-t-elle les résultats à un montant en mille? donc dans ce cas, il renverra des résultats dans un délai de 1 mile?Facile ;)
Remplacez simplement les coordonnées par vos coordonnées. Les valeurs doivent être stockées en double. Ceci est un exemple fonctionnel de MySQL 5.x.
À votre santé
la source
dx+dy
Essayez ceci, il affiche les points les plus proches des coordonnées fournies (à moins de 50 km). Cela fonctionne parfaitement:
Changez simplement
<table_name>
.<userLat>
et<userLon>
Vous pouvez en savoir plus sur cette solution ici: http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
la source
Les réponses originales à la question sont bonnes, mais les nouvelles versions de mysql (MySQL 5.7.6 on) prennent en charge les requêtes géographiques, vous pouvez donc maintenant utiliser les fonctionnalités intégrées plutôt que de faire des requêtes complexes.
Vous pouvez maintenant faire quelque chose comme:
Les résultats sont renvoyés au format
meters
. Donc, si vous voulezKM
simplement utiliser à la.001
place de.000621371192
(ce qui est pour des miles).Les documents MySql sont ici
la source
ST_Distance_Sphere
n'existe pas dans install (mysql Ver 15.1 Distrib 10.2.23-MariaDB
) de mon hôte . J'ai lu quelque part pour remplacer,ST_Distance
mais les distances sont loin.ST_Distance_Sphere
Vous recherchez des choses comme la formule haversine . Voir aussi ici .
Il y en a d'autres mais c'est le plus souvent cité.
Si vous recherchez quelque chose d'encore plus robuste, vous voudrez peut-être examiner les capacités SIG de vos bases de données. Ils sont capables de certaines choses intéressantes comme vous dire si un point (ville) apparaît dans un polygone donné (région, pays, continent).
la source
Vérifiez ce code basé sur l'article Geo-Distance-Search-with-MySQL :
Exemple: trouvez les 10 hôtels les plus proches de ma position actuelle dans un rayon de 10 miles:
la source
la source
Il semble que vous vouliez faire une recherche de voisin le plus proche avec une limite sur la distance. SQL ne prend en charge rien de tel pour autant que je sache et vous auriez besoin d'utiliser une structure de données alternative telle qu'un R-tree ou kd-tree .
la source
Trouver les utilisateurs les plus proches de mon:
Distance en mètres
Basé sur la formule de Vincenty
J'ai la table des utilisateurs:
sql:
rayon de la terre: 6371000 (en mètres)
la source
MS SQL Edition ici:
la source
On dirait que vous devriez simplement utiliser PostGIS, SpatialLite, SQLServer2008 ou Oracle Spatial. Ils peuvent tous répondre à cette question pour vous avec le SQL spatial.
la source
Dans les cas extrêmes, cette approche échoue, mais pour les performances, j'ai sauté la trigonométrie et calculé simplement la diagonale au carré.
la source
Ce problème n'est pas très difficile du tout, mais il devient plus compliqué si vous devez l'optimiser.
Ce que je veux dire, c'est, avez-vous 100 emplacements dans votre base de données ou 100 millions? Ça fait une grande différence.
Si le nombre d'emplacements est petit, extrayez-les de SQL et insérez-les dans le code en faisant simplement ->
Une fois que vous les avez introduits dans le code, calculez la distance entre chaque latitude / longitude et votre original avec la formule Haversine et triez-la.
la source