User:Stephan75

From OpenStreetMap Wiki
Jump to navigation Jump to search

Entwurf für Neuauflage der Wochenaufgabe Straßennamen

Textentwurf

Um die Qualität der OpenStreetMap-Daten (auch über längere Zeit) zu kontrollieren, gibt es ja inzwischen viele Möglichkeiten. Das OSM-Wiki hält unter der Seite DE:Qualitätssicherung bzw. Quality assurance eine Sammlung dazu bereit.

Ein Spezial-Thema waren in diesem Zusammenhang schon immer die konkreten postalischen Adressen von Objekten. In welcher Art diese Adressen in den OSM-Daten zugewiesen werden, ist unter DE:Addresses und DE:Karlsruhe Schema dokumentiert, eventuell haben die jeweils englischsprachigen Versionen der Wikiseiten einen aktuelleren Stand.

Zwischen den wirklich schon zahlreich vorhandenen Objekten mit diesen Adressdaten finden sich jedoch immer wieder einige Ausreißer, denen nur eine Hausnummer zugewiesen wurde, jedoch keinerlei weitere Zuordnung zu einer Straße oder einer anderen örtlichen Instanz (damit sind z.B. Dörfer gemeint, welche so klein sind, dass es keine eigenen Straßennamen gibt.)

Für Programme wie Navigations-Apps oder Online-Adress-Suchdienste sind diese Objekte mit "nur" einer Hausnummer nicht nutzbar und quasi verloren.

In der Vergangenheit gab es bereits Aktionen, um diese unvollständigen Adressdaten aufzuspüren und zu verbessern:

Generell: Was macht in den OSM-Daten eine vollständige Adresse aus?

Nach aktueller Definition sollte neben der Hausnummer eines der drei Ergänzungen vorhanden sein:

  • addr:housenumber=* mit addr:street=*
  • addr:housenumber=* mit addr:place=* bei Dörfern, die aufgrund ihrer geringen Größe keine eigenen Straßennamen haben.
  • addr:housenumber=* mit Zugehörigkeit zu einer Relation des Typs "associatedStreet"
Aktuelle Möglichkeiten

Bei einem Blick auf die gebräuchlisten OSM-Karten z.B. über openstreetmap.org werden die Objekte mit den "straßenlosen" Hausnummern zwar angezeigt, dass die weiteren Informationen aber hier und da fehlen, sieht man dort nicht. Um diese unvollständige Objekte zu finden und deren Daten zu ergänzen, bietet sich beispielsweise folgende Vorgehensweise an:

  • Die aktuell wohl beste Quelle für unvollständige Adressen in Deutschland ist wohl folgende Online-Karte: https://maps.aimpulse.com/osm/addresses/ (wird ca. wöchentlich aktualisiert) ... dort unten rechts auf den Layer "Adressen ohne Straße" wechseln, sodass die Landkreise je nach Quantität in gelb, orange oder rot dargestellt werden. Damit haben wir auf einen Schlag eine bundesweite Übersicht auf Basis der Landkreise und der Anzahl der unvollständigen Adress-Objekte.
  • Mit den aus der Karte ablesbaren Namen der Landkreise lässt sich dann eine overpass-turbo-Abfrage anpassen, welche dann die genauere Lage der einzelnen Treffer für einen einzelnen Landkreis anzeigt. Je nach Einzelfall kann man dann in der overpass-turbo-Abfrage dann auch statt dem Landkreisnamen auch der Name einer einzelnen Gemeinde angeben, um so die Treffer bei lokalen Häufungen noch einzugrenzen.

Die Abfrage zum Füttern von http://overpass-turbo.eu lautet zum Beispiel:

{{nominatimArea:"Landkreis Harburg"}}
(._; )->.area;

/*zunächst alle Häuser mit Hausnummer, aber ohne Straße oder addr:place in der aktuellen bbox in "allHouses" sammeln */
/* (statt (area.area) auch ({{bbox}}) möglich!) */
way(area.area)["addr:housenumber"]["addr:place"!~"."]["addr:street"!~"."]->.allHouses;

/* In der BBOX alle associatedStreet Relationen ermitteln */
rel(area.area)[type=associatedStreet]->.associatedStreet;

/* und darin alle Wege mit der Rolle "house" in "asHouse" sammeln */
way(r.associatedStreet:"house")->.asHouse;

/* Jetzt die Differenz der beiden Mengen bilden, Nodes dazu und ausgeben */
((.allHouses; - .asHouse); >; );out;

/* Jetzt das ganze noch für Nodes: */
node(area.area)["addr:housenumber"]["addr:place"!~"."]["addr:street"!~"."]->.allHousesNode;
node(r.associatedStreet:"house")->.asHouseNode;
((.allHousesNode; - .asHouseNode););out;

Dieser "Quellcode" sollte in den linken Bereich (diesen ggf. vorher löschen) auf overpass-turbo.eu eingefügt werden. Bei der Definition von "nominatimArea" kann jeder beliebige Name einer geschlossenen Gebietsrelation eingefügt werden, wie Landkreise, Gemeinden, Stadtteile.

  • Wenn overpass-turbo nach Ausführen der Abfrage die Treffer anzeigt, kann man diese über die dortige Exportfunktion direkt in JOSM reinladen, wenn in dem parallel gestartetem Editor JOSM die sog. Remote-Funktion aktiviert ist. (Dabei kann es aktuell innerhalb von JOSM zu Timeout-Meldungen kommen.)
  • Wenn nicht schon geschehen, so bietet sich spätestens nun das Aktivieren des Kartenstils "Coloured Streets" in JOSM an, da dieser u.a. schon gleich Objekte mit fehlenden addr:street hervorhebt. Siehe https://josm.openstreetmap.de/wiki/De:Styles/Coloured_Streets
  • Um die nun rot hervorgehobenen Objekte sollten nun die normalen OSM-Daten aus der unmittelbaren Umgebung heruntergeladen werden, denn daraus können sich Straßennamen und bereits vollständige Hausnummern in der Umgebung herleiten.
  • Hat man nun in JOSM eine ganze Serie von Adress-Objekten mit fehlendem addr:street-Merkmal lokalisiert, so können diese wie folgt am effektivsten einer einzelnen Straße zugeordnet werden:
    • alle relevanten Objekte (bei Gebäuden bitte ohne die Eckpunkte) mit Strg-Taste und Mausklick auswählen.
    • Die Merkmale der gewählten Objekte werden nun im rechten JOSM-Bildschirm unter dem Teilfenster "Merkmale / Mitgliedschaften" dargestellt.
    • Am oberen Rand dieses Teilfenstern findet sich nun ein klickbarer Verweis auf die JOSM-Vorlage "Anmerkungen / Adressen" mit der weis-blauen Zahl 41 als Symbol. Dieses Symbol anklicken.
    • In der sich dann öffnenden Vorlage kann man durch 1x Tab-Taste auf das Feld für den Straßennamen wechseln.
    • Durch Eingabe des vorher lokalisierten zutreffenden Straßennamens (Groß-/Kleinschreibung beachten!) gibt JOSM nach einigen Buchstaben schon in Betracht kommende Vorschläge.
    • Sobald der zutreffende Straßenname unter addr:street (alternativ der Dorfname unter addr:place) steht, einfach mit der Enter-Taste die Änderung für alle vorher ausgewählten Objekte bestätigen, und: fertig!

Hinweise für die Praxis:

  • Für bestimmte Bundesländer stehen Hintergrundkarten zur Verfügung, aus denen legal Informationen für OSM-Zwecke entnommen werden dürfen. Neben den ALKIS-Layern mit Hausnummern für NRW gibt es ähnliche Layer für Hamburg (Hausnummern, Gebäude, Straßen+Namen) und Mecklenburg-Vorpommern (Offene Regionalkarte, auch ORKa genannt, mit Hausnummern und Gebäuden aus den Katasterdaten und Straßen aus OSM). Diese Ebeben lassen sich in JOSM über das Menü "Hintergrundbild" einblenden.
  • Hilfreich können generell noch die JOSM-Plugins HouseNumberTaggingTool und FixAddresses sein.
  • Generell gilt: Bitte die fehlenden Straßen- oder Ortsnamen nur mit großer Sorgfalt einfügen, d.h. man sollte sich schon sehr sicher sein, anhand der Daten in der Umgebung die richtigen Namen zuzuweisen. Im Zweifelsfall lieber einmal mehr z.B. im OSM-Forum nachfragen, wie andere Mapper jeweils einen konkreten Fall beurteilen würden.
  • und: bitte keine illegalen Quellen für Straßennamen nutzen!

Alternative Qualitätskontrollen:

  • Der Address-Layer vom OSM-Inspector (via geofabrik.de) hat folgende Schwächen: er wertet keine associatedStreet-Relationen aus, und er beachtet addr:place (als Ersatz für addr:street) bisher nicht. Für beides gibt es offene github-Issues. Der JOSM-Mappaint-Stil ColouredStreets, der JOSM-Validator und die Onlinekarte von Aimpulse (s.o.) beachten diese Feinheiten bereits.
  • Zur Qualitätskontrolle bietet u.a. Osmose inzwischen auch eine Kategorie "addr", welche dann z.B. doppelte Hausnummern, sowie addr:housenumber ohne addr:street/place oder ohne associatedStreet-Relation anzeigt.
  • http://osm.lyrk.de/address ... auch hier ist fraglich, ob addr:place und associatedStreet-Relationen ausgewertet werden.

Bisher gab es auch bei einigen Straßenzügen mit Hausnummern ohne Straßenzuordnung eine Konstellation, dass die reinen Hausnummern von Mappern erfasst wurden, die von der "Notwendigkeit" des zusätzlichen addr:street-Schlüssels (oder vergleichbar addr:place) nicht so richtig Kenntnis hatten. Für ein pädagogisch wertvolles Vorgehen bietet sich auch die Möglichkeit, diese Mapper z.B. über die Changeset-Diskussionen anzuschreiben, vielleicht mit dem Hinweis auf diese oder die vorherigen Wochenaufgaben zwecks Erklärung.

META: was ist vor Veröffentlichung noch zu klären?
  • Screenshots von aimpulse-Karte und JOSM mit Coloured-Street-Style fertigen. DONE, schon im Wordpress.
  • Nachricht an gehrke und thefive wegen Beginn der Statistik, und deren OK abwarten.
  • gehrke fragen ob Aktualisierung der Karte auf aimpulse.com für einige Wochen täglich statt wöchentlich möglich ist.
  • Bei Beginn der Wochenaufgabe dann Thema im Dt. OSM-Forum aufmachen für Einzelfragen.
  • Ausweitung auf Schweiz und Österreich denkbar?




Grenzrelationen reparieren laut gormo (Copy+Paste aus OSM-Forum) :

Mein Reparatur-Workflow sieht so aus (allerdings habe ich lange nix gemacht):

  • Kandidaten aus Walters Liste suchen
  • Relations-ID bei http://ra.osmsurround.org/ eingeben,wenn einfacher Fehler (d.h. ich sehe, dass nur eine Verbindung fehlt)
  • dann laden der Relation mit JOSM und laden aller Daten an der Fehlerstelle
  • mit dem JOSM-Relationseditor angucken, wo die Relation genau unterbrochen ist
  • in http://overpass-turbo.eu/s/dz4 die Relations-ID eingeben, evtl. Datum anpassen damit angucken, wie es vorher (und angenommen korrekt) war
  • in JOSM die Wege angucken und gucken, wie ich die Lücke in der Grenze am Besten geschlossen kriege (weg splitten, neuen reinen Grenzweg einführen, ...)
  • mit dem JOSM-Relationseditor die Grenze an der korrekten Stelle wieder schließen. Korrekte Role setzen nicht vergessen.

Sammlung von Overpass-Turbo Abfragen zur Qualitätssicherung

Grenzrelationen mit level=8 ohne place-Node mit gleichem Namen:

area[admin_level=4]["name"="Schleswig-Holstein"][boundary=administrative]->.boundaryarea;
rel(area.boundaryarea)[admin_level=8];
map_to_area -> .all_level_n_areas;
node(area.boundaryarea)[place][name];
is_in;
area._[admin_level=8] -> .level_n_areas_with_placenode; 
(.all_level_n_areas; - .level_n_areas_with_placenode; ) ; 
rel(pivot);
out geom;

Finde Objekte a) innerhalb einer Gemeindegrenze mit name=yxz, b) mit einem Tag addr:city=* , wobei der Wert von addr:city UNGLEICH dem Namen der Grenzrelation ist

{{ort=Seevetal}}  /* hier einen beliebigen Gemeinde- oder Städtenamen eingeben */
area[name={{ort}}]->.a;
(node(area.a)["addr:city"]["addr:city"!={{ort}}];
way(area.a)["addr:city"]["addr:city"!={{ort}}];)
;out meta;

Lösung hierfür: meistens ist hier der Name von Ortsteilen enthalten, diese aber besser unter addr:suburb erfassen.

Wo hat ein Weg des Typs highway=xxx eine Verbindung mit einem Weg highway<>xxx ?

http://overpass-turbo.eu/s/5Qz ... siehe http://forum.openstreetmap.org/viewtopic.php?id=27551

Landuse, place, street mit addr:* Daten

http://overpass-turbo.eu/?w=(addr:street=*+or+addr:city=*+or+addr:postcode=*)+and+(landuse=*+or+highway=*+or+boundary=*)

Hausnummern ohne addr:street

Ways oder Nodes mit addr:housenumber aber OHNE addr:street, unter Ausschluss von Elementen von associated-street-Relationen:

{{nominatimArea:"Landkreis Harburg"}}
(._; )->.area;

/*zunächst alle Häuser mit Hausnummer, aber ohne Straße oder addr:place in der aktuellen bbox in "allHouses" sammeln */
/* (statt (area.area) auch ({{bbox}}) möglich!) */
way(area.area)["addr:housenumber"]["addr:place"!~"."]["addr:street"!~"."]->.allHouses;

/* In der BBOX alle associatedStreet Relationen ermitteln */
rel(area.area)[type=associatedStreet]->.associatedStreet;

/* und darin alle Wege mit der Rolle "house" in "asHouse" sammeln */
way(r.associatedStreet:"house")->.asHouse;

/* Jetzt die Differenz der beiden Mengen bilden, Nodes dazu und ausgeben */
((.allHouses; - .asHouse); >; );out;

/* Jetzt das ganze noch für Nodes: */
node(area.area)["addr:housenumber"]["addr:place"!~"."]["addr:street"!~"."]->.allHousesNode;
node(r.associatedStreet:"house")->.asHouseNode;
((.allHousesNode; - .asHouseNode););out;

nutzlose fehlerhafte Relationen vom Typ associatedStreets

/* choose here any area for that query that can be found by Nominatim */
{{nominatimArea:"Bayern"}}
(._; )->.area;

/* find all relations of type=associatedStreet */
rel[type=associatedStreet](area.area)->.allASRelations;

/* now find all relations of type=associatedStreet, that have a way as member with role "street" */
way(r.allASRelations:"street");rel(bw:"street")[type=associatedStreet]->.relationsWithRoleStreet;

/* Calculate the difference of these two data pools */
(.allASRelations; - .relationsWithRoleStreet;);

/* choose ways and nodes of that result and display it */
(._; >>;);
out meta;

nochmal aS-Relationen

Folgende Abfrage für overpass turbo liefert associatedStreet-Relationen, deren name-Wert andere als die angegebenen Zeichen enthält oder wo das name-tag fehlt. Die Ergebnisse können nach JOSM exportiert werden.

<osm-script output="xml">
  <union>
    <query type="relation">
      <bbox-query {{bbox}}/>
      <has-kv k="type" v="associatedStreet" />
      <has-kv k="name" regv="^[-A-Za-zÄÖÜäöüß \.\']{1,}$" modv="not"/>
    </query>    
  </union>
  <union>
    <item/>
    <recurse type="relation-relation"/>    
  </union>
  <union>
    <item/>
    <recurse type="down"/>    
  </union>
  <print limit="" mode="meta"/>
</osm-script>


veraltet: doppelte Grenzrelationen zu Postleitzahlen in Deutschland

Anlass für die folgende Tabelle ist dieses Thema im OSM-Forum: http://forum.openstreetmap.org/viewtopic.php?id=21683

Eine step-by-step-Anleitung zum Erzeugen dieser Tabelle:

  1. die OSM-Daten für Deutschland als PBF-Datei von geofabrik.de herunterladen
  2. mittels osmconvert.exe in das o5m Format umwandeln
  3. mittels osmfilter.exe -v germany.o5m --drop-nodes --drop-ways --ignore-dependencies --keep-relations="postal_code= and boundary=" -o=plz.osm einen Filter angewandt, welche nur noch alle Relationen OHNE Wege und Nodes behält, welche die Schlüssel postal_code= UND boundary= haben.
  4. dann wieder mit osmconvert.exe eine CSV-Datei erstellt: osmconvert.exe plz.osm -o=plz.csv --csv="@id postal_code note name" --csv-headline ...damit erhält man eine "Tabelle" mit der OSM-ID jeder Relation, dem jeweiligen Wert von postal_code=, note= und name=
  5. nun die erstellte CSV-Datei in eine beliebige Tabellenkalkulation importieren, wie z.B. LibreOffice.
  6. Dabei auf folgendes achten: Text ist in UTF-8-Kodierung ... und die Spalten für postal_code, note und name sollten schon gleich das Format "Text" zugewiesen bekommen, denn sonst wird u.U. von z.B. Postleitzahlen mit führender Null eben diese weggekürzt.
  7. Dann zwischen die Spalten postal_code und note eine neue leere Spalte einfügen, nennen wir sie mal Spalte C mit dem Spaltenkopf "doppelt"
  8. In Spalte B (postal_code) finden sich nun alle fünfstelligen Postleitzahlen, die in Deutschland an irgendwelchen Grenzrelationen hängen.
  9. die gesamte Tabelle nun nach der Spalte "postal_code" aufsteigend sortieren.
  10. In der Zelle C2 (Spalte "doppelt") nun folgende logische Formel einfügen: =WENN(ODER(B2=B3;B2=B1);1;"") Diese Formel zeigt eine 1 in der Spalte C, wenn zwei gleiche PLZ in der Spalte B vorhanden sind.
  11. Jetzt für die gesamte Tabelle einfach den "AutoFilter" einschalten (Menü: Daten) ... in Excel oder anderen Programmen müsste es diese Funktion auch geben ... und den Filter für Spalte "doppelt" dann so einstellen, dass er nur noch Zeilen mit dem Wert 1 zeigt ... Tadaaa !!!
  12. Somit haben wir nun eine Liste aller Grenzrelationen in Deutschland, die einen Wert bei postal_code=XXXXX haben, und dieser Wert kommt noch bei mindestens einer weiteren Relation vor. (Denn nach meinem Verständnis sollte in den OSM-Daten eine Grenzrelation zu einer bestimmten Postleitzahl nur genau ein mal vorkommen, und nicht doppelt.)
  13. Ergebnis: Derzeit (Datenbestand 2013-10-11) haben wir noch zu genau 325 (am 04.07.2013 waren es noch 480 Stück) betroffenen Postleitzahlen doppelte oder sogar mehrfache Grenzrelationen.
  14. Damit man diese Doppelungen nun sich anschauen kann, hab ich zwei weitere Spalten rechts angefügt und dort mit dem Calc-Befehl VERKETTEN jeweils eine URL zu jeder Relation unter osm.org sowie eine URL zur Darstellung via OverpassAPI gebastelt.

Es hat sich gerade bei der Darstellung in OverpassAPI gezeigt, dass es wohl etliche identische doppelte Relationen für bestimmte Orte gibt. Ich glaube diese Gebiete erkennt man daran, dass diese dort in einem kräftigeren Gelb-Ton angezeigt werden, oder?

Eine Tabelle lässt sich dann z.B. via "csv2wp" von CSV in eine Wikimedia-Tabelle umwandeln (copy&paste).

Gleiche Abfrage aus einer OSM-Datenbank

Zwischenzeitlich hat sich im OSM -Forum ein Beitrag vom User wambacher ergeben, wonach eine Abfrage nach den oben beschriebenen Doppelungen von Grenzrelationen mit identischer Postleitzahl auch mit einer OSM-Datenbank möglich ist:

select * 
  from 
       ( SELECT count(tags->'postal_code') count,
                tags->'postal_code' postal_code
           FROM relations
          WHERE tags->'type' in('multipolygon','boundary') 
            AND tags->'boundary' in ('administrative','postal_code')  
            AND tags ? 'postal_code' 
            AND geom && (select geom from relations where id=1111111)
          group by tags->'postal_code'
          order by count(tags->'postal_code') desc, tags->'postal_code' 
       ) foo
 where count > 1

Tabelle

Für die Einträge in der Spalte "JOSM Remote" bitte folgendes beachten:

  • den jeweiligen Link im Browser in einem neuen Tab öffnen (via rechte oder mittlere Maustaste)
  • JOSM muss dafür im Hintergrund gestartet sein
  • in den Einstellungen von JOSM muss die Remote-Funktion aktiviert sein
  • es wird dann zunächst nur die Relation ohne Wege geladen. Dafür in der Relationsliste in JOSM dann mit Rechtsklick auf eine oder mehrere Relationen die Elemente (Wege) herunter laden.
id postal_code doppelt note name Relation OverpassTurbo JOSM Remote
36820 01445 1 Radebeul 36820 01445 36820
1305749 01445 1 01445 Radebeul 1305749 01445 1305749