Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Nahste Koordinate über SQL suchen (https://www.delphipraxis.net/205080-nahste-koordinate-ueber-sql-suchen.html)

Hobbycoder 29. Jul 2020 18:23

Datenbank: MySQL • Version: 5.7 • Zugriff über: Zeos

Nahste Koordinate über SQL suchen
 
Hi,

ich habe eine Tabelle mit Koordinaten (Latitude und Longitude in separaten Feldern). Jetzt möchte per SQL den Datensatz abfragen, der an nahsten zu einer angegebenen Koordinate liegt.
Noch schöner wäre es natürlich z.B. die 5 nahsten zu finden, aber ich wäre auch erst mal mit 1 zufrieden.
Wie könnte man sowas unter SQL realieren?

Mein erste Ansatz ist folgendermaßen:
Code:
SELECT 53-lat as DiffLat, 10-lon as DiffLon, ABS((53 - lat) * (10 - lon)), lat, lon, id, FROM CPoints order by ABS((53 - lat) * (10 - lon));
In dem Beispiel wird als gesuchte Koordinate 53 Lat und 10 Lon angenommen.

Ich multipliziere die Differenz der Latitude zu meiner gesuchten Latitude mit der Longitude der gesuchten Longitude, und nehme davon die Erste.
Das sieht zwar auf den ersten Blick recht gut aus, bringt mir aber nicht, da dann alle die sehr genau an der Latitude oder Longitude liegen möglicher oben in der Ergebnisliste, aber trotzdem weiter von der gesuchten Koordinate entfernt als welche die weiter unten in der Liste stehen. So würde wenn die Latitude genau mit der gesuchten Latitude übereinstimmt mit 0 multipliziert, und würde somit ganz oben in der Liste herauskommen, obwohl der Punkt vielleicht mit seiner Longitude hunderte Kilometer weit weg wäre.

stifflersmom 29. Jul 2020 18:29

AW: Nahste Koordinate über SQL suchen
 
In der Opengeodb ist eine Umkreissuche beschrieben, das sollte ausreichend sein, um Dein Problem zu lösen:
http://opengeodb.org/wiki/OpenGeoDB_-_Umkreissuche

brechi 29. Jul 2020 18:41

AW: Nahste Koordinate über SQL suchen
 
Abs(lat-53) +Abs(Lon-10)

Abstand zwischen zwei Punkten (eigentlich mit sqr, sqrt), order by, limit 5

Bei PostgreSQL mit Post GIS gibt es die Funktion st_distance

himitsu 29. Jul 2020 19:52

AW: Nahste Koordinate über SQL suchen
 
Auf einem "kleinen begrenzten" Gebiet mag es gehen, dass man die Grade über eine Ellipse in eine "ungefähre" Entfernung umrechnet,
aber ist das ja eigentlich garnicht möglich, da die Erde doch eine Kugel ist (und das nichtmal richtig rund) und 1° am Äquator anders lang sind, also in der Nähe der Pole? :gruebel:

https://www.opendem.info/arc2meters.html
https://www.movable-type.co.uk/scripts/latlong.html


Aber ja, für einen halbwegs guten Distanzvergleich sollte es ausreichen,
auch wenn man hier je nach Latitude für die Longitude einen Umrechnungsfaktor in die Ellipse einrechnen könnte, falls die Differenz zu groß ist.

Redeemer 29. Jul 2020 22:30

AW: Nahste Koordinate über SQL suchen
 
Multiplikation ist hier komplett falsch, denn die Multiplikation der Koordinaten-Differenzen ist keine Metrik, da sie die Dreiecksungleichung nicht erfüllt.
Beispiel: Seien x, y und z Punkte, paarweise verschieden und nicht kollinear. Sei z auf dem Längengrad von x und auf dem Breitengrad von y. Damit ist der Abstand nach deiner Formel zwischen z und beiden Punkten jeweils 0 und der Abstand zwischen den beiden Punkten größer als 0. Das ist ein Widerspruch zur Dreiecksungleichung, die besagte, dass die direkte Verbindung zwischen zwei Punkten (hier x und y) nicht länger sein darf als jeder andere Weg (hier über z). Daher sagt bereits die Mathematik, dass das mit der Formel nie und nimmer klappen kann.

Korrekterweise musst du die Länge der Orthodrome zwischen zwei Punkten berechnen. Formel steht auf Wikipedia.

Hobbycoder 30. Jul 2020 09:37

AW: Nahste Koordinate über SQL suchen
 
Vielen Dank für eure Unterstützung.

Ich bin da völlig falsch dran gegangen. Da es sich um eine relativ kleine Fläche handelt (ca. 100 * 100 km) kann ich die Erdkrümmung vernachlässigen. Ich denke die Berechnung über 2-Dimensionen mit Pythagoras d=sqrt(pow(lat1-lat2, 2) + pow(lon1-lon2, 2)) reicht hier aus.

himitsu 30. Jul 2020 15:18

AW: Nahste Koordinate über SQL suchen
 
Wie gesagt, ein winziger Umrechnungsfaktor, Anpassung der Ellipse, sollte noch mit rein.

Kann man sich bestimmt für die Mitte seines Bereichs genau ausrechnen,
aber so für Deutschland kannst etwa 2/3 nehmen.

Das sind ja fast Quadrate, aber in der Breite 3° und in der Höhe 2°.
https://www.mapsofworld.com/lat_long...-lat-long.html
Bielefeld-Magdeburg (3° Lon) müsste fast so weit sein, wie Bielefeld-Mainz (2° Lat).

Delphi-Quellcode:
d := sqrt(pow(lat1-lat2, 2) + pow((lon1-lon2) * 0.66, 2)); // ich hoffe es ist an der richtigen Stelle drin


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz