Umwandeln von associatedStreet-Adressen in addr:street

Kennt jemand eine bequeme Methode, Adressen, die mit der associatedStreet-Relation definiert sind, in das relationsfreie Schema mit addr:street zu konvertieren?

Der Hintergrund ist folgender: Ich habe in meinem Städtchen fleißig Hausnummern mit associatedStreet getaggt, weil mir das logischer vorkam. Außerdem sind für die betroffenen Gebiete PLZ-Multipolygone mit postal_code=##### definiert. Obwohl ich aus rein datentechnischer Sicht nach wie vor die Relation eleganter finde, möchte ich nun aus zwei Gründen auf das relationsfreie addr:street/postcode/city/country-Schema umstellen:

  1. Zur Unterstützung des normalen Schemas werden immer mehr Konsistenztools geschrieben, während die Relationen sehr stiefmütterlich behandelt werden (bspw. im OSM Inspector der Geofabrik).

  2. Wo ich bisher nur Knoten für die Gebäude hatte, kann ich jetzt mit Bing die Gebäudeumrisse als Flächen einzeichnen. Das JOSM-Plugin AddrInterpolation macht den Umgang mit der associatedStreet-Relation ganz einfach, solange es sich um Knoten handelt. Mit Flächen kann es dummerweise nicht umgehen. Und die Mitgliedschaft in einer Relation von einem Knoten auf eine Fläche zu verlegen und den Knoten dann zu löschen, ist relativ mühsam.
    Als Kompromisslösung bliebe, den vorhandenen Hausnummerknoten in den Gebäudeumriss aufzunehmen. Allerdings würde ich es bevorzugen, die Adressdaten direkt auf das Gebäude zu legen. (Ich weiß, damit sind wir beim nächsten Wespennest. Könnten wir es - zumindest hier - einfach in Ruhe lassen?)

Klasse wäre ein Tool, das den Straßennamen aus der associatedStreet-Relation nimmt, ihn als addr:street in alle house-Elemente einträgt und schließlich die Relation löscht. Wesentlich komplizierter wäre es vermutlich, die Postleitzahl aus dem postal_code-Multipolygon zu ermitteln, in dem ein Knoten liegt, und sie in addr:postcode einzutragen. Wenn das auch noch ginge, wäre das toll.

Natürlich bin ich auch für Hinweise dankbar, wie sich einer der Teilschritte effizient erledigen lässt.

Ein Funktion die Merkmale eines Knotens per CRTL-SHIFT-v für eine Fläche übernehmen kann wäre auch für anderes praktisch. Würde das nicht ausreichen?

Falls du mit JOSM arbeitest, was ich aus “JOSM-Plugin …” schliesse, ist es relativ einfach.

  • Relationsfenster anzeigen und aufklappen

  • Deine Relation in der Liste auswählen

  • Mit der rechten Maustaste das Kontextmenü und darin “Elemente der Relation selektieren” auswählen.
    Damit sind alle Straßen und Häuser der Relation ausgewählt.

  • Die Straßen mit CTRL-Klick abwählen. Übrig bleiben alle Häuser.

  • Dieser Auswahl jetzt die addr:= allen gemeinsam zuweisen.

  • Den Relationen Editor für deine Relation aufrufen.

  • Die immer noch ausgewählten Häuser in die Relation übernehmen.

  • Den neuen Häusern in der Relation die Rolle “house” zuweisen.

  • Die alten Knoten mit den Hausnummern aus der Relation entfernen.

  • Jetzt den Häusern einzeln ihre Hausnummer spendieren.

  • Die Knoten mit den Hausnummern löschen.

  • Fertig!

HTH
Edbert (EvanE)

Danke für die Anleitung. So etwas in der Art wäre mein Plan B.
Die Relation wird nicht mehr gebraucht, sobald den Häusern ihr addr:street zugewiesen ist. Damit erübrigen sich sogar die letzten Schritte.

Es geht allerdings um einige hundert Straßen. Das wird eine Menge Arbeit, wenn ich es von Hand mache. Und es besteht die Gefahr, Fehler reinzubringen.
Deshalb hatte ich gehofft, dass jemand schon mal vor einem ähnlichen Problem stand und Code rumliegen hat, der sich für so etwas anpassen lässt.

Leider nein. Die Mitgliedschaft eines Objekts in einer Relation wird mit CTRL-C / CTRL-SHIFT-V nicht übertragen. Deshalb mein Wunsch, erst den Straßennamen aus der Relation in ein normales Tag (addr:street) rüberzubringen. Danach kann ich dann in der Tat mit der genannten Tastenkombination ganz einfach alle Daten vom alten Knoten in die neue Gebäudefläche kopieren.

Im Relationen-Editor funktioniert das in der Tat nicht.
Wenn du die Relation jedoch per Doppel-Klick in der Relationen-Liste zum ausgewählten Objekt machst, stehen die Eigenschaften ganz normal im Eigenschaftsfenster. Sprich so sollte es gehen.

Allerdings wäre anzuraten, alles was nicht zu addr:= gehört vorher zu entfernen. Da du die Relation nach erfolgreicher Aktion löschen willst, sollte das kein neues Problem aufwerfen.

Edbert (EvanE)

OK, da haben wir etwas aneinander vorbeigeschrieben, weil ich der Meinung war, dass meine Relationen gar keine Tags enthalten außer type=associatedStreet und es somit nichts gibt, was man direkt kopieren könnte. Stellt sich raus, dass das nicht stimmt: Das AddrInterpolation-Plugin, das ich verwende, fügt automatisch das Tag name=<Straßenname> zur Relation hinzu. Das widerspricht eigentlich dem Grundgedanken der Redundanzfreiheit, weil der Name ja aus dem Relationsmitglied mit der Rolle street hervorgeht, erweist sich aber für meinen Zweck als Glücksfall.
Unter Einbeziehung deines Tipps hier mein revidierter Plan B:

  1. In JOSM alle associatedStreet-Relationen eines PLZ-Bereichs auswählen und bei allen gleichzeitig:
  • Den Schlüsselnamen name in addr:street ändern

  • Das Tag type=associatedStreet löschen

  • Die drei Tags addr:postcode/city/country hinzufügen. Nun enthält jede Relation nur noch die vier addr:-Tags.

  1. Nacheinander jede der Relationen auswählen und jeweils:
  • Die Tags der Relation kopieren

  • Alle Mitglieder der Relation auswählen (samt Straße)

  • Die Tags auf die Objekte kopieren

  1. Zum Schluss mit der Suchfunktion von JOSM alle *highway=**-Objekte auswählen und ihre addr:-Tags löschen

Auf die Weise brauche ich nicht zu jeder Straße den Relationseditor zu öffnen und die house-Objekt darin auszuwählen. Das sollte eine Menge Mausklicks sparen.

Das Ganze ist zwar immer noch eine Menge Arbeit, rückt aber so langsam in den Bereich des Erträglichen.

Sieht doch recht gut aus.
Auf Punkt drei (ein kleiner Umweg, der sich als Abkürzung herausstellt) wäre ich wahrscheinlich nicht gekommen. :slight_smile:

Edbert (EvanE)

Mit solchen Relationen habe ich mich bis jetzt noch nicht befasst.
Habe ich das so richtig verstanden?
Die Relation besteht am Ende aus:
addr: city xxx
addr: country xxx
addr: postcode xxx
addr: street xxx

Die Relation hat also letztendlich keinen Namen?

Die dazu gehörigen Objekte:

(house)
addr: city xxx
addr: country xxx
addr: postcode xxx
addr: street xxx
addr: housenumber xxx
building yes

(street)
highway residential
name xxx

Die Tags, addr: city, addr: country, addr: postcode,addr: street, erscheinen also in der Relation und im Objekt (house)?
Warum doppelt?
Da die Objekte ein Verbindung zur Relation haben, würde hier nicht addr:housenumber und building = yes genügen?

Gruß
Rainer

Äh, nein. Die Relation gibt es am Ende nicht mehr. Alle Adressdaten sind in Form von Tags an den einzelnen Häusern.
Wir haben hier nur diskutiert, wie man die Konvertierung am einfachsten abwickelt.

Genau. Das ist das Kernkonzept der associatedStreet-Relation. Aber aus den im OP erläuterten Gründen wollte ich davon aber weg.

Übrigens habe ich die Sache inzwischen nach der geschilderten Methode durchgezogen. Zur Optimierung der Abläufe habe ich vorher noch die Befehle Copy und Paste Tags auf Einzeltasten gelegt (E und R). Damit war ich binnen weniger Stunden durch 7 Postleitzahlengebiete mit fast 900 Straßen durch. Am längsten haben jeweils die Vorbereitungen gedauert, weil ich noch Interpolationen rumschwirren hatte und einige wenige Straßen über zwei Postleitzahlengebiete liefen. Beim Konvertieren selbst ist das anstrengendste, die Konzentration nicht zu verlieren.