Liste aller Orte und PLZ mithilfe von OSM erstellen

Hallo Community,
ich habe eine veraltete Datenbank mit PLZ, Ort, Bundesland. Hier haben sich seit 2009 viele PLZ-Gebiete geändert und ich möchte deshalb eine aktuelle Übersicht. Ist es mit OSM möglich mir für jede in Deutschland (und Österreich) vergebene Postleitzahl den dazugehörigen Ort und das Bundesland ausgeben zu lassen? Ich habe etwas vergleichbares auf Github gefunden, jedoch weiß derjenige nicht mehr wie er zu dem Datensatz kam und ich würde das auch gerne selbst anlegen.

Könnt ihr mir da weiterhelfen?

Für ein Bundesland geht es mit overpass so:
http://overpass-turbo.eu/s/v0N

Falls nur eine leere Karte erscheint, rechst oben auf “Daten” klicken.

Auch eine Schleife über die Bundesländer lässt sich integrieren.

Das scheint mir genau das zu sein, was ich suche!
Ich verstehe nur leider die API nicht. Wenn ich das richtig verstanden habe, kann man sich mit Overpass QL Anfragen zusammenbauen und dann wird das Resultat ensprechend auf der Map angezeigt? Ich habe jetzt auf den ersten Blick keine Web-/Rest-API gefunden mit dem ich das, was ich im Reiter “Daten” rechts oben finde, als JSON zurückbekomme. Ich möchte programmatisch durch alle Bundesländer gehen, eine Anfrage an den Service senden und die JSON aus Daten erhalten und auswerten.

Kannst du mir hier nochmals weiterhelfen.

So ganz sauber scheint das aber nicht zu sein. Die Infos kommen vor allem aus dem note-Tag?

Die Info zur Gemeinde kommt in der Tat aus dem Note-Tag. Für das Saarland ist das aber durchgehend enthalten.

Wenn Du die in der zitierten Overpass-Abfrage enthaltene Abfragetext in eine Text Datei kopierst (z.B. OVP-PLZ-SAARLAND.txt), kannst Du Overpass aus einem Skript/Programm aufrufen:

wget -O PLZ-SAARLAND.txt --post-file=OVP-PLZ-SAARLAND.txt “http://overpass-api.de/api/interpreter

CSV hat den großen Vorteil, dass man die Datenfelder auswählen kann und auch das nachfolgende Parsen einfach ist:
[out:csv(::id,postal_code,“note”,“name”,::timestamp)];

JSON ist auch möglich [out:json], aber dann bekommt man sehr viel mehr Daten inklusive Geometriedaten.

Mit dem Inhalt aus obigem Link in OVP-PLZ-SAARLAND.txt bekomme ich leider einen Error 400: Bad Request zurück.

Vielen Dank, ich muss aber ehrlich gestehen, dass die Doku etwas unübersichtlich für Anfänger ist.
Kann man damit auch Vorwahl und Gemeindeschlüssel in Erfahrung bringen?

amtlicher Gemeindeschlüssel: ja
der Key ist “de:amtlicher_gemeindeschluessel” genau so, mit Doppelpunkt und UE

Vorwahl: nein, da die Vorwahl nicht zu 100% erfasst wurde und auch nicht werden wird.

Gruss
walter

Sorry, hatte es leider nicht als Batch ausprobiert.
Mit diesem Inhalt in OVP-PLZ-SAARLAND.txt funzt es aber jetzt:

//  alle PLZ im Saarland
[out:csv(::id,postal_code,"note","name",::timestamp)][timeout:25];

// fetch area “Saarland” to search in
//{{geocodeArea:Saarland}}->.searchArea;
area[admin_level=4][name="Saarland"]->.searchArea;

relation["boundary"="postal_code"](area.searchArea);
// print results
out body;

@Overpass Spezialisten: warum funktioniert das geocodeArea:Saarland nicht im Batch Aufruf?

Hiermit bekommst Du alle Gemeindeschlüssel:

//  alle Gemeinden im Saarland
[out:csv(::id,"de:amtlicher_gemeindeschluessel","note","name",::timestamp)][timeout:25];

// fetch area “Saarland” to search in
//{{geocodeArea:Saarland}}->.searchArea;
area[admin_level=4][name="Saarland"]->.searchArea;

relation[admin_level=8](area.searchArea);
// print results
out body;

Vorwahlen sind wahrscheinlich nicht flächendeckend in OSM.

Hast du eine Idee, von wo man die Vorwahl am besten beziehen könnte?

Wie baue ich das denn in meine obige Abfrage mit ein, sodass es unter Daten als zusätzliche Spalte aufgeführt wir? Sorry aber für mich ist die Syntax absolut unverständlich :confused:

EDIT: @fx99: Vielen Dank, jetzt bräuchte ich das alles nur noch in einer Liste und einer Abfrage :smiley: Gibt es auch eine Möglichkeit durch alle Bundesländer zu iterieren und mir praktisch alle PLZ + Gemeindeschlüssel in einer Abfrage ausgeben lassen kann?

geocode area ist eine overpass turbo Erweiterung und funzt nur dort!

hier:
https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONRufnr/ONK_alphab.pdf;jsessionid=B964FCFC301C39A7779AEC35BF2FA637?__blob=publicationFile&v=1

Da die PLZ und der Gemeindeschlüssel an unterschiedlichen Relationen hängen, kann man sie wahrscheinlich nicht in eine Tabelle bekommen.

Ich würde beide Ausgaben in eine Excel Tabelle packen und dann die Orte jeweils alphabetisch sortiern.

OK, 2 Abfragen sind auch nicht schlimm Würde es aber mit der Iteration aller Bundesländer funktionieren?
Danke für deinen Link, leider sind die Vorwahlen schon 7 Jahre alt.

/*“boundary=postal_code in Saarland” */
[out:csv(::id,postal_code,"note","name",::timestamp)][timeout:25];
// fetch area “Saarland” to search in
{{geocodeArea:Bayern}}->.searchArea;

relation["boundary"="postal_code"](area.searchArea);

// print results
out body;

Was liefert denn diese Abfrage genau für Gemeinden/Städte, weil München oder Nürnberg ist da ja gar nicht dabei. Ich bräuchte ja, nachdem ich durch alle 16 Bundesländer durch bin, eine Liste **aller **Postleitzahlen in Deutschland.

–bitte löschen–

Im Prinzip müsste es mit overpass so gehen:

Ich würde aber jedes Bundesland über eine getrennte Abfrage behandeln.
Die Abfragen kann man auch automatische generieren, dabei auch die Abfragedateien modifizieren.

München und Nürnberg sind da drin, sogar vielfach.

Bei mir hat die Anfrage wohl nicht komplett geladen Anfangs, jetzt gehts.
Laut Dokumentation kann ich es auch als JSON ausgeben lassen. Hab es bei beiden mit json anstelle von csv versucht, leider erfolglos. Er moniert anschließend die Syntax! Sind die Abfragen aus #9 nur mit json anstelle von csv.

Grund ist ganz einfach: Die “csv” kann man nicht richtig parsen, weil ein Seperator zwischen den einzelnen Werten fehlt und auch kein “new-Line” Character vorhanden ist, wonach man die Zeilen trennen könnte.

So geht es mit json:

    //  alle PLZ im Saarland
    [out:json];
    // fetch area “Saarland” to search in
    //{{geocodeArea:Saarland}}->.searchArea;
    area[admin_level=4][name="Saarland"]->.searchArea;

    relation["boundary"="postal_code"](area.searchArea);
    // print results
    out ;

Das Problem dabei ist, dass Du Dich durch eine ganze Menge Daten wühlen musst, die Du nicht brauchst.

csv hat sehr wohl einen Separator (tab) und natürlich auch ein carridge return am Ende der Zeile.

[out:csv(::id, ::lat, ::lon, ref, description, ::user, ::version, ::timestamp;true;"|")];

Ich weiß nicht ob ich dich richtig verstanden habeß

Hier ein Beispiel, Seperator “|”.

Kann man beliebig ändern.

Nicht unbedingt, auch JSON kann man tag-basiert filtern: http://overpass-turbo.eu/s/vla