AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Nahste Koordinate über SQL suchen

Nahste Koordinate über SQL suchen

Ein Thema von Hobbycoder · begonnen am 29. Jul 2020 · letzter Beitrag vom 30. Jul 2020
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
928 Beiträge
 
#1

Nahste Koordinate über SQL suchen

  Alt 29. Jul 2020, 19:23
Datenbank: MySQL • Version: 5.7 • Zugriff über: Zeos
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (29. Jul 2020 um 19:26 Uhr)
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
370 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Nahste Koordinate über SQL suchen

  Alt 29. Jul 2020, 19:29
In der Opengeodb ist eine Umkreissuche beschrieben, das sollte ausreichend sein, um Dein Problem zu lösen:
http://opengeodb.org/wiki/OpenGeoDB_-_Umkreissuche
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#3

AW: Nahste Koordinate über SQL suchen

  Alt 29. Jul 2020, 19:41
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#4

AW: Nahste Koordinate über SQL suchen

  Alt 29. Jul 2020, 20:52
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?

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (29. Jul 2020 um 23:35 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.010 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Nahste Koordinate über SQL suchen

  Alt 29. Jul 2020, 23:30
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
928 Beiträge
 
#6

AW: Nahste Koordinate über SQL suchen

  Alt 30. Jul 2020, 10:37
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#7

AW: Nahste Koordinate über SQL suchen

  Alt 30. Jul 2020, 16:18
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).

d := sqrt(pow(lat1-lat2, 2) + pow((lon1-lon2) * 0.66, 2)); // ich hoffe es ist an der richtigen Stelle drin
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Jul 2020 um 16:20 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:25 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