Adressdaten aus OSM Datei filtern

Hallo meine Lieben,

ich habe mich bezüglich eines Problems (http://forum.openstreetmap.org/viewtopic.php?pid=419880#p419880) vor ein paar Tagen schon einmal an euch gewandt und kompetente Hilfe bekommen. Leider konnte ich mich mangels Hintergrundwissen nicht wirklich gut ausdrücken und habe den Wald vor lauter Bäumen nicht mehr gesehen. Deshalb hier noch einmal mein neuer Ansatz :wink:

Ziel ist ein Flatfile mit folgenden Daten:

PLZ; Stadt; Straße; Hausnummer

Was ich bisher gemacht habe ist folgendes:

  1. per osmfilter auf AdressTags gefiltert:

osmfilter.exe baden-wuerttemberg-latest.osm --keep=“addr:postcode= and addr:city= and addr:street= and addr:housenumber=” --ignore-dependencies > bwfiltered.osm

  1. mit osmconvert in csv umgewandelt:

osmconvert.exe bwfiltered.osm --csv=“addr:postcode addr:city addr:street addr:housenumber” --csv-headline -o=test.csv

Das Problem ist nun allerdings, dass in meiner Ausgabe nur sehr begrenzte Daten ankommen. Ich habe meine csv Datei mal auf die Stühlingerstr und PLZ 79106 gefiltert und finde nur diese beiden Einträge:

79106 Freiburg im Breisgau Stühlingerstraße 13
79106 Freiburg im Breisgau Stühlingerstraße 24

In der Karte sind allerdings sämtliche Hausnummern für die Stühlingerstr gepflegt… Habe ich irgendeinen Fehler gemacht, waren meine Rohdaten (GeoFabrik) bescheiden, oder ist es doch nicht so trivial wie ich mir das vorstelle?

Bin für jede Hilfe dankbar!

ein ziemlich verzweifelter

oberschlumpf

Evtl. liegt es an der associatedStreet-Relation, dass die Abfrage nicht klappt: http://www.openstreetmap.org/relation/281055 (Objekte selbst tragen nur die Hausnummer)

Nur so als Tipp, ich bin mit osmfilter leider nicht vertraut.

Adressen können außerdem als Punkt, Fläche, Weg oder Relation erfasst werden. http://wiki.openstreetmap.org/wiki/DE:Elemente

Der Geofabrik-Extrakt sollte ok sein. Es gibt viele mögliche Ursachen, die in den Daten selbst begründet sind. Viele Adressen in der Straßen haben z.B. kein addr:postcode-Tag.
Das ist aber auch nicht unbedingt “falsch”. Die können über Relationen (associatedStreet oder boundary=postal_code) indirekt spezifiziert sein.

Ganz einfach: Die übrigen Objekte haben nur addr:housenumber, kommen also nicht durch den Filter. Beispiel: http://www.openstreetmap.org/way/101449066

Wegen solcher Probleme wie hier finde ich es keine unnötige Redundanz, city und postcode auch an die Gebäude zu hängen.
Die Information kann zwar im Prinzip aus den umgebenden Grenzrelationen abgeleitet werden, aber halt nicht mit so Geradeaus-Abfragen wie oben.
Falls es je einen simplen Trick dafür geben sollte, müsste man den erst finden.

OSM ist halt eine Geo-Datenbank und keine Textdatei. Und aus der Datenbank kriegt man es schon einfach raus. Man kann ja auch Textdatei-Exporte generieren, die die impliziten/indirekten Informationen wie Ort, ggf. Straßenname, PLZ usw. enthalten. Letztlich alles eine Tool-Frage und aus meiner Sicht keine Tagging-Frage. Aber die Diskussion könnten wir wohl ewig führen :wink:

Hast du das schon einmal gemacht? Oder kennst du eine Quelle, wo ich schauen könnte, wie die das gelöst haben?

Dich muss ich das gleiche fragen wie seichter :stuck_out_tongue:

Ich beschäftige mich nun annähernd 40 Std mit der Lösungsfindung für meinen Wunsch und langsam geht mir das Internet zuneige. Wer mir für obiges Problem eine umsetzbare Lösung verrät, bekommt eine Dose Haribo geschickt!

oberschlumpf

Es sollte dafür ein Tool geben, das man einfach mit dem Dateinamen der OSM-Datei als Parameter aufruft, das dann alle Adressangaben aus den Grenzen auffüllt. Tja, “sollte”: Afaik gibt es das bisher nicht. Hat sich wohl bisher niemand gefunden, dem das wichtig genug ist.

Vielleicht ist die Overpass-API eine Lösung für Dich. Das müssen andere beurteilen.

Ich bin eher der Datenbankler. Simpel ist es damit nicht, weil man erstmal einiges an Wissen braucht und Vorarbeit leisten muss. Man muss die OSM-Daten (Extrakt oder Planet) in eine PostgreSQL/PostGIS-Datenbank importieren (z.B. mit osm2pgsql). Dort gibt es dann Polygon-Tabellen für Grenzen u.a., die man als räumlichen Filter für Abfragen nutzen kann. Da muss man sich dann in PostGIS einarbeiten und die Funktionen dort nutzen (z.B. ST_Contains u.ä.).

Da es aber so viele verschiedene Adresstagging-Varianten und -Qualitäten gibt, ist es mit einer einzigen, komplexen DB-Anfrage wahrscheinlich eh nicht getan. Ich vermute eher, man müsste ein Tool schreiben, dass verschiedene Queries ausführt und nach Analyse/Vorverarbeitung der Resultate diese zusammenführt.

EDIT: Ich könnte wohl einen solchen Datensatz für ganz Deutschland generieren, aber das kostet einiges an Zeit für die Erstellung und Ausführung des/der Queries und der Aufbereitung der Ergbnisse…

Puh, ohne DB für die spatialen Filter wird das schwierig.

Nein. Es ist halt nicht so trivial, dass ich mich ohne Anlass da reinwühle.
Ich kenne QGIS ein wenig, damit müsste es gehen, aber das ist schon ein größeres Kaliber zum Einarbeiten.
Andere Tools mögen für OSM geschickter sein, aber da bin ich noch nicht vorbeigekommen und leichter erlernbar sind sie vermutlich auch nicht.
Ein einfach zu bedienendes Tool (a la rayquaza) kenne ich nicht.

Spricht ja nichts dagegen, dass das “Tool” ein Script ist, dass eine temporäre DB bedient :wink:

Vielleicht wäre die Zeit auch sinnvoller investierbar in eine Überarbeitung der diversen Anleitungen: Wenn man es damit als Anfänger schaffen würde sich eine DB zu basteln und daraus die Daten zu erhalten, würden einige vermutlich gleich bei Datenbankabfragen bleiben…

Kurze Stichprobe: Offenbar sind ca. 1/3 der Node-Adressen in Freiburg ohne Straße oder aber mit associatedStreet.
Straße, Hausnummer und PLZ (aus Relation) kann ich für knapp 5.000 Node-Adressen (ohne Häuser-Ways) in Freiburg finden.

EDIT: Hatte da irgendwie Zahlen verwechselt

Es ist vielleicht nicht geradeaus, aber für mich maßlos eleganter, als diese Redunanzen in den Daten. Die Informationen sind geometrisch ja die gleichen, nur müssen sie eben “gehoben” werden.

Vielleicht ein bisschen Inspiration: man könnte obiges Problem auch skripten, DB Lösung mal beiseite. Hierarchisch könnte man sich immer die ID der Grenzen besorgen, die einen interessieren, im Beispiel mal 48149 Münster mit ID 1244367. (http://www.openstreetmap.org/relation/1244367)
Dann daraus die polygon-boundaries erzeugen, mit diesen dann die “Planet”-artigen Input-Daten filtern und später dann der Filter über Adress-Nodes und Relationen

Beispiel

 
#fur 48149-ms, nur die PLZ-Relation und Kinder (=Ways, die die Grenzen markieren) suchen
./osmfilter muenster.o5m --keep-nodes= --keep= --keep-relations="@id=1244367" --drop-author --drop-version  >muensterfilter.osm

#boundary-tags entfernen, die kann osm2poly nicht
sed -i '/boundary/d' muensterfilter.osm

#ein boundary-poly machen
perl osm2poly.pl muensterfilter.osm 48149.poly

#aus dem original pbf nur alles im Bereich ausschneiden
./osmconvert muenster-regbez-latest.osm.pbf -B=48149.poly -o=ms_48149.o5m

#adressen suchen, hier könnte man noch ways, die Straßen sind, entfernen
./osmfilter ms_48149.o5m --keep-nodes="addr:*" --keep-relations="type=associatedStreet" --drop-author --drop-version  >strassen_adressen.osm

Dann am Ende noch ein bisschen Grips um eine schöne Tabelle zu machen. Wenn in den Adress-Relationen dann auf Ways/Knoten verwiesen wird, die nicht in der gleichen Ausgabedatei stehen, heißt das, dass der Boundary Filter sie vorher rausgeschmissen hat. (Beispiel http://www.openstreetmap.org/way/96214105 , die PLZ 48149 hat am Ring für die GrevenerStr auf ihre nördliche Grenze)

Frohes Ausbauen, :wink:
lokx

Hallo,

Vielen Dank an Alle für die Ansätze und einen Besonderen an lokx!!

Ich spiele gerade deine Vorgehensweise durch, nur leider hänge ich nun daran per osm2poly.pl das Polygon zu erstellen. Egal was ich probiere es kommt immer die Fehlermeldung:

"cannot process tag ‘Destination:ref’ at line 43 :rage:

MfG

oberschlumpf

nimm den einfachen Weg: http://osm.wno-edv-service.de:8080/boundaries/

→ Germany → BW → Reg Bez Freiburg → Häkchen bei Freiburg

unten links Poly → Export

feddich

Gruss
walter

ach ja:

Zum Navigieren auf den kleinen grauen Pfeil ganz links drücken.
Zum Auswählen der gewünschten Grenze(n) Häkchen im Kasten machen

Für ne bundesweite Adressdatenbank bringt das alles aber nur wenig…

jo, hattu recht - braucht man flinke Finger :wink:

Ok, war ein Mißverständnis.

Gruss
walter

Na ja, wie man’s nimmt. Der Vorschlag von lokx wurde ja erstmal dankend aufgenommen. Und dafür hilft es ja vielleicht schon.

Ich bin nur skeptisch, ob das am Ende wirklich das gewünschte Ergebnis ist.

Eigentlich sind das 3 Themenkomplexe:

1.) Besorge dir alle Administrative Grenzen (Al6-AL8) und PLZ-Grenzen von Deutschland. Das sind ca 21200 Stück, wenn ich mich nicht irre
2.) Finde alle Address-Nodes und Address-Ways (buildings) in Deutschland. (ca xx Mio, Query läuft noch)
3.) Überprüfe in welchen beiden Grenzen die Adresse liegt.

Da der angedachte Script ca 13000-mal für die Bestimmung der Stadt und ca 8200-mal für die PLZ-Gebiete laufen müsste, halte ich den Ansatz “Besorge dir die Polygone und schneide per osmconvert oder osmosis die Daten aus” für leicht b… (*).

Sowas geht nur mit einer PostGIS-Datenbank und spatialen Abfragen.

Zudem frage ich mich: Was soll das? Ein Verzeichnis der Postleitzahlen kann man für wenig Geld bei der Post erwerben. Und eine andere Anwendung fällt mir gerade nicht ein.

Gruss
walter

*) hier schweigt des Dichters Höflichkeit :wink: