2011-01-15 12 views
6

Ich habe eine Abfrage, die versucht, Dinge in einem bestimmten Geolocation zu finden, aber die Ergebnisse, die es bringt, sind ein bisschen ... seltsam.Fragen nach Dingen in der Nähe eines Geolocation?

Ich hatte diesen Thread zuvor gepostet und die Community half mir, eine Formel zu finden, die ich brauchte: Querying within longitude and latitude in MySQL, aber die Abfrage gibt jetzt wirklich verrückte Ergebnisse.

Meine Daten die Stadt San Francisco umgibt, die lat hat/lng 37.780182 , -122.517349

Abfrage:

SELECT 
    id, 
    hike_title, 
    lat, 
    lng, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(37.780182)) 
        + sin(radians(-122.517349)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    my_awesome_table 
HAVING 
    distance < 10000 
ORDER BY 
    distance 
LIMIT 
    0 , 50 

So wie Sie sehen - auch wenn ich 10000 machen Radius noch doesn‘ t viel zu finden, also frage ich mich, ob meine Anfrage aus ist. Einige der Ergebnisse, die es zurückbringt, haben sogar 0,0 für lat/lng, was meine Art zu bezeichnen bedeutet, dass es für diese Aufzeichnung kein lat/lng gibt.

Hier ist, wie die Formel aussehen soll:

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; 

Vielen Dank und sorry für die schmerzlich lange Frage! Übrigens benutze ich MySQL.


Hmmm,

ich mit der genauen Abfrage Sie gab gerade versucht, und es hat funktioniert mit 50% Genauigkeit. Hier ist ein Beispiel des Datensatzes:

lat   lng  
| 37.223465 | -122.090363 | 
| 39.320980 | -111.093735 | 
| 38.031715 | -84.495132 | 
| 37.787144 | -122.493263 | 
| 52.975361 | -1.458620 | 
| 40.848557 | -111.906883 | 
| 40.572498 | -111.859718 | 

So, jetzt die Abfrage alle Elemente zurück, die viele Meilen entfernt waren, aber nicht die Gegenstände, die unter 100 Meilen entfernt waren. Wie dieser Artikel (37.787144, -122.493263) wurde nie zurückgegeben, obwohl es nur etwa 50 Meilen vom Ausgangspunkt entfernt ist. Würdest du zufällig wissen warum?

+3

Warum sind Sie nicht Räumliche Erweiterungen von MySQL verwenden, die Funktionen für diese Art von Sachen zur Verfügung stellen? http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html –

+1

Lesen Sie einfach einige der Themen dort. Nicht sicher, ich verstehe es noch zu gut, aber möglicherweise scheint für meine Bedürfnisse zu übertreiben. Macht es die Abfrage viel schneller? Denkst du, es ist eine viel bessere Lösung als die, die wir in diesem Thread diskutieren? Vielen Dank! – Genadinik

Antwort

12

Ich denke, man die Breite umgekehrt (37,780182) und Länge (-122,517349) Ihrer zentralen Punkt, versuchen:

select 
    id, 
    hike_title, 
    lat, 
    lng, 
    (3959 * acos( cos(radians(37)) 
        * cos(radians(lat)) 
        * cos(radians(lng) - radians(-122.517349)) 
        + sin(radians(37.780182)) * sin(radians(lat)) 
       ) 
    ) AS distance 
FROM 
    my_awesome_table 
HAVING 
    distance < 10000 
ORDER BY 
    distance 
LIMIT 
    0 , 50 
+0

Wie rechnet man "Entfernung" in Meter um? –

Verwandte Themen