Dann hätte man nur noch die Schwierigkeit, die Straßen, die im Umkreis liegen, zu selektieren: geht das dann auch via Postgis (https://de.wikipedia.org/wiki/PostGIS)?
Habe jetzt einen analogen Löungsansatz gefunden (hier geht es zwar um Flurstücke anstatt um Straßen, die im 200m Umkreis eines geplanten Windrades gesucht werden), es sollte bei PostGIS beispielsweise so gehen:
SELECT wkb_geometry, flurstueckskennzeichen
FROM ax_flurstueck
WHERE ST_Distance( ST_GeomFromText( 'POINT(353937.74 5531106.746)', 25832 ), wkb_geometry) <= 200 ;
Das funktioniert so nicht, schonmal mindestens nicht in Deutschland.
PLZ können mehrere Gemeinden umspannen und dadurch Straßennamen mehrmals enthalten.
Es gibt z.B. Schulstraße 37127 Dransfeld (OT Varmissen) und Schulstraße 37127 Scheden.
Besser ist:
“select” alle Straßen innerhalb der umschließenden admin_level=8, z.B. way[highway](area.YourTown); in overpass,
dann Levenshtein oder sonstige Korrelationsfaktoren berechnen (ist sogar unabhängig von der Query und könnte man aus ner pregenerierten Tabelle ziehen)
Mir ging es nicht um eine exakte Ermittlung aller Straßen in einem PLZ Gebiet, sondern nur um Vorschläge zur Rechtschreibkorrektur bei offensichtlichen Tippfehlern.
Deshalb würde ich um das geometrische Zentrum (nach @Nakaner - danke für den Hinweis) mit ST_DWithIn im Kreis mit einer großzügigen Distanz nach relevanten Straßen als Vorschläge suchen, die der Benutzer in der Adressverwaltung dann übernehmen kann oder auch nicht. Um es vollautomatisch (ohne Benutzereingriff exakt) zu lösen, dürfte man ja programmiertechnisch nur innerhalb der PLZ Grenzen nach Straßen suchen, was den Algorithmus kompliziert und langsam machen würde.
Da ich ein Anfänger im Projekt OSM bin, sagt mir der Satz: “select” alle Straßen innerhalb der umschließenden admin_level=8, z.B. way[highway](area.YourTown); in overpass,
(noch?) leider gar nichts. Kannst du das näher ausführen?
Die Levenshtein Distanz ist mir wieder klar, damit ist das gemeint: https://de.wikipedia.org/wiki/Levenshtein-Distanz
Es geht schlicht um die (mathematische) Menge aller Straßennamen in der gewählten Gemeinde. Die ergibt sich widerrum einfach aus der Menge aller Straßensegmente, die in der Gemeinde liegen. Die Gemeinde selber liegt als Area vor. Und mit dem Wissen baust du dir dann dein SQL-Statement zusammen, mit SELECT und ST_DWithin und was-auch-immer.
Die meisten Anwender halten aber keinen PostGIS-DB-Klon lokal vor. Daher wird oft die Overpass-DB (remote) abgefragt, und das mit Overpass-QL. Die Select-Statements sehen dort gänzlich anders aus, auch weil es, anders als SQL, eine Art imperative Sprache ist.
Was wahrscheinlich die beste Lösung wäre: wenn man doch versuchen würde im PLZ Gebiet möglichst exakt die Strassen zu ermitteln und die Ergebnisse dann in eine Tabelle zu speichern. Die Adressverwaltung könnte dann performant über Indexe auf diese Tabelle zugreifen (und bräuchte kein PostGIS / Overpass-QL, da sie über die PLZ einfach die relevanten Strassen filtern und vorschlagen könnte). Dann wäre die Laufzeit egal, da man die Strassenaktualisierung von OSM => PLZ/Strassentabelle nur einmal im Vierteljahr laufen lassen müsste (die Strassen ändern sich ja nicht täglich ;-)).
Das wäre dann die zweite, schwierigere Aufgabenstellung zur ersten Umkreissuche Lösung:
==> Suche alle Strassen innerhalb eines PLZ Gebietes.
Wie könnte man dies bewerkstelligen? Gibt es da auch schon fertige Befehle dazu, wie bei der Umkreissuche mit ST_DWithIn, oder muss man da selbst erst einen Algorithmus entwickeln?
In https://forum.openstreetmap.org/viewtopic.php?id=20839 ist schon erklärt, wie man so eine Liste mit overpass generiert. Da jeder Straßenschnipsel einzeln aufgeführt wird, muß man die Roh-Liste beispielsweise mit den üblichen Kommandozeilentools sortieren und die Duplikate rausfischen.
addr:postcode hängt in der Regel an einem Gebäude, event. auch an einem Grundstück. https://www.openstreetmap.org/way/39973424
Straßen haben dagegen kein tag addr:postcode.
In DE fehlen noch Millionen von Adressen und damit auch das addr:postcode daran.
@fx99: Vielen Dank für den Hinweis, dann nehme ich postal_code.
Auszug aus DE:Overpass API Wiki:
Download großer Mengen von Daten
Da die Größe des Ergebnis einer Overpass API Abfrage erst dann bekannt ist, wenn der Download abgeschlossen ist, ist es nicht möglich, während des Downloads eine Dauer für diesen Download abzuschätzen. Auch benötigt die Overpass API länger dafür, die Daten zu generieren und zu downloaden, als man bräuchte, um einfach alle Daten der selben Region statisch zu downloaden. Daher ist es besser, ein Planet file zu downloaden, wenn man Regionen in Ländergröße mit (fast) allen Daten haben will. Die Overpass API ist dagegen dann sehr nützlich, wenn man nur eine Auswahl von Daten einer bestimmten Region haben möchte.
=> https://wiki.openstreetmap.org/wiki/DE:Overpass_API#Einschr.C3.A4nkungen
==> Bekomme ich da ein Problem, wenn ich alle Straßen ganz Deutschlands herunterladen will? PostGIS ist halt schwierig zu installieren - mit der Overpass API wäre es deutlich einfacher.
Wenn Du die geschätzt 10.000 Abfragen am Stück laufen lässt, bekommst Du wahrscheinlich Probleme mit der Quota.
Aber zeitlich verteilte Abfragen auf den diversen Overpass Servern könnte gehen.
Spätestens, wenn es Richtung Europa ginge (FR / CH / AU wären z. B. auch interessant), wäre dieses wohl unumgänglich: Overpass API/Installation als Clon => https://wiki.openstreetmap.org/wiki/Overpass_API/Installation
Oder sieht jemand noch einen anderen Weg?
ACK, deshalb habe ich mir nun anhand der obigen Anleitung die overpass API installiert - die beeindruckt mich doch sehr ob ihrer Funktionalität. Das funktioniert nun gut, ich kann nun z. B. via SSH und Python (https://python-overpy.readthedocs.io/en/latest/introduction.html) auf die API zugreifen, denn Python scheint mir ohne viel Overhead elegant auf die API zuzugreifen und dann kann ich auch soviele Abfagen pro Sekunde machen, wie das System hergibt - und ich habe gleich die ganze Welt installiert.
Danke für alle Hinweise, nun sollte sich mein Problem vollends lösen lassen.
… mein Post ist zwar nicht mehr ganz so taufrisch ;-), aber mit…
… konnte ich nun die Straßen abrufen, aber wie kann ich sie z. B. jeweils auf D / A / CH eingrenzen? D.h. also: wie kann man zusätzlich das Land abfragen?
=> Das ist nun noch mein Problem.
==> Das andere Installationsproblem habe ich einfach so umgangen, dass ich vor jeder Abfrage auf einen öffentlichen Server eine künstliche Denkpause von 300ms eingebaut habe, um nicht Gefahr zu laufen, unter die Rurik DoS (Denial of Service) zu fallen. Das hat bislang gut funktioniert, habe inzwischen ca. 20.000 Abfragen laufen lassen (allerdings nicht am Stück).
In dieser überarbeiteten Version wird die Bereichsabfrage für die Postleitzahl durchgeführt und in der Variable .a gespeichert. Dann wird eine weitere Abfrage durchgeführt, um die Grenze dieser Postleitzahl abzurufen und in .b zu speichern. Anschließend wird die ISO3166-1-Kennzeichnung auf .b angewendet, um die Gebiete von Deutschland und Österreich zu selektieren. Schließlich werden die Straßen in diesen Gebieten abgefragt und als CSV ausgegeben.
Bitte ersetze “XXXXX” durch die gewünschte Postleitzahl oder entferne es, wenn du nach allen Straßen in dem Bereich suchen möchtest.
=> Habe es eben mit overpass-turbo getestet und es scheint genau das zu tun, was es tun soll, denn nun kamen nur noch deutsche Straßen, wenn ich z. B. 01561 für XXXXX eingesetzt habe.