suche über PLZ/Umkreis

lifehunter

Erfahrenes Mitglied
Ich habe gesucht aber nichts richtiges gefunden.
Ich möchte bei mir eine Suchfunktion einbauen mit der man Leute über die PLZ suchen kann. Einfach nur über PLZ ist einfach, ich will aber das im Umkreis den man angeben kann (5/20/50/100/175/250km) in dem geuscht werden soll.
Wie muss das programmiert werden?
Ich habe gesehen das man es irgendwie so gemacht kann das jede PLZ in dem Umkreis einzeln abgefragt wird. Aber das geht auch einfacher oder?
Wenn jemand weiß wies geht wäre es super wenn hier ma so ne kleine Beschreibung reingeposted werden wird ;)

MfG
 
Du musst natürlich wissen, an welchen geographischen Koordinaten die einzelnen Postleitzahlen stehen. Dazu gibt es zum Beispiel die OpenGeoDB.

Dann musst Du die Entfernung berechnen und mit der vorgegebenen Distanz vergleichen.
Dazu kannst Du Dir mal diesen Thread durchlesen.
Das ist jedoch ziemlich rechenzeitaufwändig.
Du könntest Dir mit so einer Funktion auch eine Entfernungsmatrix berechnen und das Ergebnis cachen.
Evtl. sind die Entfernungen sogar über die OpenGeoDB effizienter zu ermitteln.

Gruß hpvw
 
Hi Leutz,

Ich hab jetzt bald das ganze Forum nach diesem Thema durchsucht und der Vorschlag mit der Entfernungsmatrix scheint mir bis jetzt der erste elegante Ansatz zu sein.
Die meisten Beiträge zu dem Thema schweifen irgendwie von der Umkreissuche ab und laufen im Endeffekt auf die Distanzberechnung zwischen zwei Orten hinaus. :suspekt:

Ich benutze auch die OpenGeoDB und das mit der Entfernungsberechnung haut auch schon hin, aber wie bekomm ich die Liste mit den Datentuppeln die im Umkreis liegen.
Bisher habe ich noch keinen wirklich konkreten Lösungsvorschlag gefunden.
Könntest du deine Idee vielleicht etwas genauer Ausführen?

Vielen Dank schon mal

PS: Damit mir keine Klagen kommen, ich benutze MS SQLServer2000 als DBMS :-)
 
Zuletzt bearbeitet:
Wie angedeutet, erhältst Du so eine Liste mit irgendeiner Art von Caching-Mechanismus.
Wenn sich ein neuer User mit PLZ anmeldet, wirst Du wohl oder übel die Distanz zu allen anderen Usern berechnen müssen und kannst diese in einer Tabelle mit drei Feldern (User1, User2, Distanz) ablegen.
Wenn Du sehr viele User hast, kann das Anlegen eines neuen auf diese Weise natürlich unglaublich lange dauern.
Eine weitere Möglichkeit wäre, dass Du ein Raster über die Karte legst, zum Beispiel alle 50km entsprechend der Geokoordinaten zu der Postleitzahl. In einer Tabelle (PLZ, GeoLat, GeoLon, RasterX,RasterY) ordnest Du jede PLZ in einen Quadranten ein. Wenn Du nun eine Umkreissuche machst, suchst Du zunächst nur die PLZ heraus, die nach dem Raster überhaupt in Frage kommen. Damit hättest Du schon eine verhältnismäßig geringe Zahl von Postleitzahlen, zu denen Du die exakte Entfernung bestimmen mußt. Diese kannst Du dann live berechnen und ggf. zusätzlich cachen.

Vielleicht helfen Dir diese Anregungen ja weiter.

Gruß hpvw
 
Hi Leutz,

Der Vorschlag ist ganz gut. Allerdings brauche ich keine Abfrage nach Usern sondern nur die Orte im Umkreis. Ich verwende auch keine Map sondern brauch nur die Einträge aus der DB. Quasi genau das was hier angeboten wird.
Nach deinem ersten Vorschlag müsste ich danach eine Tabelle mit (Ort1, Ort2, Entfernung) aufbauen, was allerdings (wie du schon erwähnt hast) nicht praktikabel ist, da die OpenGeoDB bereits fast 18000 Einträge hat!
Hab mir auch schon überlegt so eine Art Vorselektion bzw. Rasterung durchzuführen z.B. nur im selben Bundesland+benachbarte Bundesländer suchen (ich weiß, das ist nicht gerade der Weisheit letzter Schluß) was ja schon mal eine Entlastung bringen würde. Ich denk da find ich schon noch eine gute Lösung.
Allerdings habe ich auch beim Rastern das Problem: was mach ich mit Orten, die nahe am Rand des Rasters liegen? Dann muss ich auch wieder die "Nachbarn" miteinbeziehen oder hab ich dich falsch verstanden?
Kannst du mir das mit dem Caching-Mechanismus noch erklären? Hab noch nicht so viel praktische Erfahrungen mit DBs und bin dementsprchend etwas :confused:

Grüße
 
Du hast recht, wenn Du ein 50km-Raster hast und Orte im Umkreis von 50 Kilometern suchst, mußt Du auch benachbarte berücksichtigen. Angenommen, Dein Ort (Ort 0) liegt im Quadranten 3/4, dann musst Du mit den Orten aus den Quadranten 2/3, 3/3, 4/3, 2/4, 4/4, 2/5, 3/5 und 4/5 prüfen. Die Orte aus 3/4 kannst Du direkt übernehmen, wenn Du in Kauf nimmst, dass von der Ecke des Quadranten zur gegenüberliegenden Ecke etwas mehr als 50km liegen.

Nun hast Du eine Liste mit zu prüfenden Orten, nehmen wir Ort 1, Ort 2 und Ort 3.

Aus der angesprochen Cache-Tabelle holst Du Dir die Distanz zu den Ortepaaren Ort 0/Ort 1, Ort 0/Ort 2, Ort 0/Ort 3, vorrausgesetzt, es gibt sie schon und vergleichst sie mit dem gegebenen Umkreis. Die Ortepaare, die Du nicht aus der Tabelle holen konntest, berechnest Du und schreibst sie in die Tabelle.

Gruß hpvw
 
Was mir noch einfällt: Du musst gar kein Raster bilden, Du kannst die zu prüfenden Orte auch wie folgt ermitteln (in Kürze, weil ich gleich weg muss):
Code:
latMin=Ort0Lat - 50km;
latMax=Ort0Lat + 50km;
lonMin=Ort0Lon - 50km;
lonMax=Ort0Lon + 50km;

SELECT Lat,Lon,PLZ 
FROM Orte 
WHERE Lat>latMin
  AND Lat<latMax
  AND Lon>lonMin
  AND Lon<lonMax
Was dann zu tun ist (Distanz bererchnen und cachen) bleibt wie oben.

Gruß hpvw
 
Zurück