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) + ' %).'
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