Qualitätssicherung associatedStreet-Relationen

Hallo,

ich habe ja die Debatte entfacht und wambacher und weitere User haben lückenhafte []Beispiele]([url=http://forum.openstreetmap.org/viewtopic.php?pid=479417#p479417) und [Zahlen](http://forum.openstreetmap.org/viewtopic.php?pid=479747#p479747) für Müll in OSM gezeigt. Das habe ich gestern Abend und heute Morgen zum Anlass genommen, mal zu schauen, wie schlimm es ist. Ich habe gestern im den Stadt- und Landkreisen Karlsruhe und Heilbronn nach den associatedStreet-Relationen gesucht und jede einzelne manuell gesichtet. Ich möchte euch in diesem Beitrag von meinen Beobachtungen (es gibt keine genauen Messwerte, alles Gefühl/Schätzung/subjektive Eindrücke) schildern.

Um alle associatedStreet-Relationen eines Gebiets zu finden, nimmt man folgende Overpass-API-Abfrage. Das Beispiel zeigt den Landkreis Böblingen. Für einen anderen Landkreis muss man die Grenzrelations-ID austauschen. Das ist die ID der Grenzrelation in OSM addiert mit der Konstante 3600000000. Die ID der Grenzrelation kann man mit der Suchfunktion auf osm.org ermitteln und wird dann ganz groß angezeigt.

[out:json][timeout:25];( relation["type"="associatedStreet"](area:3600062721););out body;>;out skel qt;

Es empfiehlt sich nur auf Landkreisebene abzufragen, wenn man in einem Bundesland mit vielen Treffern arbeitet (z.B. Baden-Württemberg). Sonst stürzt euch der Browser ab bzw. wird unbedienbar. Ich empfehle (entgegen meiner Pro-Firefox-Haltung) für den Overpass-Turbo Chromium/Chrome.

Für die Stadt- und Landkreise Karlsruhe und Heilbronn war das mein Vorgehen. Grafisch habe ich mir im Overpass-Turbo einen Überblick verschafft und die Relation mit einem Blick in eine der folgenden Kategorien eingeteilt:
(1) vollständige Relation, die alle Häuser der Straße enthält. Konvertierungstipps siehe unten.
(2) Relation, die viele, aber nicht alle Häuser der Straße enthält → Die leidet am Sammelrelationssyndrom und habe ich sogleich durch addr:street an den Gebäude ersetzt und die Relation gelöscht. Kaputtes pflege ich nicht, wenn es einfacher (d.h. ohne Relationen) geht. Konvertierungs-/Reparaturtipps siehe unten.
(3) Terracer-Unfälle. Das Terracer-Plugin hat associatedStreet-Relationen erzeugt, die nur mit type=associatedStreet getaggt waren (keine weiteren Tags!). Man erkennt sie in der Relationsliste in JOSM (Alt+Shift+R) daran, dass sie als “Zugeordnete Straße (, 3 Elemente)” aufgeführt werden. Hätte die Relation ein name-Tag, würde statt ID der Straßenname in der Relationsliste stehen. Zur Reparatur siehe unten.
(4) Widerspruch zwischen Relation und addr:street=* an den Gebäuden. Tritt gern auf, wenn Eckhäuser, mit Terracer in zwei Doppelhaushälften geteilt wurden und eine Hälfte zur einen und die andere Hälfte zur anderen Straße gehört.
(5) Tennisplätze, z.B. http://overpass-turbo.eu/s/7e6 (kreativer Gebrauch des Terracer-Plugins)
(6) Abstruse Sonderfälle, z.B. http://overpass-turbo.eu/s/7e7

Nun zur Reparatur
(1) Vollständige Relationen umstellen
Das sollte man nur tun, wenn alle Mitglieder addr:street=* haben (dann ist die Relation nämlich überflüssig und belastet nur die Datennutzer und die Umwelt [1]) oder es sich um ein Gebiet mit freien Bauplätzen handelt, d.h. wo künftig noch neue Hausnummern hinzukommen und vermutlich wegen Unkenntnis nicht zur Relation hinzugefügt werden.

Um zu prüfen, ob alle Gebäude-Mitglieder der Relation ein addr:street=* haben öffnet man den Relationseditor für diese Relation und schaut die Mitgliederliste durch. Wenn das Mitglied ein addr:street=* hat, dann wird es als “Hausnummer 41 in Motorstraße” aufgeführt. Wenn das Mitglied amenity- oder shop-Tags hat, steht ggf. etwas anderes dran, dann muss man manuell prüfen (Rechtsklick auf den Eintrag → Zoomen auf Objekt).

Man sollte auch prüfen, ob alle Mitglieder denselben Wert in addr:street=* stehen haben. Dazu alle entweder im Relationseditor alle Gebäude markieren und dann im Frame “Auswahl” auf das zweite Icon von unten “Wählen Sie Objekte für die ausgewählten Relationsmitglieder” klicken. Nun sind diese ausgewählten Relationsmitglieder die Auswahl im JOSM-Hauptfenster. Wenn in der Tag-Liste addr:street= steht, dann ist ein Tippfehler drin, den man iterativ suchen kann (nach und nach einzelnen Gebäude aus der Auswahl ausnehmen). Wenn in der Tag-Liste addr:street=Motorstraße steht, ist alles in Ordnung.

Hat die Relation auch andere addr:street-Tags wie z.B. addr:postcode oder addr:city, sollte man sicherstellen, dass auch alle Mitglieder diese Tags haben, bevor man die Relation löscht. Gegebenenfalls ergänzt man fehlende Tags an den Mitgliedern.

Es gibt auch noch ein Verfahren, ohne den Relationseditor zu benutzen. Dazu muss man die Relation in der Relationsliste finden, den Eintrag markieren und dann im Kontextmenü des Eintrags auf “Elemente auswählen” klicken. Die Relation muss vorher vollständig heruntergeladen sein (geht auch über dasselbe Kontextmenü mit “Unvollständige Mitglieder herunterladen”). Mit gedrückter Strg-Taste entfernt man nun alle Straßen aus der Auwahl (meistens sind das nur ein bis vier Straßensegmente) und stellt sicher, dass in der Tag-Liste kein addr:street= aufgeführt wird.

Die Relation löscht man wie folgt: Wenn sie gerade in der Tag-Liste aufgeführt wird, weil eines ihrer Member markiert ist, klickt man rechts auf den Eintrag und wählt “In Relationsliste auswählen”, dort klickt man auf das Papierkorb-Symbol.

(2) Relation, die viele, aber nicht alle Häuser der Straße enthält
Zuerst stellt man sicher, dass alle ihre Mitglieder mindestens mit addr:street=<Straßenname> getaggt sind. Wenn alle Gebäude-Mitglieder der Relation ausgewählt sind (Methode siehe Abschnitt Fall (1)), sollte in der Tag-Liste kein addr:street= stehen. Dann ist entweder die Relation nicht vollständig heruntergeladen oder ein Mitglied hat einen anderen Straßennamen (siehe auch Fall (5)) oder ein Mitglied hat kein addr:street=*. Wenn jedes Mitglied addr:street=<Straßenname> hat, dann kann man die Relation löschen. (siehe Fall (1))

(3) Terracer-Unfälle
Dafür empfehle ich folgende Overpass-Abfrage (Beispiel für Landkreis Ludwigsburg, den ich heute morgen davon bereinigt habe):

[out:json][timeout:25];( relation["type"="associatedStreet"]["name"!~"."]["^addr:.*$"!~"."](area:3600062536););out body;>;out skel qt;

Bitte EDIT am Ende dieses Beitrags beachten!

Einfach das Gebiet zoomen, wo Treffer im Overpass-Turbo angezeigt werden, und dieses Gebiet in JOSM herunterladen. In der Relationsliste tauchen nun Einträge wie “Zugeordnete Straße (, 3 Elemente)” auf. Wenn man das Kontextmenü eines dieser Einträge aufruft und “Elemente auswählen” klickt, werden diese markiert. Mit der Taste 3 (auf Auswahl zoomen) zoomt man Auswahl. Ist keine Straße in der Relation enthalten, kann man sie löschen. Dazu in der Relatiosliste auf das Papierkorb-Symbol klicken.

Meist findet man in einem Wohngebiet mehrere solcher Exemplare. Dann wurde es von einem Mapper gemappt, der das Plugin mochte.

Ich habe auch von Terracer verursachte associatedStreet-Relationen gefunden, deren Mitglieder keine Adressen (Hausnummern hatten). Da die Relation keine Straße enthielt, habe ich die Relationen einfach gelöscht.

*(4) Widerspruch zwischen Relation und addr:street= an den Gebäuden **
Hier ist Nachdenken angesagt. Wenn der Widerspruch an einem Doppelhaus auftritt, schenke ich den addr:street=*-Tags am Gebäude mein Vertrauen und lösche die Relation (siehe oben). Wenn der Widerspruch an anderen Stellen auftritt, frage ich per Changeset-Kommentarfunktion nach. Mittlerweile ist der Botlauf fertig, sodass man für seine Changesets aus Urzeiten noch Benachrichtigungsmails über Kommentare erhält. Ich richte mir in Thunderbird-Lightning für jeden kommentierten Changeset eine Aufgabe ein, um nach einer Woche selbst Hand anzulegen, wenn der Mapper nicht antwortet. Sollte ein Mapper in solch einem Fall nicht antworten, kann man entweder den Tags am Gebäude Vorrang geben oder beide Adressen eintragen oder eine OSM-Note anlegen oder nochmal nachhaken.

(5) Tennisplätze
Diese Relation habe ich gelöscht. Methodik siehe oben.

(6) Abstruse Sonderfälle
Diese Relation habe ich aufgelöst. Methodik siehe oben.

Ich bitte euch, meinem Beispiel zu folgen und in eurer Gegend Selbiges zu tun.

In der Stadt Karlsruhe habe ich gefühlt die Hälfte der Relationen in die Kategorien (2) und (3) einteilen können und durch einfacheres Mapping ersetzt. Der Rest der Relationen fiel in die Kategorie (1) und wurde von mir ebenfalls meistens gelöscht. Im Landkreis Karlsruhe habe ich einige Relationen stehen lassen, da sie vollständig waren und die Gebäude kein addr:street=* trugen. Im Landkreis Heilbronn habe ich ca. 95 % gelöscht, 1 Relation gibt es jetzt noch in Weisberg. Im Stadtkreis Heilbronn gab es nur zwei Relationen, den Tennisplatz und eine unvollständige. Im Landkreis Ludwigsburg (besonders Raum Gerlingen) gibt es noch viel zu tun. Den größten Müll (kaputte Relationen, d.h. Fall 2–4 und 6) habe ich aber schon weggeräumt.

Viele Grüße

Michael

PS Diese Abfrage habe ich noch nicht ausprobiert.

[1] Durch Erhöhung des Rechenaufwands für Auswerter wie Nominatim werden mehr Treibhausgase für die Erzeugung elektrischer Energie und die Kühlung der Rechenzentren ausgestoßen. :slight_smile:

EDIT: Bessere Query nach Terracer-Unfällen:

[out:json][timeout:25];( relation["type"="associatedStreet"]["name"!~"."]["addr:street"!~".*"](area:3600062536););out body;>;out skel qt;

Das Rumgefrickele mit der Id finde ich nicht so doll, das geht doch auch besser! Beispiele dafür gibt’s zuhauf.

Das geht so nicht, Negation lässt sich nicht mit regulären Ausdrücken im Key kombinieren. Außerdem fehlt das einleitende “~” vor dem Key, wenn es unterstützt wäre.
So wird ^addr:.*$ nicht als regulärer Ausdruck, sondern einfach als normaler Key angesehen.

Das manuelle Suchen ist nicht wirklich notwendig, das macht genau die Query im Wiki: sie ignoriert die Relationen, die einen Way mit Rolle “street” oder auch mit leerer Rolle haben.

done. :sunglasses: (die beiden Freunde da hatte jemand nach dem Aufräumen im letzten Jahr wieder neu angelegt. Die lasse ich mal vorübergehend noch als Andenken an schlechte Zeiten stehen.)

Und, wieviel Promille der Relationen waren korrekt? :sunglasses:

In Karlsruhe eigentlich nur alle Relationen im Stadtteil Weiherfeld (ca. 12 Stück). Ich habe sie aber gelöscht, da die Member alle schon addr:street=* hatten.

Den hier würde ich ja auch einfach löschen: http://www.openstreetmap.org/relation/1946917
Irgendwelche Einwände?

Die Terracer Query in #1 ist übrigens nicht so ganz ok, siehe #2.

Moin!

Ich kenne die Pro- und Contra-Argumente für associatedStreet-Relationen. Ich nutze sie nicht.
Die Adresssuche funktioniert offensichtlich auch ohne diese Relationen.
Dennoch enthalten sie Informationen, die nur mit “addr:street” nicht vorhanden sind, etwas welche highway-Objekte zu einer Straße gehören.
Manche Fragen wie “Welche Straßennamen kommen doppelt in einer Gemeinde vor?” lassen sich nur oder sehr viel einfacher mit Relationen auswerten.
Ich bin überzeugt, dass wir mittelfristig eine Datenstruktur pro Straße brauchen (ohne dass ich mich auf einen der bisherigen Vorschläge festlegen will).

Vorhandenen Daten zu löschen ohne zumindest die Information über den Zusammenhang der highway-Objekte zu erhalten finde ich falsch.

Defekte Daten wie (3)-(6) zu korrigieren oder zu löschen ist natürlich eine gute Tat.
Korrekte Datenstrukturen, die keine Widersprüche verursachen und von vielen Mappern genutzt werden, zu löschen finde ich sehr problematisch.
Dafür ist zumindest ein allgemeiner Konsens im gesamten Projekt, d.h. international nötig.
Ein Meinungsbild in einem Thread des deutschen Forums, in dem es ursprünglich um das Üben von Relationen durch Anfänger ging, genügt nicht.

Mit diesem Argument könnte man sehr viele Daten in OSM löschen.
Insbesondere könnte man die vielen “addr:street”-Tags löschen, da eine einmalige Speicherung des Namens pro Straße viel Redundanz spart :wink:

Eine Anwendung, die die associatedStreet-Relationen nicht auswertet, dürfte nicht nennenswert betroffen sein.

Ich bin für eine Löschung. Dieselben Infos sind ja auch schon an alle Mitglieder (außer ein paar hausnummernlose Gebäude) getaggt. Es geht keine Information verloren.

Ich werde die Relationen im Norden von Rheinland-Pfalz übernehmen, aber vorher die Ersteller anschreiben.
Es sind teilweise ausser der Hausnummer keine addr:* gesetzt, ich muss dann alles übernehmen

Vorhandenen Daten zu löschen ohne zumindest die Information über den Zusammenhang der highway-Objekte zu erhalten finde ich falsch.

Die Anzahl der Banken mit Filiale in Mannheim lässt auch leichter ermitteln, wenn alle Banken eine Relation für alle ihre Filialen haben. :slight_smile: Ich kann dir da nicht zustimmen. Ob es einen Straßennamen zweimal gibt, kann man nicht eindeutig bestimmen – weder als Mapper, der das street-Relationen festlegt, noch als Auswerter der mit räumlichen Abfragen arbeitet. Ich habe mehrere Straßen jetzt gesehen, die an einer Querstraße enden. Folgt man der Querstraße 10 bis 30 Meter geht die endende Straße weiter (d.h. um der Straße zu folgen biegt man links und gleich danach wieder rechts ab, Beispiel). Genauso unsicher, wie ein Mapper das tut, kann das auch ein Computerprogramm tun. Es handelt sich nämlich um Sammelrelationen, deren Vollständigkeit nie garantiert ist.

Es spart Redundanz und erhöht den Aufwand für Auswerter erheblich. Siehe auch die Aussage der Nominatim-Maintainerin Sarah Hoffmann dazu. Der OpenStreetMap Inspector der Geofabrik unterstützt (vermutlich um Rechenleistung zu sparen) z.B. keine associatedStreet-Relationen.

Ja, das stimmt. Aber es gibt halt mehr als eine Anwendung die Geocoding macht, z.B. OsmAnd. Ich will nicht wissen, wie zeit- und RAM-intensiv das Erstellen des Adressindex gerade deshalb ist, weil wir in Deutschland noch weit über 15.000 solche Relationen haben.

In JOSM kannst du die Relation markieren (die Mitglieder sind dann rosa einfärbt) und in der Tag-Liste am rechten Rand (nicht im Relationseditor, sonden im Hauptfenster!) die Tags addr:street=, addr:city= usw. markieren, Rechtsklick und auf “Ausgewählte Tags kopieren” klicken. Dann markierst du in der Relationsliste (oder wenn die Relation gerade in der Tagliste aufgeführt wird) die Relation, klickst rechts darauf und klickst auf “Elemente markieren”. Nun Bearbeiten → Tags einfügen. Fertig.

Danach ist die Relation überflüssig.

Für Duplikatsrelationen habe ich mir auch eine Abfrage gebastelt. Sie sucht alle associatedStreet-Relationen, deren house-Member alle schon mit addr:street=* getaggt sind. Das heißt, die Relation ist unnötig er Ballast.

    /* Hier zunächst die Stadt/Region/etc. festlegen */
    {{nominatimArea:Karlsruhe}}
    (._; )->.area;
     
    /* Alle associatedStreet-Relationen in dieser Stadt ermitteln, die auch ein addr:street=* haben */
    rel[type=associatedStreet]["addr:street"](area.area)->.allASRelationsWAddrStreet;
     
    /* Ermittle alle associatedStreet-Relationen mit addr:street=*, in denen ways mit Rolle "house" vorkommen. 
        Diese Member haben kein addr:street=* */
way["addr:street"!~".*"](r.allASRelationsWAddrStreet:"house");rel(bw:"house")["type"="associatedStreet"]
["addr:street"]->.relationsWithRoleHouseAndWOAddrStreetW;

    /* dto. für Nodes */
node["addr:street"!~".*"](r.allASRelationsWAddrStreet:"house");rel(bn:"house")["type"="associatedStreet"]
["addr:street"]->.relationsWithRoleHouseAndWOAddrStreetN;
     

    /* Jetzt die Differenz aller Mengen bilden */
   ( (.allASRelationsWAddrStreet; - .relationsWithRoleHouseAndWOAddrStreetW;); - .relationsWithRoleHouseAndWOAddrStreetN;);
     
    /* Wege und Nodes dazu und raus damit*/
    (._; >>;);
    out meta;

Nicht mal auf die Rollen kann man sich verlassen: ein Highway als “house”!?!? http://www.openstreetmap.org/relation/174186

Müssen wir jetzt erstmal validieren, ob die Nodes/Ways in den Membern auch ihrer Rolle entsprechen, bevor wir mit weiteren Queries auf den Daten arbeiten?
Und was ist mit den ganzen Relation Member, die erst gar keine Rolle haben?

Weitere Ungereimtheit: http://www.openstreetmap.org/relation/2092984 → Wiki sagt: Rolle “street” darf nur Ways enthalten - hier hat aber jemand einen highway=turning_circle Node auch mit Rolle “street” getagt. Das finde ich gar nicht mal so unlogisch…

aS ist echt so ein Murks…

Dein Vergleich passt nicht. Banken mit gleichem Namen / Operator gehören eindeutig zusammen, highways mit “name=Dorfstraße” in einer Gemeinde manchmal nicht.
Ich behaupte, dass ich als Mensch besser als dein Programm bin. Beweise, dass das Gegenteil. Lass mich gegen dein Programm antreten.
Ein Mapper hat oft weitere Informationen, z.B. Kenntnis alter Gemeindegrenzen oder Zeitungsartikel zu doppelten Straßennamen bei Gemeindezusammenschlüssen.
Selbst wenn dein Programm existieren würde und perfekte Ergebnisse erzielte, müsste es jeder lokal installieren und laufen lassen, um zusammengehörige Straßen zu bestimmen.

Jeder Anwender kann frei entscheiden, ob er associatedStreet-Relationen auswerten will, auch Nominatim.
Viele Anwendungen nutzen den Straßennamen in Adressen nicht und würden von kleineren Daten profitieren.
Manche Anwendungen brauchen ganze Straßen als Objekte.

Du kannst erst einmal alle defekten Daten aus (3)-(6) löschen.
Bevor du Daten unter Informationsverlust systematisch löscht, brauchst du m.E. die Zustimmung der Ersteller oder einen allgemeinen Konsens.
Bitte diskutiere dein Vorhaben auf der Tagging Mailingliste bevor du weitere korrekte Relationen entfernst.

Den Aufruf, alle associatedStreet-Relationen zu löschen, als “Qualitätssicherung associatedStreet-Relationen” zu bezeichnen ist ein Euphemismus.

Ich habe mir Südbrandenburg vor 2 Tagen angeschaut. Es waren eh wenige und es waren alles Fragmente… Eine Straße, ein Haus oder wenige Straßensegmente wenige Häuser. Alle Häuser hatten zudem sie Adresse am Objekt entsprechend dem Karlsruher Schema…

Meiner Ansicht war es kein Verlust auf diese Fragmente zu verzichten…Korrekt und vollständig war keine. Also Ratzeputz.

Sven

Knaller sind auch die relationen mit name=street;plz;ort

Kann man irgendwie nach ; in name= filtern?

Wenn ich auf aS-Fragmente und sonstige Datenleichen stoße, entsorge ich sie.
Größere Relationen bearbeite ich nicht, lösche sie aber auch nicht. Wer möchte, darf sie verbessern.

Ein spezielles Beispiel, wo aS ein Problem sogar etwas eleganter lösen:
In Mannheim haben recht oft Eckhäuser zwei Adressen, ob sie auch zwei Eingänge haben, weiß ich nicht.
Der Umriss bekommt deshalb keine Adresse, ich lege dafür zwei Knoten mit je einer Adresse in den Umriss.
Das Haus könnte aber dagegen problemlos Mitglied in zwei aS-Relationen sein, ohne “künstliche” Adressknoten.

Grade festgestellt, dass man mit JOSM sehr einfach Fragmente findet, indem man die overpass daten von einem größeren Gebiet läd und dann steht in Klammern ja immer die member anzahl der relationen… <5 ist da immer ein gutes Indiz und unter 10 ist die Müll quote auch recht hoch. Zudem sieht man auch schnell solchen Spass wie 3 relationen für 1 Straße.

Edit:
Sagte ich 3? http://www.openstreetmap.org/user/AndiG88/diary/34269

Ich putze gerade größere Mengen unnütziger aS-Relationen in DE, so wie die hier: http://www.openstreetmap.org/relation/3374004/history
Die Changesets sollten hoffentlich aussagekräftig genug sein, Link zur Query ist jeweils im source-Tag zu finden.

Das mag ja sein. Aber die Hausnummer wird ja wohl nicht die gleiche sein.

Mit der Lösung funktionierts.

Das ist aber nicht Aufgabe von associatedStreet-Relationen. Und zu diesem Zweck sind sie auch nicht angelegt, deswegen würde ich auch nie diese Relationen für solche Fragestellungen zweckentfremden. Wenn man glaubt, Fragen socher Art beantworten zu müssen, muss man eben für genau diesen Zweck ein geignetes Tagging-Schem einführen

Man sollt sich halt entscheiden, ob man streng nach der Theorie eines relationalen Datenmodells vorgehen will und die damit verbundenen Nachteile oder pragmatisch die mehrfache Speicherung des gleichen Wertes in Kauf nimmt und damit die Komplexität und den Auswerteaufwand verringert.

Auf Fälle vermeiden sollte man aber, den gleichen Sachverhalt, hier also ein und dieselbe Adresse, auf verschiedene Weise darzustellen und das auch noch gleichzeitig. Es würde viles vereinfachen, wenn man sich auf eine Methode einigen könnte, dann müssten sich weder Mapper noch Datennutzer sich verschieden Herangehensweisen herumschlagen.

Was wird zerstört, wenn die Informationen aus der Relation in die Einzeladressen übernommen werden und die Relation dann überflüssig ist?

Wenn man sich in D z.B. einigt, auf associatedStreet-Relationen möglichst zu vezichten, warum ist dazu ein allgemeiner Konsens im gesamten Projekt notwendig? Und was ist ein allgemeiner Konsens? Gibt des dazu eine Abstimmung, ist Einstimmigkeit notwendig, ist ein erfülltes Quorum Voraussetzung?