MYSQL - PHP -> Select ... ORDER BY nähe zu Koordinaten
mapper
- datenbank
0 Frank (no reg)0 dave
Hallo,
kurz zur Einführung ich habe eine Datenbank mit Adressen und Koordinaten. Nun gebe ich den derzeitigen Standort (in Koordinaten) an und es wird eine Liste ausgegeben mit den Adressen die in der Nähe liegen.
Hierfür setze ich auf den Längen bzw. Breitengrad einen plus und minuswert und nehme alle Koordinaten die dazwischen liegen
Der entsprechende Befehl sieht wie folgend aus:
SELECT * FROM adressdaten WHERE laengengrad BETWEEN $laengengradminus AND $laengengradplus AND breitengrad BETWEEN $breitengradminus AND $breitengradplus
Nun möchte ich diese Liste sortieren (ORDER BY)lassen nach der nähe zum derzeitigen Standort.
Habt ihr da eine Idee wie ich das vielleicht schon mein Select befehl machen kann ohne es in ein Array zu packen und dann alles zu berechnen?
Danke
mapper
Hallo,
Kurze Antwort: Berechne einen (numerisch) sortierbaren Wert, welcher die Entfernung zwischen deinen beiden Koordinaten darstellt.
Lange Antwort
Du hast ja schon mal einen Referenzpunkt, den "derzeitigen Standort". Der hat Koordinaten (Längengrad und Breitengrad). Die Ergebnisse aus deiner Abfrage zeichnen sich ebenfalls durch Längengrad und Breitengrad aus. Aus beiden Punkten lässt sich ein Rechteck konstruieren. Die direkte Verbindung zwischen beiden Punkten ist eine Gerade (meistens zumindest, Spezialfälle mal aussen vorgelassen), nämlich die Diagonale in diesem Rechteck. Und die Diagonale in einem Rechteck berechnet man wie? Wurzel aus ... und so weiter. Dieses Ergebnis ist numerisch und lässt sich sortieren. :-)
Ciao, Frank
Hi,
du kannst die Distanz von den angegebenen Koordinaten zu den Koordinaten der Adresse in der Datenbank relativ leicht ausrechnen:
Die angegebenen Koordinaten: x, y;
Die Koordinaten des Datensatzes: dX, dY;
entfernung der Punkte mit Pythagoras:
Entfernung = Wurzel((dX - x)² + (dY - y)²)
Nach diesem Wert kannst du sortieren.
Da Wurzel Berechnungen soweit ich weiß allerdings sehr rechenintensiv sind empfiehlt es sich aus Performance gründen nur nach (dX - x)² + (dY - y)² zu sortieren.
Wenn man davon ausgeht das du die Entfernung nicht auch noch ausgeben willst.
Das ganze im SQL-Befehl verpackt sieht in etwa so aus:
SELECT spalten, die, geholt, werden, sollen
FROM adressdaten
WHERE laengengrad BETWEEN $laengengradminus AND $laengengradplus
AND breitengrad BETWEEN $breitengradminus AND $breitengradplus
ORDER BY (
(laengengrad - $laengengrad)² + (breitengrad - $breitengrad)²
)