Entfernungsmessung Geodaten SQL

Ronald Nickel

Legendäres Mitglied
Hallo
mal davon ausgehend es werden in einer datenbank zu jedem Kunden die entsprechenden Geodaten hinzugefügt - ist es da möglich eine SQL-Abfrage zu stellen, die mittels meines Standortes (ebenfals geodaten) beispielsweise alle Kunden ausgibt, die innerhalb eines Umkreises von 100 Km Luftlinie befinden?

Sinngemäß:

select * from kunden
where (geodatenformel .-*----) <= 100

Gruß Ronny
 
Im Wiki der OpenGeoDB gibt es einen Artikel dazu:

http://opengeodb.giswiki.org/wiki/OpenGeoD...kreis_ermitteln

Die Formel:

CODE
arccos(sin(B_lat)*sin(A_lat)+cos(B_lat)*cos(A_lat)*cos(B_lon - A_lon)) * Erdradius



B_lat, A_lat, A_lon, B_lon sind die Geokoordinaten

Das Ganze ist performanter, als man zunächst annimmt. Ich hatte damit noch keine Perfomance-Probleme...allerdings auch nicht allzu viel Last.

Viele Grüße
Oli
 
Danke erst mal

ist es wirklich um so viel performanten wenn man wie in dem Link beschrieben eine extra tabelle anlegt die alle PLZ erntfernungen errechnet und dort ablegt?

Diese beispiel-Tabelle Distance müsste dann aus aus den (Int) Feldern
(int)PLZ_a_id, (Int)PLZ_b_id und (double)distance bestehen

Die abfrage für alle PLZ ineerhalb von 1ßß km wäre dann

select * from tbl_distance
where plz_id = myPlz and distance <= 100

Ist der Gedankenansatz richtig?

 
Oh, habe Deinen Gedankengang nicht ganz nachvollziehen können. Nein, wenn Du die Daten in einer folgenden Tabellenaufbau speicherst:

PLZ_a_id, PLZ_b_id, distance


So müsste die Abfrage wie folgt lauten:

CODE SELECT * FROM tbl_distance WHERE (PLZ_a_id = myPlz OR PLZ_b_id = myPlz) AND distance <= 100;


Weil Du würdest ein Primärschlüssel, bzw. besser ein Unique, auf die beiden Felder PLZ_a_id und PLZ_b_id legen, damit kein Eintrag doppelt gespeichert werden kann, und die Befüllung müsste immer so sein, dass erst die kleinere PLZ und dann die größere reingeschrieben wird. Wäre ja unsinnig, wenn er einige Sachen doppelt speichert:

PLZ1, PLZ2, Distance1
PLZ2, PLZ1, Distance1


Natürlich sollte auch die Konstelation nicht passieren, aber bei der richtigen Abfrage, sollte dies auch nicht der fall sein:

PLZ1, PLZ1, Distance
 
QUOTE (Oliver Pester @ Mo 11.04.2011, 13:43)Im Wiki der OpenGeoDB gibt es einen Artikel dazu:

http://opengeodb.giswiki.org/wiki/OpenGeoD...kreis_ermitteln

Die Formel:


CODE
arccos(sin(B_lat)*sin(A_lat)+cos(B_lat)*cos(A_lat)*cos(B_lon - A_lon)) * Erdradius



Die Formel ist so 'suboptimal'.

Ich nutze das seit Jahren so, daß ich bsp. zu jedem Firmeneintrag nicht nur Latitude / Longitude ablege, sondern zusätzlich Radians(Latitude) und Radians(Longitude).


Damit fallen diverse redundante Berechnungen raus.

Das geht auch bei mehreren tausend Datensätzen problemlos. Wahrscheinlich hängt das aber vom eingesetzten Datenbank-Backend ab, so daß man einfach testen muß, ob das direkt geht oder ob man alle Kombinationen speichert.

Das Problem bei den Kombinationen ist simpel: Bei 5000 PLZ sind das (grob) 5000 * 5000 / 2 = 12500000 Datensätze, also 12,5 Millionen. Da ich bsp. aktuell schon Datenbanken mit mehr als 6000 verschiedenen PLZ habe, würde das immense Datenmengen produzieren.
 
Gibt es den einen einigermaßen nachvollziehbaren Workarround für eine db gestützte Umkreissuche? Ich meinn Umkrissuchen scheinen ja insbersonderen bei Communities ja einstandardfeature zu sein.

Gruß Ronny

 
Zurück
Oben