2010-02-28 6 views
3

Disons que j'ai une table contenant une liste des villes:SELECT question

city | latitude | longitude 
--------------------------- 
XX | 34.800 | 48.550 

En supposant que j'ai un emplacement approximatif (latitude/longitude) d'un utilisateur, comment puis-je trouver la ville qui est le plus proche? C'est-à-dire, comment puis-je trouver la ville dont la latitude et la longitude sont les plus proches du lat/long de l'utilisateur?

Répondre

2

Découvrez

Creating a Store Locator with PHP, MySQL & Google Maps

la méthode de calcul présenté il est indépendant de Google Maps, vous devriez être en mesure d'obtenir l'algorithme complet à partir de là.

Il suffit de se méfier des différentes méthodes de mappage et des différentes coordonnées qui en résultent. En fonction du mappage de vos coordonnées, vous devrez peut-être modifier les paramètres de l'algorithme.

0

Google maps api a une nouvelle fonctionnalité qui ne renverse la mise en cache géo

Amusez-vous :)

More info on their wiki

+0

Les résultats de la recherche de géo inversée ne peuvent pas être enregistrés dans la base de données conformément à l'accord Google Maps. C'est pourquoi je préfère une autre solution. – NNN

0

Vous pouvez utiliser le geospatial extensions for MySQL ou

La formule ci-dessous se trouve la distance en milles marins entre deux points.

3600 * ACOS (sin (latitude2_rads) * sin (latitude1_rads) + cos (latitude2_rads) * cos (latitude1_rads) * cos (longitude1_rads - longitude2_rads))

Vous pouvez connecter cela en une sélection comme suit (ci-après -7 est la latitude nécessaire et -14 est le nécessaire LON)

Si l'on suppose que les champs de latitude/longitude sont en degrés:

select * FROM NDB as c1 
order by acos(sin(radians(-7)) 
      * sin(radians(latitude)) + cos(radians(-7)) 
      * cos(radians(latitude)) 
      * cos(radians(longitude) - radians(-14))) 
limit 0,1 

Cela ne peut pas être très efficace avec de grands ensembles de données, je l'ai juste couru contre une table avec 22 706 enregistrements et il a fallu 0,163 secondes.

Si la performance est un problème, il peut être préférable de pré-calculer la distance de tous les points à partir d'une donnée fixe, puis de l'utiliser au lieu de le calculer dans le SQL.