Wie kann ich PLZ / alle PLZs von einer Stadt bekommen?

Hallo,
Ich habe nur den Namen einer Stadt, z.B. Stuttgart. mit welcher Abfrage kann ich die PLZ(s) in XML bekommen?
Die folgende Abfrage gibt nur 8 spezifische PLZs in einigen Stadtteilen zurück:
http://nominatim.openstreetmap.org/search/germany/stuttgart?format=xml&polygon=0&addressdetails=1
obwohl Stuttgart fast 3 Duzend PLZs hat.
Vielen Dank!

Kann ich nicht allg. beantworten. Mit PostGIS und OSM-DB geht es. Beispiel Stuttgart als CSV (Stand 1.10.2014):


"schluessel";"postcode";"area_qm";"centroid_latlon";"surface_refpoint_latlon"
"081110000000";"70173";1544743;"48.7816 9.1819";"48.7816 9.1831"
"081110000000";"70174";1258732;"48.7829 9.1703";"48.7819 9.1712"
"081110000000";"70176";942632;"48.7774 9.1617";"48.7778 9.1620"
"081110000000";"70178";1066739;"48.7691 9.1676";"48.7682 9.1666"
"081110000000";"70180";1351740;"48.7628 9.1750";"48.7630 9.1744"
"081110000000";"70182";591381;"48.7752 9.1855";"48.7767 9.1874"
"081110000000";"70184";4330263;"48.7646 9.1957";"48.7668 9.1896"
"081110000000";"70186";2907732;"48.7736 9.2111";"48.7735 9.2110"
"081110000000";"70188";2243482;"48.7846 9.2135";"48.7863 9.2154"
"081110000000";"70190";2113973;"48.7914 9.2030";"48.7903 9.2021"
"081110000000";"70191";3407302;"48.7986 9.1849";"48.7979 9.1885"
"081110000000";"70192";3308451;"48.7962 9.1634";"48.7979 9.1652"
"081110000000";"70193";2670693;"48.7812 9.1459";"48.7828 9.1467"
"081110000000";"70195";5753033;"48.7870 9.1266";"48.7857 9.1243"
"081110000000";"70197";10626496;"48.7712 9.1129";"48.7743 9.1023"
"081110000000";"70199";3229669;"48.7576 9.1463";"48.7574 9.1454"
"081110000000";"70327";10110359;"48.7793 9.2518";"48.7786 9.2461"
"081110000000";"70329";11966896;"48.7648 9.2603";"48.7644 9.2247"
"081110000000";"70372";4392976;"48.7988 9.2253";"48.8000 9.2221"
"081110000000";"70374";5611847;"48.8115 9.2405";"48.8109 9.2409"
"081110000000";"70376";7183803;"48.8160 9.2031";"48.8183 9.2065"
"081110000000";"70378";8907720;"48.8436 9.2232";"48.8453 9.2260"
"081110000000";"70435";6400385;"48.8306 9.1615";"48.8314 9.1589"
"081110000000";"70437";5897464;"48.8391 9.1931";"48.8358 9.1926"
"081110000000";"70439";4815467;"48.8481 9.1517";"48.8495 9.1553"
"081110000000";"70469";7759430;"48.8111 9.1539";"48.8055 9.1479"
"081110000000";"70499";15287219;"48.8096 9.1058";"48.8085 9.1087"
"081110000000";"70563";4557746;"48.7305 9.1049";"48.7292 9.1028"
"081110000000";"70565";7833133;"48.7163 9.1240";"48.7170 9.1116"
"081110000000";"70567";8550295;"48.7253 9.1559";"48.7215 9.1560"
"081110000000";"70569";17000499;"48.7452 9.0901";"48.7446 9.0891"
"081110000000";"70597";9055460;"48.7452 9.1686";"48.7447 9.1677"
"081110000000";"70599";17119991;"48.7123 9.2044";"48.7181 9.2015"
"081110000000";"70619";7530735;"48.7449 9.2213";"48.7422 9.2222"

Wie oft machst du das denn? Für wenige Abfragen bietet sich vielleicht die Overpassapi an.

Wenn du noch die Abfrage dazu schreibst kann man gucken, ob man die auch gegen die Overpass-API formuliert kriegt.

edit: erster Versuch: http://overpass-turbo.eu/s/5GW

boundary=postal_code in Stuttgart

über den Wizard.

Die meiner Meinung nach einfachste Variante: Gib auf http://www.postdirekt.de/plzserver/ bei “Ort” “Stuttgart” und bei “Straße und Hausnummer” nichts ein, klicke beim Ergebnis auf “Stuttgart”, und Dir werden Dir alle PLZ von Stuttgart ausgespuckt.

Das verlinkte Overpass sollte sich auf Relationen beschränken.
Es fehlen evtl. noch PLZ-Relationen, die nur teils in der Gemeinde liegen (kenn Overpass zu schlecht). Sonst schon entsprechend meinem Query.

Ja, generell schon. Funktioniert aber nicht, wenn man wirklich alle haben will, aber die DPAG die PLZ für die Gemeinde nicht listet (vgl. z.B. Süsel in Schleswig-Holstein).
Außerdem muss man sich im Zweifel länger durchklicken. Und ne größere Auswertung über mehrere Gemeinden ist damit natürlich auch nicht angenehm.

Hast du da mal ein Gebiet, das man testen könnte - also die PLZ/Nummer einer PLZ-Relation die nur halb in einer Gemeinde liegt?

Probier’s zuerst mal mit 49779 Oberlangen und 49779 Niederlangen (nördlich von Meppen und Haren).

Auch relevant als Grundlagenwissen: http://en.wikipedia.org/wiki/DE-9IM

Danke Leute für die Antworte.
Aber wie ihr schon gesehen habt, brauche ich eine **NOMINATIM **online Abfrage (und keine SQL) die mir die Daten (PLZs) via XML zurück gibt. Ich weiß nur nicht wie ich diese Abfrage zusammensetzen soll damit die richtige Daten zurück kommen, wenn es überhaupt möglich ist. Als Eingangs-Data habe ich **nur **den Stadtnamen und nichts weiter.
Jedwede Hilfe ist willkommen!

Da bin ich raus. Geht wahrscheinlich auch nicht, weil Nominatim da im Zweifel eh’ Mist macht.

Abfragen gegen die Overpass Turbo-API gehen also ganz sicher nicht? Da kommen auch Daten raus. Halt als geoJSON.

Du kannst mit (beispielsweise) [%22boundary%22%3D%22postal_code%22]%28area.searchArea%29%3B%0A%29%3B%0A%2F%2F%20print%20results%0Aout%20body%3B%0A%3E%3B%0Aout%20skel%20qt%3B

die Abfrage gegen die Overpass API stellen.

Für deine Programmierung müsstest du jetzt nurnoch im Query String der Abfrage jeweils Stuttgart durch deine Stadt ersetzen - halt sofern du das Ergebnis als geoJSON verarbeiten kannst.

Nicht oft. Normalerweise hat der Benutzer meiner Anwendung, auch eine Straße eingegeben. Dann bekomme ich immer die PLZs problemlos. Aber es kann auch ab und zu vorkommen dass der Benutzer, die Straßennamen nicht hat und nur den Namen der Stadt/Gemeine/Dorf etc. weiß, dann möchte ich das meine Anwendung in der Lage ist, durch einen **NOMINATIM **online-Abfrage, eine richtige PLZ (oder PLZ-Liste) aus der XML lesen und dem Benutzer vorschlagen kann.

Das stimmt so nicht. Overpass API liefert JSON, aber kein geoJSON.

Habe ich auch allmählich den Eindruck ! :frowning:
Ich dachte aber vielleicht gibt es hier einen Query-Spezialist für Nominatim!

Danke , ich werde versuchen es einzubauen, muss ich aber einen weg finden, *.json-Datei programmatisch zu lesen. Ist dass XML-verwandt?

Jain,

es ist natürlich kein XML sondern ein anderes struktuiertes Format. JSON ist aufgrund seines einfacheren Aufbaus wesentlich leichter zu handhaben und kann schon als der Nachfolger von XML angesehen werden. In jeder (vernünftigen) Programmsprache gibt es inzwischen Interfaces dafür, kommt halt drauf an, was du benutzt.

Gruss
walter

ps: wofür brauchst du denn die PLZ einer Stadt? Ist dir inzwischen klar, dass das nicht immer stimmt? Es gibt auch PLZ-Gebiete, die mehrere Städte enthalten oder über Stadtgrenzen hinausgehen. Die pauschale Annahme “eine PLZ in einer Stadt und nur dort” ist falsch.

Overpass kann auch XML ausgeben.
Wahrscheinlich kann man auch verhindern, dass alle ways mit ausgegeben werden.

@gormo
Kannst Du Deine interessante Overpass Abfrage auch mal im “Klartext” posten?

Ausgabe von decodeURIComponent():

/*
This has been generated by the overpass-turbo wizard.
The original search was:
“boundary=postal_code in "Stuttgart"”
*/
[out:json][timeout:25];
// fetch area “Stuttgart” to search in
area(3602793104)->.searchArea;
// gather results
(
  // query part for: “boundary=postal_code”
  relation["boundary"="postal_code"](area.searchArea);
);
// print results
out body;
>;
out skel qt;

Ja, einfach die Suche nach Unterelementen (“>;”) weglassen.

Hier mein Vorschlag:
http://overpass-turbo.eu/?Q=area[name%3D%22Stuttgart%22]%3B%0Arel%28area%29[%22boundary%22%3D%22postal_code%22]%3B%0Aout%20%20tags%3B&C=52.5214;13.4137;17

area[name=“Stuttgart”];
rel(area)[“boundary”=“postal_code”];
out tags;