imposm.parser: callback Funktion liefert mehrere Listen als Output

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mcl33
User
Beiträge: 7
Registriert: Donnerstag 19. November 2015, 13:47

Hallo liebe Community,

ich bin ein Neuling in Python, ja wenn man es genau nimmt und die weniger hilfreichen Grundlagen der Programmierung im Studium außer Acht lässt, bin ich genau genommen ein Programmieranfänger. Nun will es aber meine Masterarbeit, dass ich mich doch dazu zwinge, mich endlich damit zu befassen (Zeit wird es!).

Da ich mit Daten aus OSM arbeite, möchte ich imposm.parser und probiere Sachen aus, um die Funktionsweise zu verstehen. Ich hoffe, es gibt hier den einen oder anderen, der ich mit imposm auskennt.

Ich auf folgendes Problem gestoßen:
Der Code

Code: Alles auswählen

from imposm.parser import OSMParser

def vertices(coords):
    global vertexlist
    vertexlist = []
    for (coordid, lat, lon) in coords:
        vertexlist.append(coordid)
    print "Liste in der Funktion: ", vertexlist
    print "Items: ", len(vertexlist), '\n'

p = OSMParser(concurrency=4, coords_callback=vertices)
p.parse('example.osm')


print "\n", "Globale Vertexliste: ", vertexlist
print "Items: ", len(vertexlist)
liefert den Output (gekürzt):

Code: Alles auswählen

Lokale Vertexliste: [20911496, 20911497, 20911498, 29509240, 29509277, 96916723, 96916733, 96916757, 96916758, 97043991, 97044155, ...]
Items:512

Lokale Vertexliste: [2075933132, 2075933135, 2075933136, 2075933137, 2075933138, 306261067, 2075933148, 2075933152, 306261064, ...]
Items:512

Lokale Vertexliste: [2234972303, 2234972305, 2234972307, 2234972309, 2234972312, 2234972315, 2234972317, 2234972319, 2234972323, ...]
Items:512

Lokale Vertexliste: [2259542926, 2259542927, 2259542928, 2259542929, 2259542931, 2259542932, 2259542933, 2259542934, 2259542936, ...]
Items:512

Lokale Vertexliste: [2259543426, 2259543427, 2259543428, 2259543429, 2259543430, 2259543431, 2259543432, 2259543433, 2259543434, ...]
Items:512

Lokale Vertexliste: [2260713391, 2260713394, 2260713396, 2260713398, 2260713400, 2260713402, 2260713404, 2260713406, 2260713408, ...]
Items:512

Lokale Vertexliste: [2263280273, 2263280276, 2263280279, 2263280283, 2263280286, 2263280289, 2263280292, 2263280296, 2263280299, ...]
Items: 178

Lokale Vertexliste: []
Items:0

Lokale Vertexliste: [20911500, 96916751, 96916753, 96916755, 96916760, 96916783, 185481547, 185481571, 186143628, 186143641, ...]
Items:227


Globale Vertexliste:  [20911500, 96916751, 96916753, 96916755, 96916760, 96916783, 185481547, 185481571, 186143628, 186143641, ...]
Items: 227
Kann mir jemand erklären, warum ich mehrere Listen als Output erhalte? Ich habe nur mit einer gerechnet. Wenn ich andere .osm Dateien einlese werden auch mehr oder weniger Listen ausgegeben, je nachdem, wie groß die .osm Dateien sind.
Weiterhin: wenn ich

Code: Alles auswählen

concurrency=4
in

Code: Alles auswählen

concurrency=1
ändere, vertauschen sich die letzten beiden Lokalen Vertexlisten und die Globale Vertexliste hat 0 Items. Scheinbar bezieht sich die globale Vertexliste hier immer auf die letzte lokale?

ich hoffe, mir kann jemand erklären, wo hier der Wurm liegt, oder ob ich imposm.parser total falsch anwende. oder ...
Danke!

Beste Grüße, Michael
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du erzeugst ja auch bei jedem Aufruf eine neue Liste. Der Sinn von `concurrency` ist aber, dass Teilergebnisse geliefert werden und diese im Callback zu einem einzelnen Ergebnis verschmolzen werden. Also dann eher in dieser Art (ungetestet):

Code: Alles auswählen

result = []
p = OSMParser(concurrency=4, coords_callback=result.extend)
p.parse('example.osm')
print(result)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oder etwas ausführlicher:

Code: Alles auswählen

def get_merger(result, index):
    def callback(datasets):
        for data in datasets:
            result.append(data[index])
    return callback

def parse_file(filename):
    result = []
    p = OSMParser(concurrency=4, coords_callback=get_merger(result, index=0))
    p.parse(filename)
    return result

def main():
    print(parse_file('example.osm'))

if __name__ == '__main__':
    main()
mcl33
User
Beiträge: 7
Registriert: Donnerstag 19. November 2015, 13:47

Vielen Dank für deine Hilfe! Ich denke ich beginne etwas besser zu verstehen und versuche mal, damit weiter zu arbeiten.
Mittels der Tag Filter in imposm.parser kann man ja scheinbar auch bestimmte Daten nach Tags herausfiltern, z.B. nur eine Liste der Autobahnen (k='highway' v='motorway') o.ä.?

BG, Michael
Antworten