2011-01-14 6 views
20

Bevor für bestimmte Code-Beispiele zu fragen, ich wollte nur fragen, ob es möglich ist, eine Abfrage so etwas wie dieser Pseudo-Code zu machen:Querying in Längen- und Breitengraden in MySQL

Elemente auswählen aus der Tabelle, wo lat/lon = - innerhalb von x Meilen von einem bestimmten Breitengrad/lon Punkt

Ist das machbar? Oder muss ich durch ein paar Reifen springen? Alle guten Ansätze, die empfohlen werden könnten, wären großartig!

Antwort

49

Sie sollten für die Haversine Formel suchen, aber ein guter Anfang könnte sein:

von der ersten URL Unter Berufung :

Hier ist die SQL-Anweisung, die die nächsten 20 Orte finden wird, die in einem sind Radius von 25 Meilen zu der 37, -122 Koordinate. Er berechnet die Entfernung basierend auf dem Breiten-/Längengrad dieser Zeile und der Zielbreite/-länge und fragt dann nur nach Zeilen, bei denen der Abstandswert kleiner als 25 ist, sortiert die gesamte Abfrage nach Entfernung und begrenzt sie auf 20 Ergebnisse. entweder SpatiaLite oder PostGIS für diese Art von Betrieb von Kilometern statt Meilen zu suchen, ersetzen Sie 3959 mit 6371.

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; 
+0

Vielen Dank für Ihren Vorschlag. Ich habe gerade eine neue Frage hier gepostet: http://StackOverflow.com/Questions/4697624/Querying-for-things-near-a-geolocation – Genadinik

+2

Dies ergibt keine berechnete Entfernung für mich, nur 'NULL' die ganze Zeit . –

+0

Ergebnisse werden nicht am exakten Punkt zurückgegeben. Diese Ergebnisse liefern die Entfernung als NULL, die nicht mit der Klausel having funktioniert. – Maykonn

5

würde ich sehr empfehlen. Sie haben die Art von Funktionen eingebaut, die Sie codieren wollen. Sie haben auch eine angemessene Unterstützung für räumliche Daten, die in MySQL nicht wirklich existieren.

Nicht genau eine Lösung in MySQL, aber eine bessere Lösung, wenn Sie auch in Zukunft räumliche Anfragen durchführen möchten.