Maperitive Regel zum abgleich einer Excel Tabelle

Liebe OSM-Gemeinde,

ich bin nicht ganz neu in der OSM Welt aber bisher noch nicht durch Beiträge aufgefallen :slight_smile:
Ich habe mich während meines ersten Architektur Studiums mit OSM befasst da ich gemerkt habe das sich damit wunderbar Schwarzpläne erzeugen lassen. Hab dies jedoch über den SVG-Export und anschließende Weiterverarbeitung in Illustrator gemacht.
Bis ich vorgestern über Maperitive gestolpert bin, für meine Zwecke einfach ein Wunderwerkzeug…
Hab mich also jetzt mit den Regeln befasst und mir verschiedene dinge Zusammengestrickt.
Nun zu meiner Frage:
Mein Vater, selbst Architekt, hat über Jahre seine Kundendaten als Excel Tabelle geführt, alles fein säuberlich.
Mir kam nun die Idee einen Schwarzplan zu erzeugen in dem die von ihm bearbeiteten Gebäude in rot, oder wie auch immer, dargestellt werden.
Schön wäre natürlich die Möglichkeit die Excel Tabelle auszulesen und die dementsprechenden Gebäude zu markieren.
Ich habe das Glück das hier im Kreis, Rhein-Sieg-Kreis, anscheinend alle Daten bis ins kleinste Detail korrekt sind; riesen Dank an alle die dafür Verantwortlich sind.
Mit der Programmierung der Rules komme ich klar, hab mir letztens auch ein wenig Python, in Grundzügen, angeeignet.

Falls jemand ne Idee hat, oder aber so etwas in den Tiefen dieses Forums bereits Diskutiert wurde, schubst mich hin.

MFG aus Troisdorf

Es wird kein Weg daran vorbei führen die Häuser in deinem lokalen Datenbestand gesondert zu markieren. Bitte aber nicht hochladen.
Eventuell kannst du in deiner OSM Datei ja einfach nach bestimmten Schlüsseln der Häuser wie Adresse suchen.

Ich hatte eh schon “befürchtet” das ich die Daten aus der Excel Datei noch aufarbeiten muss, soll halt auch nicht jeder Bauantrag für ne Dachgaube mit rein, und es wurden auch nicht konsequent die Strassennamen ausgeschrieben. Aber wenn ich ne Tabelle oder Liste erzeuge, in der die Strasse, die Hausnummer und ggf. die PLZ steht, in der gleichen form wie sie in der OSM Datei verwendet werden müsste man diese Werte doch abgleichen können.
Sind halt um die 500 Projekte, da ist ein händischer Abgleich sehr mühselig.
Ich weiss das es in Python so etwas gibt, bin nur noch nicht Tief genug eingedrungen um es anzuwenden.

Im Endeffekt brauchst du also einen Batch-Geocoder?

Alles dazu, was es auf OSM-Basis gibt, sollte unter http://wiki.openstreetmap.org/wiki/Search_engines zu finden sein.

oder gehe mal zu http://help.openstreetmap.org und suche dort nach “batch geocoder” … du bist nicht der erste, der nach so etwas sucht …

Frage bleibt dann aber auch, wie du dann anhand der vom geocoder stammenden Koordinaten deine Gebäude für Maperitive eingefärbt bekommst …

Danke für die Gelegenheit mein Python-XML aufzufrischen :wink:

Wenn du dir eine OSM-XML-Datei runtergeladen hast kannst du mit

# -*- coding: utf8 -*-
import csv
from xml.dom import minidom
import codecs

housedb_filename = "adressen.txt"
reader = csv.reader(open(housedb_filename, 'r'), delimiter=";")
my_houses = {}
for row in reader:
    #print row
    k = row[0]
    v = row[1]
    if k not in my_houses.keys():
        my_houses[k] = []
    my_houses[k].append(v)
        
# my_houses[Straße] = [Nummer1,Nummer2,NummerN]

osmfile = "map.osm"
osmfile_out = "map_mod.osm" ## Achtung, wird überschrieben


xmldoc = minidom.parse(osmfile)
itemlist = xmldoc.getElementsByTagName('way') 
for one_way in itemlist :
    tags = one_way.getElementsByTagName('tag')
    way_street = ''
    way_housenumber = ''
    for one_tag in tags:
        if (one_tag.attributes['k'].value == u'addr:street'):
            way_street = one_tag.attributes['v'].value
        if (one_tag.attributes['k'].value == u'addr:housenumber'):
            way_housenumber = one_tag.attributes['v'].value
    if way_street != '' and way_housenumber != '':
        if way_street in my_houses.keys() and way_housenumber in my_houses[way_street]:
            #print "Ich habe %s %s gebaut" % (way_street, way_housenumber)
            el = minidom.Element('tag')
            el.setAttribute('k','built_by')
            el.setAttribute('v','vaddern')
            one_way.appendChild(el)
            #print one_way.toxml()

xmldoc.writexml(codecs.open(osmfile_out,encoding='utf8',mode="w"))

(siehe Paste: http://pastebin.com/KPS3JQXK )

für die Adressen, die in adressen.txt stehen (so formatiert):

Elfenweg;11
Elfenweg;30
Drosselbartweg;17
Drosselbartweg;999999

den extra-Tag built_by=vaddern setzen, über den du das dann in Maperitive einfärben kannst.

edit: Noch die Randbedingungen:
Das Teil sucht nur nach Wegen, und vergleicht addr:street und addr:housenumber mit den Werten aus der adressen.txt-Datei. Wenn die Adresse nur an einem Node hängt, oder wenn die Adressen über associatedStreet-Relationen o.ä. gemappt sind, versagt das Skript. Natürlich kann es nur die finden, die als echte Hausnummer am Weg im Datenbestand sind. Interpolationen etc. gehen auch nicht. Wenn du davon viele brauchst, musst du tatsächlich über nen Geocoder gehen.

Wenn Du die Daten nicht in die Karte reinkompilieren willst, sondern als overlay auf dem Bildschirm darstellen,
dann hilft Dir vielleicht die Diskussion hier http://forum.openstreetmap.org/viewtopic.php?id=26503 weiter

Als Einstieg sei das hier empfohlen: http://wiki.openstreetmap.org/wiki/Openlayers_POI_layer_example
damit hat man schnell diverse Marker etc. auf einer der Standardkarten.

Ok das sind einige antworten in so kurzer zeit. Ich danke erstmal vielmals und werde mich nach studie des ganzen zurückmelden um zu berichten wie gut das alles geklappt hat, und vorallem was ich neues gelernt habe. :smiley: