Postleitzahl zu Ort

Hallo zusammen,

mit folgender Abfrage ist es ja möglich die einen Ort in einer OSM Datenbank zu suchen:


SELECT 
	cast(poly.name as VarChar(50))
FROM
	planet_polygon as poly

WHERE 
	admin_level IS NOT NULL AND
	poly.name ILIKE '%Ortsname%';

Jedoch würde ich gerne die Postleitzahlen zu den Orten wissen.
Ich habe nur PLZ in der Tabelle planet_line/point gefunden, jedoch war es mir nicht möglich da eine Abfrage zu gestalten die dieses kombiniert.

Könnt ihr mir eventuell Tipps geben, wie ich das ganze angehen muss?

Mit freundlichen Grüßen
mvollmer

Du musst dabei unterscheiden, dass es zwar ganz viele Orte in Deutschland gibt, wo Gemeindegrenze und PLZ-Grenze identisch sind, es gibt aber auch etliche, wo für einen Ort mehrere PLZ gelten, oder mehrere Orte teilen sich eine PLZ.

Dadurch kann es sich ergeben, dass du die PLZ eunes Ortes eher am Place-Node suchen musst als an der Grenzrelation mit einem admin_level=x

Hi,

falls Du deine Datenbank mit osm2pgsql und der Option -k (oder --hstore) importiert hast, landen alle Schlüssel, die nicht in eine eigene Tabellenspalte kommen in der Spalte tags (ein hstore):

select name,tags->'postal_code' as PLZ from osm_polygon where admin_level is not null and name ilike '...'

Manche Postleitzahlen stehen nicht an der Grenze sondern zusätzlich oder aussschliesslich in place-nodes:

select name,place,tags->'postal_code' as PLZ from osm_point where place is not null and tags->'postal_code'!='';

Geduldige Menschen können auch alle Nodes mit gesetztem “addr:postcode=*” abfragen, die innerhalb einer Grenze liegen (Relation 62428 ist München, limit 1, weils da Exklaven gibt und mich nur die grösste Teilfläche interessiert (dauert nen Kaffee lang uns liefert 93 Stück PLZs):

select distinct(tags->'addr:postcode') from osm_point where st_contains((select way from osm_polygon where osm_id=-62428 order by way_area desc limit 1),way);

Noch geduldigere Leute wiederholen das ganze noch mit polygonen im Grenzpolygon, könnte ja sein, dass die Adressen am Gebäudeumriss hängen.

Grüße, Max

Es gibt für die PLZ-Gebiete eigenständige Relationen mit type=multipolygon/boundary und boundary=postal_code. Diese sind die “richtigen” PLZ-Gebiete, während die Administrativen Grenzen mMn dafür “missbraucht” werden. Die sollten dann und nur dann benutzt werden, wenn sich PLZ-Gebiet und Stadtfläche zu 100% decken. Und das ist wirklich nicht oft der Fall.
Ich habe schon die abenteuerlichsten Konstrukte gesehen. Angefangen von mehreren Administrativen Grenzen und jeweils der gleichen PLZ bis hin zu Grenzen mit postal_code=1,2,3,4,5 postal_code=1;2;3;4;5 oder postal_code=1-5

Und extrem geduldige Leute machen sowas: http://osm.wno-edv-service.de/plz :wink:

Gruss
walter

Ich muß das Teil wirklich mal wieder aus der Mottenkiste rausholen. Sind viele kleine Unschönheiten drin um die ich mich mal kümmern sollte.
Darum klemme ich das heute Abend (Mi) wieder ab.

… und interpolations :slight_smile:

Wow, DIE hab ich auch noch nicht drin :frowning:

Auf den 2 address layern auf qa.poole.ch berücksichtige ich die schon immer, dass einzige was ich weglasse sind site relations … muss aber dann auch mal gemacht werden.

Simon

PS: noch was zum Thema (PLZ in OSM): die Schweiz und Deutschland haben da ein ähnliches Konzept, im Gegensatz z.B. zu der UK. Ich hab für die Schweiz mal eine Auswertung gemacht Gemeinde-Polygone (die wir vollständig in OSM haben) vs. PLZ Polygone (die wir nicht importiert haben und vermutlich auch nicht werden): http://qa.poole.ch/ch-plz/ (auf das “m” Klicken zeigt das Gemeindepolygon auf einer PLZ-Karte).

Guten Morgen,

erstmal Vielen Dank zu den zahlreichen Antworten! Ja ich habe die Daten in die Datenbank mit --hstore importiert.

maxbe, die letzte Query scheint genau die richtige für mich zu sein. Ich habe sie wiefolgt umgeschrieben:

Dies wird nun als Suche genutzt. D.h. es soll dem User ermöglichen PLZ + Ortsname anzugeben um dann dort hinnavigieren zu können.

Falls ihr optimierungsvorschläge habt, höre ich sie mir gerne an :slight_smile:

Mit freundlichen Grüßen
mvollmer