diff --git a/icons.svg b/icons.svg index 3ba49ee..e2377eb 100644 --- a/icons.svg +++ b/icons.svg @@ -13,7 +13,7 @@ height="600px" id="svg2987" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.5 r10040" sodipodi:docname="icons.svg"> @@ -24,9 +24,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="22.627417" - inkscape:cx="145.67789" - inkscape:cy="540.49348" + inkscape:zoom="32" + inkscape:cx="43.689055" + inkscape:cy="429.90811" inkscape:current-layer="layer1" inkscape:document-units="px" showgrid="true" @@ -34,10 +34,10 @@ inkscape:guide-bbox="true" inkscape:object-paths="true" inkscape:snap-bbox="true" - inkscape:window-width="1542" - inkscape:window-height="999" - inkscape:window-x="236" - inkscape:window-y="173" + inkscape:window-width="1518" + inkscape:window-height="1000" + inkscape:window-x="28" + inkscape:window-y="21" inkscape:window-maximized="0"> - + + + + + + + + + + + @@ -239,6 +279,10 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> + - @@ -576,9 +615,9 @@ style="fill:#000000;fill-opacity:1;stroke:none" /> + inkscape:connector-curvature="0" /> + sodipodi:nodetypes="ccccsssccccssscc" + inkscape:label="#path3461" /> + d="M 194 67 L 199 72 L 199 76 L 198 76 C 197.446 76 197 76.446 197 77 L 202 77 C 202 76.446 201.554 76 201 76 L 200 76 L 200 72 L 205 67 L 194 67 z " + id="bar" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mapper.py b/mapper.py index 5ddbb74..b593710 100644 --- a/mapper.py +++ b/mapper.py @@ -41,7 +41,7 @@ output_file = svg.SVG(open(sys.argv[2], 'w+')) w, h = 2000, 2000 -background_color = '000000' # 'EEEEEE' +background_color = 'EEEEEE' grass_color = 'C8DC94' sand_color = 'F0E0D0' beach_color = 'F0E0C0' @@ -54,11 +54,17 @@ wood_color = 'B8CC84' tags_to_write = ['operator', 'opening_hours', 'cuisine', 'network', 'website', 'phone', 'branch', 'route_ref', 'brand', 'ref', 'wikipedia', - 'description', 'level', 'wikidata', 'name'] + 'description', 'level', 'wikidata', 'name', 'alt_name', + 'image', 'fax', 'old_name', 'artist_name', 'int_name', + 'official_name', 'full_name', 'email', 'designation'] -prefix_to_write = ['addr', 'contact', 'name', 'operator', 'wikipedia'] +prefix_to_write = ['addr', 'contact', 'name', 'operator', 'wikipedia', + 'alt_name', 'description', 'old_name', 'inscription', + 'route_ref', 'is_in', 'website'] -tags_to_skip = ['note', 'layer'] +tags_to_skip = ['note', 'layer', 'source', 'building:part', 'fixme', 'comment'] + +prefix_to_skip = ['source'] output_file.begin(w, h) output_file.rect(0, 0, w, h, color=background_color) @@ -147,16 +153,23 @@ def draw_path(nodes, style, shift=Vector()): def draw_point_shape(name, x, y, fill): if not isinstance(name, list): name = [name] + for one_name in name: + shape, xx, yy = get_d_from_file(one_name) + draw_point_outline(shape, x, y, fill, size=16, xx=xx, yy=yy) for one_name in name: shape, xx, yy = get_d_from_file(one_name) draw_point(shape, x, y, fill, size=16, xx=xx, yy=yy) -def draw_point(shape, x, y, fill, size=16, xx=0, yy=0): +def draw_point_outline(shape, x, y, fill, size=16, xx=0, yy=0): x = int(float(x)) y = int(float(y)) output_file.write('\n') + +def draw_point(shape, x, y, fill, size=16, xx=0, yy=0): + x = int(float(x)) + y = int(float(y)) output_file.write('\n') @@ -168,10 +181,9 @@ def draw_text(text, x, y, fill): if text[:7] == 'http://' or text[:8] == 'https://': text = 'link' fill = '0000FF' - return - output_file.write('' + text + '') - output_file.write('' + text + '') def point(k, v, x, y, fill, text_y): @@ -179,12 +191,10 @@ def point(k, v, x, y, fill, text_y): missed_tags['node ' + k + ': ' + v] += 1 else: missed_tags['node ' + k + ': ' + v] = 1 - #output_file.circle(float(x), float(y), 2, fill=fill, color=fill) text = k + ': ' + v if type(text) == unicode: text = text.encode('utf-8') - output_file.write('' + text + '') + draw_text(text, x, float(y) + text_y + 18, '734A08') # Ways drawing @@ -201,7 +211,7 @@ def construct_layers(): if not (int(way['tags']['layer']) in layers): layers[int(way['tags']['layer'])] = \ {'b': [], 'h1': [], 'h2': [], 'r': [], 'n': [], 'l': [], - 'a': [], 'le': [], 'ba': [], 'bo': []} + 'a': [], 'le': [], 'ba': [], 'bo': [], 'w': []} layer = layers[int(way['tags']['layer'])] if 'building' in way['tags']: layer['b'].append(way) @@ -222,6 +232,8 @@ def construct_layers(): layer['h2'].append(way) if 'boundary' in way['tags']: layer['bo'].append(way) + if 'waterway' in way['tags']: + layer['w'].append(way) #else: # empty = True # for key in way['tags'].keys(): @@ -289,10 +301,10 @@ def draw_ways(): else: style = 'fill:#0000FF;stroke:none;' draw_path(way['nodes'], style) - for tag in way['tags']: - if not (tag in ['landuse', 'layer']): - point(tag, str(way['tags'][tag]), c.x, c.y, '000000', text_y) - text_y += 10 + #for tag in way['tags']: + # if not (tag in ['landuse', 'layer']): + # point(tag, str(way['tags'][tag]), c.x, c.y, '000000', text_y) + # text_y += 10 for way in layer['a']: c = line_center(way['nodes']) if way['tags']['amenity'] == 'parking': @@ -322,6 +334,12 @@ def draw_ways(): else: continue draw_path(way['nodes'], style) + for way in layer['w']: + if way['tags']['waterway'] == 'riverbank': + style = 'fill:#' + water_color + ';stroke:#' + water_border_color + ';stroke-width:1.0;' + elif way['tags']['waterway'] == 'river': + style = 'fill:none;stroke:#' + water_color + ';stroke-width:10.0;' + draw_path(way['nodes'], style) for way in layer['r']: v = way['tags']['railway'] style = 'fill:none;stroke-dasharray:none;stroke-linejoin:round;stroke-linecap:round;stroke-width:' @@ -348,7 +366,7 @@ def draw_ways(): elif v == 'service': style += '7' elif v == 'track': style += '3' elif v in ['footway', 'pedestrian']: style += '2' - elif v == 'steps': style += '5;stroke-dasharray:1,2;stroke-linecap:round' + elif v == 'steps': style += '5;stroke-dasharray:1,2;stroke-linecap:butt' elif v == 'path': style += '1;stroke-dasharray:5,5;stroke-linecap:round' else: continue @@ -401,18 +419,18 @@ def draw_ways(): draw_point_shape('shop_gift', c.x, c.y, '444444') elif tag == 'power': draw_point_shape('electricity', c.x, c.y, '444444') - elif tag in ['name', 'addr:housenumber', 'cladr:code', - 'addr:city', 'addr:street', 'website', - 'wikidata'] or \ - 'name' in tag or 'wikipedia' in tag: - draw_text(v, str(c.x), str(c.y + 18 + text_y), '444444') - text_y += 10 - elif tag == 'addr:country': - if v == 'RU': - draw_text('Россия', str(c.x), str(c.y + 18 + text_y), '444444') - else: - draw_text(v, str(c.x), str(c.y + 18 + text_y), '444444') - text_y += 10 + #elif tag in ['name', 'addr:housenumber', 'cladr:code', + # 'addr:city', 'addr:street', 'website', + # 'wikidata'] or \ + # 'name' in tag or 'wikipedia' in tag: + # draw_text(v, str(c.x), str(c.y + 18 + text_y), '444444') + # text_y += 10 + #elif tag == 'addr:country': + # if v == 'RU': + # draw_text('Россия', str(c.x), str(c.y + 18 + text_y), '444444') + # else: + # draw_text(v, str(c.x), str(c.y + 18 + text_y), '444444') + # text_y += 10 elif tag in ['layer', 'height']: pass elif tag in ['building:levels']: @@ -461,6 +479,14 @@ def draw_raw_nodes(): def no_draw(key): if key in tags_to_write or key in tags_to_skip: return True + for prefix in prefix_to_write + prefix_to_skip: + if key[:len(prefix) + 1] == prefix + ':': + return True + return False + +def to_write(key): + if key in tags_to_write: + return True for prefix in prefix_to_write: if key[:len(prefix) + 1] == prefix + ':': return True @@ -472,29 +498,47 @@ def draw_nodes(): for node_id in node_map: node = node_map[node_id] flinged = flinger.fling(Geo(node['lat'], node['lon'])) - x = `flinged.x` - y = `flinged.y` + x = flinged.x + y = flinged.y text_y = 0 if 'tags' in node: p = node['tags'] else: p = {} fill = '444444' - if 'colour' in p: - if p['colour'] == 'blue': + processed = set([]) + + if 'colour' in p or 'color' in p: + k = 'color' if 'color' in p else 'colour' + v = p[k] + processed.add(k) + if v == 'blue': fill='2233AA' - radius=3 + elif v == 'lightblue': + fill='2288CC' + elif v == 'red': + fill='CC0000' + elif v == 'violet': + fill='75507B' + elif v == 'green': + fill='4E9A06' + elif v == 'yellow': + fill='EDD400' + else: + processed.remove(k) + + shapes = [] if p == {}: pass elif 'amenity' in p: k = 'amenity' v = p['amenity'] - processed = set([k]) + processed.add(k) if v in ['bench', 'bicycle_parking', 'cafe', 'waste_basket', 'clinic', 'restaurant', 'pharmacy', 'drinking_water', 'toilets', 'theatre', 'bar', 'bank', 'pub', 'post_office']: - draw_point_shape(v, x, y, fill) + shapes.append(v) elif v == 'fast_food': shape = 'fast_food' if 'operator' in p: @@ -505,177 +549,190 @@ def draw_nodes(): if p['operator:en'] == "McDonald's": shape = 'mcdonalds' processed.add('operator:en') - draw_point_shape(shape, x, y, fill) + shapes.append(shape) elif v == 'shop': if 'shop' in p: if p['shop'] in ['fishing']: draw_point_shape('shop_' + p['shop'], x, y, fill) elif v == 'fountain': - draw_point_shape('fountain', x, y, water_border_color) + shapes.append('fountain') + fill = water_border_color elif v == 'recycling': if not 'recycling_type' in p: - draw_point_shape('recycling', x, y, fill) + shapes.append('recycling') else: processed.remove(k) for k in p: - if 'karaoke' in p: - if p['karaoke'] == 'yes': - draw_point_shape('microphone', flinged.x + 16, y, fill) - else: - point(k, p[k], x, y, fill, text_y) - elif not no_draw(k) and not (k in processed): - point(k, p[k], x, y, fill, text_y) - text_y += 10 + if 'karaoke' in p and p['karaoke'] == 'yes': + draw_point_shape('microphone', flinged.x + 16, y, fill) + processed.add('karaoke') + elif 'building' in p: + k = 'building' + v = p['building'] + for k in p: + if 'roof:material' in p and p['roof:material'] == 'metal': + draw_point_shape('metal_roof', flinged.x + 16, y, fill) + processed.add('roof:material') + elif 'railway' in p: + k = 'railway' + v = p['railway'] + processed.add(k) + if v == 'subway_entrance': + shapes.append('train') + else: + processed.remove(k) + for k in p: + if 'roof:material' in p and p['roof:material'] == 'metal': + draw_point_shape('metal_roof', flinged.x + 16, y, fill) + processed.add('roof:material') elif 'natural' in p: k = 'natural' v = p['natural'] - processed = set([k]) + processed.add(k) if v == 'tree': shape = 'tree' if 'leaf_type' in p and p['leaf_type'] in ['broadleaved', 'needleleaved']: shape = p['leaf_type'] - processed.add(p['leaf_type']) - if 'denotation' in p and p['denotation'] == 'urban': - draw_point_shape([shape, 'urban_tree_pot'], x, y, wood_color) - processed.add('denotation') + processed.add('leaf_type') + if 'type' in p and p['type'] == 'conifer': + shape = 'needleleaved' + processed.add('type') + if 'denotation' in p: + if p['denotation'] == 'urban': + draw_point_shape([shape, 'urban_tree_pot'], x, y, wood_color) + processed.add('denotation') + elif p['denotation'] == 'avenue': + draw_point_shape([shape, 'avenue_tree'], x, y, wood_color) + processed.add('denotation') elif v == 'cave_entrance': - draw_point_shape('cave', x, y, fill) + shapes.append('cave') elif v == 'bush': - draw_point_shape('bush', x, y, wood_color) + shapes.append('bush') + fill = wood_color else: processed.remove(k) - for k in p: - if not no_draw(k) and not (k in processed): - point(k, p[k], x, y, fill, text_y) - text_y += 10 elif 'entrance' in p: k = 'entrance' v = p['entrance'] - processed = set([k]) + processed.add(k) if v == 'yes': - draw_point_shape('entrance', x, y, fill) + shapes.append('entrance') + elif v == 'main': + shapes.append('main_entrance') elif v == 'staircase': - draw_point_shape('staircase', x, y, fill) + shapes.append('staircase') else: processed.remove(k) - for k in p: - if not no_draw(k) and not (k in processed): - point(k, p[k], x, y, fill, text_y) - text_y += 10 elif 'highway' in p: k = 'highway' v = p['highway'] - processed = set([k]) + processed.add(k) if v == 'crossing': shape = 'crossing' if 'crossing' in p: if p['crossing'] == 'zebra': shape = 'zebra' + processed.add('crossing') + elif p['crossing'] == 'uncontrolled': + draw_point_shape('no_traffic_signals', x + 16, y, fill) + processed.add('crossing') + elif p['crossing'] == 'traffic_signals': + draw_point_shape('traffic_signals', x + 16, y, fill) + processed.add('crossing') elif 'crossing_ref' in p: if p['crossing_ref'] == 'zebra': shape = 'zebra' - draw_point_shape(shape, x, y, fill) + processed.add('crossing_ref') + shapes.append(shape) + elif v == 'traffic_signals': + shapes.append('traffic_signals') elif v == 'street_lamp': - draw_point_shape('street_lamp', x, y, fill) + shapes.append('street_lamp') else: processed.remove(k) - for k in p: - if not no_draw(k) and not (k in processed): - point(k, p[k], x, y, fill, text_y) - text_y += 10 - else: - for k in p: - if not no_draw(k): - point(k, p[k], x, y, fill, text_y) - text_y += 10 - - - for k in []: - v = p[k] - if k == 'amenity': - if v in ['bench', 'bicycle_parking', 'cafe', 'waste_basket', - 'restaurant', 'pharmacy', 'drinking_water', 'toilets', - 'fast_food', 'theatre']: - draw_point_shape(v, x, y, fill) - elif k == 'artwork_type': - if v == 'statue': - draw_point_shape('monument', x, y, fill) - if v == 'sculpture': - draw_point_shape('monument', x, y, fill) - else: - point(k, v, flinged.x, flinged.y, fill, text_y) - text_y += 10 - elif k == 'barrier': - if v == 'lift_gate': - draw_point_shape('liftgate', x, y, fill) - elif k in ['crossing', 'crossing_ref']: - if v == 'zebra': - draw_point_shape('crossing', x, y, fill) - elif k == 'entrance': - draw_point_shape('entrance', x, y, fill) - elif k == 'highway': - if v == 'street_lamp': - draw_point_shape('street_lamp', x, y, fill) - elif v == 'bus_stop': - draw_point_shape('bus_stop', x, y, fill) - elif v == 'traffic_signals': - draw_point_shape('traffic_signal', x, y, fill) - elif v == 'crossing': - if not ('crossing' in p): - draw_point_shape('crossing', x, y, fill) - else: - point(k, v, flinged.x, flinged.y, fill, text_y) - text_y += 10 - elif k == 'man_made': - if v == 'pole': - draw_point_shape('pole', x, y, fill) - elif v == 'flagpole': - draw_point_shape('flagpole', x, y, fill) - else: - point(k, v, flinged.x, flinged.y, fill, text_y) - text_y += 10 - elif k == 'recycling_type': - if v == 'centre': - draw_point_shape('recycling', x, y, fill) - else: - draw_point_shape('recycling', x, y, fill) - elif k == 'shop': - if v == 'florist': - draw_point_shape('florist', x, y, fill) - elif v in ['clothes', 'shoes', 'gift']: - draw_point_shape('shop_' + v, x, y, fill) - else: - point(k, v, flinged.x, flinged.y, fill, text_y) - text_y += 10 - elif k == 'traffic_calming': - if v == 'bump': - draw_point_shape('bump', x, y, fill) - else: - point(k, v, flinged.x, flinged.y, fill, text_y) - text_y += 10 - elif k == 'emergency': - if v == 'fire_hydrant': - draw_point_shape(v, x, y, fill) - elif k == 'historic': - if v == 'memorial': - draw_point_shape('monument', x, y, fill) - elif k == 'tourism': - if v == 'artwork': - if not ('artwork_type' in p): - draw_point_shape('monument', x, y, fill) - if v == 'attraction': - draw_point_shape('monument', x, y, fill) - elif k in undraw or ('name' in k): - if k == 'route_ref': - v = v.replace(';', ' ') - draw_text(v, x, str(flinged.y + 18 + text_y), fill) - text_y += 10 - elif k in ['layer', 'level', 'source', 'note', 'description']: - pass # NOTHING TO DRAW + elif 'historic' in p: + k = 'historic' + v = p['historic'] + processed.add(k) + if v == 'memorial': + shape = v + if v in p: + if p[v] == 'statue': + shape = p[v] + processed.add(v) + elif p[v] == 'plaque': + shape = p[v] + processed.add(v) + shapes.append(shape) + elif v == 'tomb': + shape = v + if v in p: + if p[v] == 'mausoleum': + shape = p[v] + processed.add(v) + shapes.append(shape) else: - point(k, v, flinged.x, flinged.y, fill, text_y) + processed.remove(k) + elif 'barrier' in p: + k = 'barrier' + v = p['barrier'] + processed.add(k) + if v == 'gate': + shapes.append('gate') + elif v == 'lift_gate': + shapes.append('lift_gate') + elif v == 'turnstile': + shapes.append('turnstile') + else: + processed.remove(k) + elif 'man_made' in p: + k = 'man_made' + v = p['man_made'] + processed.add(k) + if v == 'pole': + shapes.append('pole') + elif v == 'flagpole': + shapes.append('flagpole') + else: + processed.remove(k) + elif 'tourism' in p: + k = 'tourism' + v = p['tourism'] + processed.add(k) + if v == 'attraction': + shape = v + if v in p: + if p[v] == 'amusement_ride': + shape = p[v] + processed.add(v) + shapes.append(shape) + else: + processed.remove(k) + + for k in []: # p: + if to_write(k): + draw_text(k + ': ' + p[k], x, y + 18 + text_y, '444444') text_y += 10 + for k in p: + if k == 'foot' and p[k] == 'yes': + shapes.append('foot') + processed.add(k) + elif k == 'bicycle' and p[k] == 'yes': + shapes.append('bicycle') + processed.add(k) + elif k == 'internet_access' and p[k] == 'wlan': + shapes.append('wlan') + processed.add(k) + elif not no_draw(k) and not k in processed: + point(k, p[k], x, y, fill, text_y) + text_y += 10 + + xxx = -(len(shapes) - 1) * 8 + for shape in shapes: + draw_point_shape(shape, x + xxx, y, fill) + xxx += 16 + print 'Done.' #draw_raw_nodes() @@ -699,7 +756,8 @@ output_file.end() print '\nMissing tags:\n' top_missed_tags = reversed(sorted(missed_tags.keys(), key=lambda x: -missed_tags[x])) for tag in top_missed_tags: - print tag + ' (' + str(missed_tags[tag]) + ')' + if tag[:4] == 'node': + print tag + ' (' + str(missed_tags[tag]) + ')' sys.exit(0) diff --git a/osm_reader.py b/osm_reader.py index 1277200..04c6968 100644 --- a/osm_reader.py +++ b/osm_reader.py @@ -125,12 +125,12 @@ def parse_osm_file(file_name, silent=False): elif line[:5] in [' \n', '\t\n']: + elif line in [' \n', '\t\n']: way_map[element['id']] = element # Relation parsing.