Cruz: Umkreissuche

Beitrag lesen

Hallo Sven,

wieso haben die Leute die Angewohnheit immer etwas gleich als komplett falsch zu bezeichnen? Wenn man auf sachlicher Ebene über ein Thema diskutiert und dabei einen wirklichen Fehler im Gedankengang eines anderen entdeckt, dann ist es völlig in Ordnung dies aufzuzeigen und der Diskussionspartner sollte dafür auch dankbar sein. Aber einfach nur so "komplett falsch" reinzurufen ohne handfeste Begründung und offensichtlich ohne das Konzept des anderen in Vollständigkeit verstanden zu haben ist unhöflich und auch nur sehr wenig wissenschaftlich. Dieses Verhalten fällt mir hier im Forum an vielen Stellen auf und es hat mir wirklich den Spass genommen hier Postings zu schreiben und anderen Leuten zu helfen, daher möchte ich es an dieser Stelle deutlich kritisieren.

So und nun zum Thema.

ich kann mir auch nicht vorstellen, dass die Geoinformationen auswerten, denn das wäre eine viel zu große Datenmasse für diesen kleinen Zweck, die teuer zu beschaffen ist.

Wieso das denn?

Weil es viele Orte, sehr viele Postleitzahlen, enorm viele Strassen und unfassbar viele Hausnummern in Deutschland gibt. Um halbwegs echte Distanzen zwischen Adressen auszurechnen musst du schon Geokoordinaten auf der Straßenebene besitzen. Wenn du nur pro Postleitzahl eine Koordinate hast, dann bist du in etwa bei dem Verfahren, das ich anfangs vorgeschlagen habe. Ich erkläre gleich warum.

Sollte sich deine "wieso" Frage nicht auf die Menge, sondern auf die Kosten der Daten bezogen haben, dann habe ich dazu Folgendes zu erwidern. Es mag sein dass man eine Koordinate pro Postleitzahl von der OpenGeoDB kostenlos bekommt, aber wie gesagt befriedigt das noch nicht die Distanzen auf der Strassenebene. Ich war gerade erst vor ein paar Monaten an der entwicklung eines Navigationssystems für PDAs beteiligt. Wir haben uns gründlich nach Quellen für Geodaten umgesehen und keine Möglichkeit gefunden uns die Daten in adequater Granularität auch nur für eine im Vergleich beschränkte Region einer Stadt mit unserem begrenzten Budget einzukaufen. Dies ist auch verständlich, denn es steckt eine unglaubliche Menge Arbeit dahinter alle Straßen und sogar Hausnummer genau zu vermessen. Wenn dir eine Quelle bekannt ist, wo man die Geodaten in gewünschter Form kostenfrei oder erschwinglich bekommen kann, bitte lass es mich wissen.

Nein, dein Ansatz ist etwas komplett anderes.

Nein es ist nicht etwas komplett anderes, es ist eine sehr einfache Approximation. Unter der Annahme, dass wir uns alle Postleitzahlengebiete kreisförmig mit gleichem Radius vorstellen und unter der Bedingung, dass ein Gebiet genau 10 Gebiete der um 1 kleineren Dimension beinhaltet, rechnet das Verfahren genau die vom OP gewünschte Aufgabe. Beispiel: sagen wir der Kreis mit dem Radius 10 für das Postleitzahlengebiet 1234* beinhaltet die 10 Kreise mit dem Radius 1 für die Gebiete 12340 - 12349. Wie groß man die Radien der Kreise wählen sollte kann man vielleicht nach Augenmaß auf der Deutschlandkarte ablesen. Ich betone auch nochmal, dass der Algorithmus keine Distanz zwischen zwei Postleitzahlen berechnet, sondern lediglich Artikel aus der Datenbank heraussucht, die sich _wahrscheinlich_ innerhalb eines vorgegebenen Umkreises befindet, wobei selbst die Größe der Umkreise in Abhängigkeit der gewählten Kreisradien vorgegeben ist und nicht frei wählbar ist.

Dieser Ansatz ist in 10 Minuten gecodet und kommt völlig ohne zusätzliche Daten aus und dürfte für die Benutzer von kleineren Onlineflohmärkten ein ausreichendes Gefühl von "nah dran" oder "weit weg" vermitteln.

Zur weiteren Ergänzung möchte ich nochmal aufgreifen, dass der OP auch tatsächlich an einer Annäherung interessiert war, denn seine Vermutug war es dass die Distanzschätzung, die er gesehen hat, ohne Geodaten arbeitet und seiner Einschätzung nach etwa zu 25% fehlerhaft ist.

Postleitzahlen sind nicht passend zum "Umkreis" einer anderen Postleitzahl definiert.

Das ist aber nun mal die Annahme die wir reingesteckt haben, um uns Arbeit und Daten zu ersparen. Die wirklichke Verteilung der Postleitzahlen ist wenigstens grob annähernd so gegeben.

Nur mal angenommen, ein PLZ-Bezirk mit der Nummer 1xxxx hätte eine nahezu kreisförmige Gestalt und etwas wie einen "Durchmesser" von vielleicht 20 Kilometern. Der Suchende wohnt aber am Rand dieses Bezirks - direkt neben dem PLZ-Bezirk beginnend mit 2xxxx.

Ja das wäre ein Extremfall für einen worst-case, das hast du richtig erkannt. 20 km ist da noch weit untertrieben. Wenn ich mir die größten einstelligen Postleitzahlengebiete anschaue und es befindet sich ein Artikel in der nördlichsten Spitze vom Gebiet 9xxxx und ein anderer gerade 1 km jenseits der Grenze zu Gebiet 3xxxx, dann würde mein vorgeschlagenes Verfahren die Distanz zwischen diesen beiden Artikel als größer einschätzen, als die Distanz zu einem Artikel in der südöstlichen Spitze von Gebiet 9xxxx, die sicherlich gute 500 km weiter weg liegt.

Derartige Suchen sind also grob fehlerhaft.

Das ist eine zu pauschale Aussage. Es gibt Extremfälle wie oben, in denen die Suche einen Fehler von mehreren hundert Kilometern macht. Es gibt aber auch Fälle, wo sie auf weniger als 1 km genau ist. Nur aus der Verteilung dieser Fälle kann man ein Mittelmaß für die Qualität der Distanzbewertung ableiten.

Was die Ortsdaten und deren Kosten angeht: Die OpenGeoDB liefert für jede PLZ oder für jeden Ort in Deutschland, Österreich und der Schweiz Ortskoordinaten kostenlos. Diese in einem simplen Algorithmus in eine Umkreissuche zu verfrachten ist keinerlei Hexerei, sondern liefert relativ gute Ergebnisse.

Ja, dieser Vorschlag würde sicherlich eine deutliche Verbesserung der Approximation ermöglichen. Wenn wir für jede Postleitzahl eine Koordinate besitzen, dann können wir erstens von der schwachen Annahme loskommen, dass alles Postleitzahlengebiete gleich große Kreise sind UND viel wichtiger: wir können dann Distanzen direkt zwischen 2 Artikeln schätzen. Dies ermöglicht folgendes verbessertes Suchverhalten. Der User spezifiziert einen nun frei wählbaren Radius, in denen sich der von ihm gesuchte Artikel befinden muss. Ausgehend von der Postleitzahl des Users können wir nun aus den 100.000 möglichen 5-stelligen Postleitzahlgebieten anhand den Geokoordinaten alle Gebiete heraussuchen, deren Koordinate sich innerhalb eines Kreises um die Postleitzahlkoordinate des Benutzers mit dem angegebenen Radius befinden. Nun selektieren wir alle Artikel, die diesen gefundenen Postleitzahlen zugeordnet sind. (Es werden evtl. weitere Suchkriterien angewendet, die nichts mit der entfernung zu tun haben.) Wenn sich Artikel an Rändern von Postleitzahlengebieten befinden, macht dieser Algorithmus die selbe Art von Schätzfehler, der aber wahrschenlich im Bereich < 10 km liegt. Die Genauigkeit wird also durch dein Vorschlag um Größenordnungen verbessert.

Allerdings muss man auch etwas mehr Arbeit, Speicherplatz und Rechenleistung investieren. Der Algorithmus lässt sich wahrscheinlich in 30 Minuten implementieren, benötigt etwa 100.000 Datensätze, die man von OpenGeoDB abgreifen und "einverleiben" muss. Bei 100.000 Gebieten würde ich mir aber um die Performance keine Sorgen machen.

Gruß,
Cruz