Ejemplo n.º 1
0
def construct_nodes(drawing):
    """
    Draw nodes.
    """
    print 'Draw nodes...'

    start_time = datetime.now()

    node_number = 0
    processed_tags = 0
    skipped_tags = 0

    s = sorted(node_map.keys(), key=lambda x: -node_map[x]['lat'])

    for node_id in s:
        node_number += 1
        ui.write_line(node_number, len(node_map))
        node = node_map[node_id]
        flinged = flinger.fling(Geo(node['lat'], node['lon']))
        x = flinged.x
        y = flinged.y
        if 'tags' in node:
            tags = node['tags']
        else:
            tags = {}

        if not (options.level is None):
            if 'level' in tags:
                levels = map(lambda x:float(x), tags['level'].replace(',', '.').split(';'))
                if not options.level in levels:
                    continue
            else:
                continue

        shapes, fill, processed = process.get_icon(tags, scheme)

        if options.mode == 'user-coloring':
            fill = get_user_color(node['user'])
        if options.mode == 'time':
            fill = get_time_color(node['timestamp'])

        for k in tags:
            if k in processed or no_draw(k):
                processed_tags += 1
            else:
                skipped_tags += 1

        for k in []:  # tags:
            if to_write(k):
                draw_text(k + ': ' + tags[k], x, y + 18 + text_y, '444444')
                text_y += 10

        #if show_missed_tags:
        #    for k in tags:
        #        v = tags[k]
        #        if not no_draw(k) and not k in processed:
        #            if ('node ' + k + ': ' + v) in missed_tags:
        #                missed_tags['node ' + k + ': ' + v] += 1
        #            else:
        #                missed_tags['node ' + k + ': ' + v] = 1

        if not draw:
            continue

        if shapes == [] and tags != {}:
            shapes = [['circle']]

        drawing['nodes'].append({'shapes': shapes, 
            'x': x, 'y': y, 'color': fill, 'processed': processed, 
            'tags': tags})

    ui.write_line(-1, len(node_map))
    print 'Nodes drawed in ' + str(datetime.now() - start_time) + '.'
    print 'Tags processed: ' + str(processed_tags) + ', tags skipped: ' + \
        str(skipped_tags) + ' (' + \
        str(processed_tags / float(processed_tags + skipped_tags) * 100) + ' %).'
Ejemplo n.º 2
0
def parse_osm_file_fast(file_name, parse_nodes=True, parse_ways=True, 
        parse_relations=True, full=False):
    node_map = {}
    way_map = {}
    relation_map = {}
    print 'Line number counting for ' + file_name + '...'
    with open(file_name) as f:
        for lines_number, l in enumerate(f):
            pass
    print 'Done.'
    print 'Parsing OSM file ' + file_name + '...'
    input_file = open(file_name)
    line = input_file.readline()
    line_number = 0
    while line != '':
        line_number += 1
        ui.write_line(line_number, lines_number)

        # Node parsing.

        if line[:6] in [' <node', '\t<node']:
            if not parse_nodes:
                if parse_ways or parse_relations:
                    continue
                else:
                    break
            if line[-3] == '/':
                if not full:
                    node = parse_node(line[7:-3])
                else:
                    node = parse_node_full(line[7:-3])
                node_map[node['id']] = node
            else:
                if not full:
                    element = parse_node(line[7:-2])
                else:
                    element = parse_node_full(line[7:-2])
                element['tags'] = {}
        elif line in [' </node>\n', '\t</node>\n']:
            node_map[element['id']] = element

        # Way parsing.

        elif line[:5] in [' <way', '\t<way']:
            if not parse_ways:
                if parse_relations:
                    continue
                else:
                    break
            if line[-3] == '/':
                if not full:
                    way = parse_way(line[6:-3])
                else:
                    way = parse_way_full(line[6:-3])
                way_map[node['id']] = way
            else:
                if not full:
                    element = parse_way(line[6:-2])
                else:
                    element = parse_way_full(line[6:-2])
                element['tags'] = {}
                element['nodes'] = []
        elif line in [' </way>\n', '\t</way>\n']:
            way_map[element['id']] = element

        # Relation parsing.

        elif line[:10] in [' <relation', '\t<relation']:
            if not parse_relations:
                break
            if line[-3] == '/':
                relation = parse_relation(line[11:-3])
                relation_map[relation['id']] = relation
            else:
                element = parse_relation(line[11:-2])
                element['tags'] = {}
                element['members'] = []
        elif line in [' </relation>\n', '\t</relation>\n']:
            relation_map[element['id']] = element

        # Elements parsing.

        elif line[:6] in ['  <tag', '\t\t<tag']:
            k, v = parse_tag(line[7:-3])
            element['tags'][k] = v
        elif line[:5] in ['  <nd', '\t\t<nd']:
            element['nodes'].append(int(line[11:-4]))
        elif line[:9] in ['  <member', '\t\t<member']:
            member = parse_member(line[10:-3])
            element['members'].append(member)
        line = input_file.readline()
    input_file.close()

    ui.write_line(-1, lines_number)  # Complete progress bar.

    return node_map, way_map, relation_map