Postleitzahlen ermitteln im Umkreis eines bestimmten Punktes

Hallo liebe OSM-Community,

ich bin komplett neu im Umgang mit OSM. Ich möchte das ein Nutzer beispielsweise eine Ortschaft auswählen kann und dann alle Postleitzahlen in einem Defeniertem Umkreis ermittelt werden. Natürlich soll auch auf der Karte eine Markierung angezeigt werden, beispielsweise ein trensperent-rotes Viereck.

Habt ihr vllt ein paar Links oder Tutorials die mir bei der Umsetzung helfen könnten?

MfG
LordKimahri

Stichworte:

Leaflet für die Karte
Aus dem Klick in die Karte ein Rechteck berechnen.
Overpass-API per Ajax ansprechen[1], Abfrage nach “addr:postcode” und “postal_code” [0]
Die Antwort als Liste ausgeben.

Overpass-Turbo-Abfrage, die [0] tut: https://overpass-turbo.eu/s/zLh

[1] hab ich was für jQuery: https://wiki.openstreetmap.org/wiki/User:Gormo#JSON_from_Overpass_Turbo_via_AJAX_call

Danke für deine Antwort werde mir das jetzt mal zu gemüte führen.

Die Query schaufelt ziemlich viele Daten zurück an den Browser. Ich würde mal schauen, ob es nicht ausreicht, ein paar PLZ-Polygone in der aktuellen BBOX zurückzuliefern. Jedes einzelne Haus mit PLZ zu laden erscheint mir als ziemlicher Overkill. Hängt natürlich extrem vom Einsatzgebiet ab. Soll das weltweit sein, oder nur DE, oder wo?

Wenn es serverseitig “select distinct addr:postcode from BBOX” gäbe, würde ich das auch nehmen :wink:

Dann mal viel Spass hiermit: https://overpass-turbo.eu/s/zXM

Geht bei mir um eine PLZ-Datenbank für D/A/CH

Ich habe die PLZ in der DB als [Land]-[PLZ] abgelegt. Beispiel für Garbsen “DE-30823”.

Jetzt würde ich gerne jeweils eine Funktion schreiben um die PLZ aus meiner DB zu laden, eine um diese bei OSM aufzurufen und eine die aus den zurückgegeben Daten die Längen und Breitengrade per Update in die DB einträgt. Um dies dann in einer while/for - scheife durchlaufen zu lassen.

Hoffe mir kann da jemand nen Tipp geben. Denn irgendwie verstehe ich das mit Overpass nicht so ganz^^

Bitte näher spezifieren: meinst du damit nur einen Punkt, und wenn ja welchen (es gibt da nämlich verschiedene Mittel-/Schwerpunkt-Algorithmen), oder möchtest du den kompletten Umriss?

Gebe mal ein Beispiel anhand von gmapsdaten:

30823 Garbsen: Längengrad und Breitengrad (52.4166338 , 9.5378301).

Ich möchte keinen bestimmten Punkt markieren. Ein Punkt in der mitte der PLZ reicht mir!

Also meinst du es eher so zum Beispiel? (Einfach oben links noch auf “Ausführen” klicken)

Aber Achtung, und warum ich oben auch danach gefragt habe:

Ja in etwa so, danke dafür. Mache eh vorher eine Sicherung meiner DB.

Wie kann ich jetzt die Längen und breitengrade daruas abrufen? Also welche Variablen muss ich dann in PHP nutzen?

Und kann ich dort auuch DE-PLZ nehmen oder gehen nur die reinen PLZ?

Also wenn du rechts auf den Tab “Daten” gehst, siehst du ja das Ergebnis als GeoJSON (sofern in der Abfrage out json verwendet wurde). Dort siehst du dann


"center": {
    "lat": 52.4313564,
    "lon": 9.3894715
  }

Naja, das ist jetzt die Frage, wie dein Workaround bzw. dein Workflow ist/sein wird. Willst du vorher selbst ein Reversegeocoding machen? Sprich du lässt dir von der Ortseingabe des Benutzers erst von Nominatim einen Längen-/Breitengrad zurückgeben und bestimmst dann eben selbst die bbox, welche du dann overpass mitgeben kannst. Oder du benutzt wie oben von gormo schon mal angesprochen leaflet mit einem entsprechenden geocoding plugin in leaflet und holst dir von dieser map dann die bbox und machst die Anfrage gegen overpass.
Was mir noch nicht klar ist, ist z.B. dein Weg über PHP, weil das (meiner Meinung nach) eigentlich alles direkt über/im Browser des Benutzers, also JavaScript-seitig, machbar ist.

Nachtrag: Oder willst du einmalig deine PLZ DB “updaten” und das via PHP Scripts machen?

Um das ganze vllt zu erklären.

Ich habe schon eine Datenbank die Postleitzahlen enthält, doch dort sind die Längen und Breitengrade nicht korrekt.

Nun möchte ich diese aktualliesieren, was bei über 10k einträgen manuell ewig dauern würde.

Ich hole mir also aus der Datenbank die PLZ, gebe diese weiter an das script um so die L- und B-grade zu erhalten, und schreibe die erhaltenen werte per update in die Datenbank.

Nur wie kann ich bei deinem Codeschnippsel die PLZ festlegen?

Indem man auch noch die PLZ in der Abfrage mit einbaut. Wenn das die Abfrage ist, dann kannst du die über den Button “Export” > “Abfrage” > “Nach OverpassQL (kompakt)” umwandeln und erhälst einen Link, den du dann direkt verwenden kannst (zur not auch mit wget curl usw.)

Achtung: deine Abfragen NACHEINANDER ausführen, da man bei overpass nur max. 2 Slots pro IP Adresse hat!

Und jetzt hat doch das Thema eigentlich nichts mehr mit dem zu tun, was du unter Beitrag #1 geschrieben hast, oder? :wink:

Danke für deine hilfe, mit dem Link bekomme ich das schon gebacken^^

Kann zwar ein wenig dauern bis ich es lauffähig hab, aber so hab ich wenigstens den ansatz den ich gesucht habe.

Und um die Frage zu klären: Das länderkürzel muss ich vorher entfernen, aber das in PHP ja nun nicht die welle^^

Und die werte des links kann ich ja einfach per JsonEncode holen oder? <— Hat sich erledigt, habs hinbekommen^°^

Welche DB? Welche Felder hat diese DB? Zeigt doch bitte mal einige komplette Datensätze. Am besten aus DE.

Welche Quellen nutzt du?

Und “nur” ca 10.000? Die sind wohl für Ortschaften?

Könnte sein, dass ich dich auf einige landesspezifische Eigenheiten der PLZ hinweisen muß.

Gruss
walter

Ein Bild davon hatte ich ja schon gepostet.

Den kompletten View hier zu posten ist schier unmöglich!

Es sind insgesammt 44031 PLZ gespeichert!

Deutschland:

Kann man hier auch noch das Land hinzufügen?

[out:json][timeout:25];(relation[“boundary”=“postal_code”][“postal_code”=“30823”];);out center;

Also das er mir anhand der PLZ sucht hab ich, nur gibt es bei den Ländern Schweitz und Österreich ja identische PLZ, deshalb die frage ob man das land noch mit einbauen kann^^

Genau das hab ich vor^^

Doch, noch steht die Frage im Raum ob ich auch das Land mit übernehmen kann!

:slight_smile: Danke!