2012-05-12 8 views
5

je me suis 2 tables:SQL Sélectionnez un rayon de recherche basé sur Latitude Longitude

Events: 
- id 
- name 
- place 

Places: 
- id 
- name 
- lat 
- lng 

Je voudrais récupérer tous les événements dans 10KM radius (selon le lieu lat & lng) du currentlat et lng. Comment puis je faire ça?

Merci!

+1

double possible: http://stackoverflow.com/questions/1006654/fastest-distance- lookup-given-latitude-longitude –

+0

Quelle est la précision du 10km? L'approche correcte implique une quantité de maths très lente à effectuer en SQL. Il peut être préférable de récupérer un ensemble légèrement plus grand et de le transmettre au client pour le travail final, ou d'utiliser un ensemble approximatif. –

Répondre

1

Peut-être que cela vous aide http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

Fondamentalement, le problème est que lat/lng sont coordonnées sphériques (latitude et lng sont des angles), et que vous souhaitez effectuer une recherche en utilisant une distance linéaire sur la surface sphérique. Ensuite, vous essayez de comparer deux choses différentes, je veux dire, des angles avec des kilomètres. Pour ce faire, vous devez effectuer une transformation de coordonnées, puis comparer.

0

Hope this requête simple aide

SELECT 
    * 
FROM 
    `locator` 
WHERE 
    SQRT(POW(X(`center`) - 49.843317 , 2) + POW(Y(`center`) - 24.026642, 2)) * 100 < `radius` 

détails ici http://dexxtr.com/post/83498801191/how-to-determine-point-inside-circle-using-mysql

+1

Cela ne fonctionne pas. Le problème est que les unités varient; 1 degré de latitude/longitude est un nombre de kilomètres différent en fonction de la latitude et de la longitude entrées. –

3

Si vous êtes prêt à utiliser une extension, l'extension géospatiale, MySQL 5.6 et, est destiné à répondre exactement à ce type de question. Vous devez construire un index spatial sur la table Vos adresses:

ALTER TABLE places ADD SPATIAL INDEX lat, lng 

select name from places 
order by st_distance(point(@lng, @lat), point(lng, lat)) 
limit 10 

La constatation réelle des distances réelles est un lourd de calcul de bits. Le poste suivant expose quelques-unes des méthodes que vous pouvez essayer: http://www.plumislandmedia.net/mysql/using-mysqls-geospatial-extension-location-finder/

Pour encore plus de détails, regardez http://www.percona.com/blog/2013/10/21/using-the-new-spatial-functions-in-mysql-5-6-for-geo-enabled-applications/

Questions connexes