x

Automatische Korrektur von Fehlern in addr:* (5) - street, housenumber


Geschrieben von Oli-Wan (Gast) am 12. Februar 2013 21:25:56: [flux]

Das (vorerst?) letzte Kapitel zum automatischen Korrekturprozess für die addr:*-Familie.

Ein weiterer sehr häufiger Fehler beim Eintragen von Adressen besteht darin, daß Straße und Hausnummer nicht separat, sondern zusammen in entweder addr:street oder addr:housenumber geschrieben werden; ähnlich wie bei Postleitzahl und Ort. Diese Daten sollen getrennt werden.

Nehmen wir im folgenden der Einfachheit halber an, addr:street habe die Form "Straße Nummer" und addr:housenumber sei nicht vorhanden. Der umgekehrte Fall ist weitgehend analog. Ferner kommt es vor, daß zusätzlich zu addr:street="Straße Nummer" noch addr:housenumber vorhanden ist und die Hausnummer enthält (bzw. umgekehrt addr:housenumber="Straße Nummer" und Straßenname in addr:street).

Schon als ich meine Ideen zur automatischen Adresskorrektur nur grob skizziert habe, wurde zurecht darauf hingewiesen, daß es nicht damit getan ist, einfach die vermeintliche Hausnummer zu identifzieren, in addr:housenumber zu verschieben und den Rest (bis auf das trennende Leerzeichen) in addr:street zu belassen. Grund ist, daß es einzelne Straßen gibt, deren Name tatsächlich eine Zahl am Ende enthält (Straße 12, Feldweg 63, Werkstraße 1 usw.) - selten zwar, aber Fehlkorrekturen sind absehbar und daher kommt eine Ersetzung ohne weitere Sicherheitsvorkehrungen nicht in Frage.

Ich denke, daß ich nun einen Weg gefunden habe, die Korrektur hinreichend sicher zu gestalten; eure Meinungen dazu interessieren mich. Wie bei nahezu allen OSM-Problemen dieser Tage liegt die Lösung in der Overpass API.

Die vorgesehene Korrektur geht wie folgt vonstatten: zunächst wird überprüft, ob addr:street die Form "Straße Nummer" hat; genauer: es wird nach einem Teilstring gesucht, der nach einer Hausnummer aussieht und dem mindestens ein Zeichen Leerraum vorausgeht. Technisch wird der Teil "Leerraum und Hausnummer" als Regex dargestellt: "[[:blank:]]+\([[:digit:]]+\([[:blank:]]?[[:alpha:]]\)?\)[[:blank:]]*$". Eine Hausnummer (in der ersten Klammer) besteht also aus mindestens einer arabischen Ziffer sowie maximal einem Buchstaben, der durch ein oder mehrere Leerzeichen von der Zahl getrennt sein kann. (Mehrere Hausnummern, etwa 12-14, werden so nicht erfaßt. Den Regex werde ich evtl. noch entsprechend anpassen.)
Bei dieser Prüfung werden die mutmaßlichen Adressbestandteile bereits identifiziert. Die Hausnummer ergibt sich aus der äußeren Klammer des Regex; der Straßenname ist alles vor dem führenden Leerzeichen. Im Prinzip könnte nun die Hausnummer in addr:housenumber geschrieben und addr:street passend gekürzt werden - wäre da nicht das Restrisiko mit den numerierten Straßen.
Hierfür habe ich mir folgende Lösung überlegt: per Abfrage an die Oberpfalz-API wird geprüft, ob es in der Nähe (Umkreis 100 Meter; Anpassung vorbehalten) eine Straße gibt, deren name-Tag mit dem zuvor identifizierten Straßennamen übereinstimmt. Die Abfrage wird dabei aus Typ und ID des zu bearbeitenden Objekts sowie dem vermuteten Namen gebastelt (Elisp-Code):

(format␣"%s(%d);way(around:100)[name=\"%s\"][highway~\".\"];out␣meta;"␣type␣id␣name)

Wird eine Straße (highway-Tag wird noch mit den üblichen Verdächtigen verglichen) dieses Namens gefunden, wird die Korrektur durchgeführt.

Bisher entdeckt mein Filterprogramm nicht alle Fehler des hier diskutierten Typs. Vorerst werde ich es nicht ändern, d.h. die genannten Korrekturen würden erst einmal hauptsächlich an Objekten durchgeführt, die aus anderen Gründen im Filter hängen bleiben (und auch anderen Korrekturen unterzogen werden). Mittelfristig würde ich aber auch das Filterprogramm anpassen, um möglichst viele "Straße Nummer"-Fehler zu erwischen.

Mangels aktueller Beispiele habe ich die Korrekturfunktion vorhin (ohne Hochladen) an früheren Versionen von Objekten ausprobiert, wo Wall·E im Zuge anderer Korrekturen "komische" Tags zwar im Log vermerkt, aber eben noch nicht korrigiert hat (was ich dann in der Regel manuell gemacht habe). Diese Tests verliefen vielversprechend. In keinem Fall wäre es zu einer (für mich erkennbar) falschen Korrektur gekommen; und eine sinnvolle Korrektur ist in der Regel nur dann unterblieben, wenn der Straßenname in addr:street anders geschrieben war als im name-Tag der Straße. Beispiele:

http://www.openstreetmap.org/browse/nod … 02/history - addr:street="Waldstraße 21", addr:housenumber=21 (Version 5). Hier wird eine Waldstraße in der Nähe gefunden, das addr:street-Tag kann korrigiert werden.
http://www.openstreetmap.org/browse/node/1535258632 - addr:street="Molkestraße 28" kann aus zwei Gründen nicht korrigiert werden: erstens stimmt die Hausnummer nicht mit dem vorhandenen Tag addr:housenumber=21b; zweitens fehlt ein "t" im Straßennamen.
http://www.openstreetmap.org/browse/way … 21/history - addr:street="Karl-Marx Straße 40a" kann nicht bearbeitet werden, weil der Karl-Marx-Straße ein Bindestrich fehlt.
http://www.openstreetmap.org/browse/nod … 03/history - addr:street="Grußdorfstraße 5-6" bleibt stehen, weil der Regex die Hausnummer "5-6" nicht abdeckt.

Nun endlich: eure Meinungen? Reicht die vorgesehene Sicherung aus? Habe ich Sonderfälle übersehen?


Antworten: