2010-07-08 4 views
0

J'essaie de stocker une base de données d'emplacements GPS et d'exécuter des requêtes qui trouvent les points dans un rayon donné et aussi les points les plus proches. J'utilise mysql et j'ai regardé les extensions spatiales. Je ne suis pas sûr si je vois comment utiliser réellement les extensions spatiales pour faire ce que je recherche dans les requêtes de rayon d'emplacement.Procédure de base de données pour les emplacements

Voici donc ce que im penser à mes options:

  1. stocker les coordonnées GPS de latitude et tant que variables indexées float dans la db. Lorsque j'obtiens un point de coordonnées GPS et une plage, calculez les valeurs max et min lat et long à rechercher et ensuite trier en fonction d'une fonction de distance à l'intérieur de ceux-ci à commander.

  2. Utilisez l'extension spatiale. Je ne suis pas très sûr que cela fonctionnera. La fonction Distance() n'est pas implémentée. L'utilisation d'un index spatial nécessite de trouver une boîte englobante (faisable) et d'appeler la fonction de boîte englobante MBRContains pour trouver les points qui sont dans cette boîte englobante. Cependant, un point a une limite de zéro, donc la fonction MBRContains ne fonctionne pas sur les points.

Je ne suis pas sûr de ce que la méthode standard pour le faire est (il ne semble pas comme il y a un) et apprécierait des mots d'expérience/pensées/aide à la décision. J'utilise actuellement mysql 5.13 et suis assez sûr que même 5.5 n'a pas la métrique de distance.

Aussi - même si 2. fonctionne, lequel sera le plus rapide? S'il vous plaît laissez-moi savoir quelles sont vos pensées et surtout si vous êtes sûr/ont vu quelque chose de travail pour les recherches rapides et grandes!

Mysql Index Spatial: http://dev.mysql.com/doc/refman/5.5/en/using-a-spatial-index.html

+0

Vous n'avez pas besoin d'espace pour les recherches lat/longues, juste quelques trigs de base. http://code.google.com/apis/maps/articles/phpsqlsearch.html est une aide précieuse pour le découvrir. – tadamson

+0

cela va-t-il être assez rapide pour gérer quelques millions? –

+0

Vous pouvez filtrer la majorité des points avec un WHERE MyLon BBoxLonMin ET MyLat BBoxLatMin Après que vous êtes à une petite minorité d'enregistrements, alors cherchez à obtenir une distance réelle. – geographika

Répondre

1

Quelque chose comme cela devrait fonctionner pour obtenir la distance entre une coordonnée et un point arbitraire, dans cet exemple « origine ».

SELECT 
place.name, 
place.foo, 
ROUND(SQRT(
    POW((69.1 * ({$origin->lat} - place.lat)), 2) 
+ POW((53.0 * ({$origin->lon} - place.lon)), 2) 
), 1) AS distance 
FROM place 
ORDER BY distance ASC 

espoir qui aide ...

0

Comment sont rapprochées les coordonnées GPS? Si elles sont relativement proches de sorte que la courbure de la Terre n'est pas un problème, vous pouvez d'abord tenter une requête en utilisant une distance linéaire vous-même pour voir comment cela fonctionne. Cependant, cela nécessite un balayage de table complet et peut ne pas produire des résultats précis si les points ne sont pas suffisamment groupés. À ce moment-là, vous devez passer à une boîte englobante + calcul de la distance d'arc.

+0

les lieux seront dans un rayon de 100 ft - 10 miles –

Questions connexes