From a88c7088784d97b4521afd9c8071ed5117b5103a Mon Sep 17 00:00:00 2001 From: Sergey Vartanov Date: Thu, 10 Sep 2015 11:53:21 +0300 Subject: [PATCH] Multipolygon initial support (issue #1). --- data/tags.yml | 33 +++--- doc/map.png | Bin 83865 -> 1190 bytes engine/mapper.py | 268 +++++++++++++++++++++++++++---------------- engine/osm_reader.py | 2 +- 4 files changed, 189 insertions(+), 114 deletions(-) diff --git a/data/tags.yml b/data/tags.yml index d2b3943..f0d8f2b 100644 --- a/data/tags.yml +++ b/data/tags.yml @@ -2,18 +2,19 @@ colors: # Entity - 'background': 'EEEEEE' - 'grass': 'C8DC94' - 'sand': 'F0E0D0' - 'beach': 'F0E0C0' - 'deciduous': 'FCAF3E' - 'desert': 'F0E0D0' - 'evergreen': 'B8CC84' - 'playground': '884400' - 'parking': 'DDCC99' - 'water': 'AACCFF' - 'water_border': '6688BB' - 'wood': 'B8CC84' + background: 'EEEEEE' + grass: 'C8DC94' + sand: 'F0E0D0' + beach: 'F0E0C0' + deciduous: 'FCAF3E' + desert: 'F0E0D0' + evergreen: 'B8CC84' + playground: '884400' + parking: 'DDCC99' + water: 'AACCFF' + water_border: '6688BB' + wood: 'B8CC84' + tree: '688C44' # Colors not in W3C @@ -202,16 +203,16 @@ tags: - tags: {natural: tree} icon: [tree] - color: wood + color: tree - tags: {natural: tree, leaf_type: broadleaved} icon: [broadleaved] - color: wood + color: tree - tags: {natural: tree, leaf_type: needleleaved} icon: [needleleaved] - color: wood + color: tree - tags: {natural: tree, type: conifer} icon: [needleleaved] - color: wood + color: tree - tags: {natural: tree, leaf_cycle: deciduous} color: deciduous - tags: {natural: tree, leaf_cycle: evergreen} diff --git a/doc/map.png b/doc/map.png index c3ae05bda6b1020d2419aa91ac812418d7c1b91f..812b1f43a15d7383c922df6da4bdfd60ec73b38f 100644 GIT binary patch literal 1190 zcmeAS@N?(olHy`uVBq!ia0y~yV2S{;pK!1NNtcgNzkw7>v6E*A2N2Y7q;vrJoCO|{ z#X$AfL734=V|E2lP_o1|q9iy!t)x7$D3zhSyj(9cFS|H7u^?41zbJk7I~ysWLCT&k zjv*Cu-d=O$WH1ysaNzaN>$}9Fgd3e^22M!7cIFK~L&KSRYX*h~rfl2{3TYb{7?MUA iqk%A*5=KrgV0XCBI`Mn0iUY7rVeoYIb6Mw<&;$U`UGORZ literal 83865 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 diff --git a/engine/mapper.py b/engine/mapper.py index f4be040..71e2606 100644 --- a/engine/mapper.py +++ b/engine/mapper.py @@ -106,19 +106,22 @@ def get_min_max(node_map): return minimum, maximum -def draw_path(nodes, style, shift=Vector()): +def get_path(nodes, shift=Vector()): + path = '' prev_node = None for node_id in nodes: node = node_map[node_id] flinged1 = flinger.fling(Geo(node['lat'], node['lon'])) + shift if prev_node: flinged2 = flinger.fling(Geo(prev_node['lat'], prev_node['lon'])) + shift - output_file.write('L ' + `flinged1.x` + ',' + `flinged1.y` + ' ') + path += ('L ' + `flinged1.x` + ',' + `flinged1.y` + ' ') else: - output_file.write('\n') + if nodes[0] == nodes[-1]: + path += 'Z' + return path + def draw_point_shape(name, x, y, fill): if not isinstance(name, list): @@ -175,52 +178,6 @@ def point(k, v, x, y, fill, text_y): # Ways drawing -def construct_layers(): - """ - Construct layers. One layer may contain elements of different types. - """ - layers = {} - - for way_id in way_map: - way = way_map[way_id] - if not ('layer' in way['tags']): - way['tags']['layer'] = 0 - if not (float(way['tags']['layer']) in layers): - layers[float(way['tags']['layer'])] = \ - {'b': [], 'h1': [], 'h2': [], 'r': [], 'n': [], 'l': [], - 'a': [], 'le': [], 'ba': [], 'bo': [], 'w': []} - layer = layers[float(way['tags']['layer'])] - if 'building' in way['tags']: - layer['b'].append(way) - if 'natural' in way['tags']: - layer['n'].append(way) - if 'landuse' in way['tags']: - layer['l'].append(way) - if 'railway' in way['tags']: - layer['r'].append(way) - if 'amenity' in way['tags']: - layer['a'].append(way) - if 'leisure' in way['tags']: - layer['le'].append(way) - if 'barrier' in way['tags']: - layer['ba'].append(way) - if 'highway' in way['tags']: - layer['h1'].append(way) - 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(): - # if not (key in ['layer', 'note']): - # empty = False - # if not empty: - # print 'Unknown kind of way:', way['tags'] - return layers - - def draw_raw_ways(): for way_id in way_map: way = way_map[way_id] @@ -242,67 +199,97 @@ def line_center(node_ids): def construct_ways(drawing): for way_id in way_map: way = way_map[way_id] - tags = way['tags'] - nodes = way['nodes'] - if nodes[0] == nodes[-1]: + construct_way(drawing, way['nodes'], way['tags'], None) + +def construct_way(drawing, nodes, tags, path): + if nodes and nodes[0] == nodes[-1]: style = 'fill:#0000FF;stroke:none;' else: style = 'stroke:#0000FF;fill:none;' + is_area = None + if nodes: + is_area = nodes[0] == nodes[-1] layer = float(tags['layer']) if ('layer' in tags) else 0 - c = line_center(nodes) - if 'landuse' in tags: - if tags['landuse'] == 'grass': - style = 'fill:#' + grass_color + ';stroke:none;' - elif tags['landuse'] == 'conservation': - style = 'fill:#' + grass_color + ';stroke:none;' - elif tags['landuse'] == 'forest': - style = 'fill:#' + wood_color + ';stroke:none;' - elif tags['landuse'] == 'garages': - style = 'fill:#' + parking_color + ';stroke:none;' - shapes, fill, processed = process.get_icon(tags, scheme, '444444') - drawing['nodes'].append({'shapes': shapes, - 'x': c.x, 'y': c.y, 'color': fill, 'processed': processed}) - elif way['tags']['landuse'] == 'construction': - style = 'fill:#' + construction_color + ';stroke:none;' - elif way['tags']['landuse'] in ['residential', 'commercial']: - continue - elif 'building' in tags: - text_y = 0 - style = 'fill:#' + building_color + ';stroke:#' + \ - building_border_color + ';opacity:1.0;' - shapes, fill, processed = process.get_icon(tags, scheme, '444444') - drawing['nodes'].append({'shapes': shapes, 'x': c.x, 'y': c.y, - 'color': fill, 'priority': 1, 'processed': processed, - 'tags': tags}) - elif 'amenity' in tags: - if tags['amenity'] == 'parking': - style = 'fill:#' + parking_color + ';stroke:none;' - draw_point_shape('parking', c.x, c.y, '444444') - elif 'natural' in tags: - v = way['tags']['natural'] + if nodes: + c = line_center(nodes) + if 'natural' in tags: + v = tags['natural'] style = 'stroke:none;' if v == 'wood': style += 'fill:#' + wood_color + ';' + layer += 0.021 elif v == 'scrub': style += 'fill:#' + wood_color + ';' + layer += 0.021 elif v == 'sand': style += 'fill:#' + sand_color + ';' + layer += 0.021 elif v == 'beach': style += 'fill:#' + beach_color + ';' + layer += 0.021 elif v == 'desert': style += 'fill:#' + desert_color + ';' + layer += 0.021 elif v == 'forest': style += 'fill:#' + wood_color + ';' + layer += 0.021 + elif v == 'tree_row': + style += 'fill:none;stroke:#' + wood_color + ';stroke-width:5;' + layer += 0.022 elif v == 'water': style = 'fill:#' + water_color + ';stroke:#' + \ water_border_color + ';stroke-width:1.0;' + layer += 0.021 + elif 'landuse' in tags: + if tags['landuse'] == 'grass': + style = 'fill:#' + grass_color + ';stroke:none;' + layer += 0.011 + elif tags['landuse'] == 'conservation': + style = 'fill:#' + grass_color + ';stroke:none;' + layer += 0.022 + elif tags['landuse'] == 'forest': + style = 'fill:#' + wood_color + ';stroke:none;' + layer += 0.023 + elif tags['landuse'] == 'garages': + style = 'fill:#' + parking_color + ';stroke:none;' + layer += 0.024 + shapes, fill, processed = process.get_icon(tags, scheme, '444444') + if nodes: + drawing['nodes'].append({'shapes': shapes, 'tags': tags, + 'x': c.x, 'y': c.y, 'color': fill, 'path': path, + 'processed': processed}) + elif tags['landuse'] == 'construction': + layer += 0.002 + style = 'fill:#' + construction_color + ';stroke:none;' + elif tags['landuse'] in ['residential', 'commercial']: + return + elif 'building' in tags: + text_y = 0 + layer += 0.05 + style = 'fill:#' + building_color + ';stroke:#' + \ + building_border_color + ';opacity:1.0;' + shapes, fill, processed = process.get_icon(tags, scheme, '444444') + if 'height' in tags: + layer += float(tags['height']) + if nodes: + drawing['nodes'].append({'shapes': shapes, 'x': c.x, 'y': c.y, + 'color': fill, 'priority': 1, 'processed': processed, + 'tags': tags, 'path': path}) + elif 'amenity' in tags: + layer += 0.05 + if tags['amenity'] == 'parking': + style = 'fill:#' + parking_color + ';stroke:none;' + if nodes: + draw_point_shape('parking', c.x, c.y, '444444') elif 'waterway' in tags: + layer += 0.04 if tags['waterway'] == 'riverbank': style = 'fill:#' + water_color + ';stroke:#' + \ water_border_color + ';stroke-width:1.0;' elif tags['waterway'] == 'river': style = 'fill:none;stroke:#' + water_color + ';stroke-width:10.0;' elif 'railway' in tags: + layer += 0.04 v = tags['railway'] style = 'fill:none;stroke-dasharray:none;stroke-linejoin:round;' + \ 'stroke-linecap:round;stroke-width:' @@ -310,14 +297,16 @@ def construct_ways(drawing): if v in ['narrow_gauge', 'tram']: style += '2;stroke:#000000;' else: - continue + return elif 'highway' in tags: + layer += 0.04 v = tags['highway'] if 'tunnel' in tags and tags['tunnel'] == 'yes': style = 'fill:none;stroke:#FFFFFF;stroke-dasharray:none;' + \ 'stroke-linejoin:round;stroke-linecap:round;stroke-width:10;' drawing['ways'].append({'kind': 'way', 'nodes': nodes, - 'layer': layer - 100, 'priority': 50, 'style': style}) + 'layer': layer - 100, 'priority': 50, 'style': style, + 'path': path}) style = 'fill:none;stroke:#AAAAAA;stroke-dasharray:none;' + \ 'stroke-linejoin:round;stroke-linecap:round;stroke-width:' @@ -334,7 +323,8 @@ def construct_ways(drawing): if style: style += ';' drawing['ways'].append({'kind': 'way', 'nodes': nodes, - 'layer': layer - 0.01, 'priority': 50, 'style': style}) + 'layer': layer - 0.01, 'priority': 50, 'style': style, + 'path': path}) style = 'fill:none;stroke:#FFFFFF;stroke-linecap:round;' + \ 'stroke-linejoin:round;stroke-width:' @@ -347,38 +337,114 @@ def construct_ways(drawing): elif v == 'residential': style += '6' elif v == 'service': style += '5' elif v in ['footway', 'pedestrian']: - style += '1;stroke-dasharray:3,3;stroke-linecap:butt;stroke:#888888' + if 'area' in tags and tags['area'] == 'yes': + style += '1;stroke:none;fill:#DDDDDD' + else: + style += '1;stroke-dasharray:3,3;stroke-linecap:butt;stroke:#888888' elif v == 'steps': style += '5;stroke-dasharray:1,2;stroke-linecap:butt;stroke:#888888' elif v == 'path': style += '1;stroke-dasharray:5,5;stroke-linecap:butt;stroke:#888888' style += ';' elif 'leisure' in tags: - c = line_center(way['nodes']) if tags['leisure'] == 'playground': style = 'fill:#' + playground_color + ';opacity:0.2;' - draw_point_shape('toy_horse', c.x, c.y, '444444') + if nodes: + draw_point_shape('toy_horse', c.x, c.y, '444444') elif tags['leisure'] == 'garden': style = 'fill:#' + grass_color + ';' elif tags['leisure'] == 'pitch': style = 'fill:#' + playground_color + ';opacity:0.2;' elif tags['leisure'] == 'park': - continue + return else: style = 'fill:#FF0000;opacity:0.2;' elif 'barrier' in tags: + layer += 5 if tags['barrier'] == 'hedge': style += 'fill:none;stroke:#' + wood_color + ';stroke-width:4;' - else: + elif tags['barrier'] == 'fense': style += 'fill:none;stroke:#000000;stroke-width:1;opacity:0.4;' + elif tags['barrier'] == 'kerb': + style += 'fill:none;stroke:#000000;stroke-width:1;opacity:0.2;' + else: + style += 'fill:none;stroke:#000000;stroke-width:1;opacity:0.3;' elif 'border' in tags: style += 'fill:none;stroke:#FF0000;stroke-width:0.5;' + \ 'stroke-dahsarray:10,20;' else: - continue + return drawing['ways'].append({'kind': 'way', 'nodes': nodes, 'layer': layer, - 'priority': 50, 'style': style}) + 'priority': 50, 'style': style, 'path': path}) + + +def glue_ways(ways): + new_ways = [] + processed = [] + for way in ways: + if way['id'] in processed: + continue + if way['nodes'][0] == way['nodes'][-1]: + new_ways.append(way['nodes']) + processed.append(way['id']) + for other_way in ways: + if way == other_way: + continue + if way['id'] in processed or other_way['id'] in processed: + break + if way['nodes'][0] == other_way['nodes'][0]: + o = other_way['nodes'][1:] + o.reverse() + way['nodes'] = o + way['nodes'] + processed.append(other_way['id']) + elif way['nodes'][0] == other_way['nodes'][-1]: + way['nodes'] = other_way['nodes'][:-1] + way['nodes'] + processed.append(other_way['id']) + elif way['nodes'][-1] == other_way['nodes'][-1]: + o = other_way['nodes'][:-1] + o.reverse() + way['nodes'] += o + processed.append(other_way['id']) + elif way['nodes'][-1] == other_way['nodes'][0]: + way['nodes'] += other_way['nodes'][1:] + processed.append(other_way['id']) + if way['nodes'][0] == way['nodes'][-1]: + new_ways.append(way['nodes']) + processed.append(way['id']) + for way in ways: + if not (way['id'] in processed): + new_ways.append(way['nodes']) + + return new_ways + + +def construct_relations(drawing): + for relation_id in relation_map: + relation = relation_map[relation_id] + tags = relation['tags'] + if tags['type'] == 'multipolygon': + style = 'fill:#FFEEEE;stroke:#FF0000;stroke-width:0.5;' + inners, outers = [], [] + for member in relation['members']: + if member['type'] == 'way': + if member['role'] == 'inner': + if member['ref'] in way_map: + inners.append(way_map[member['ref']]) + elif member['role'] == 'outer': + if member['ref'] in way_map: + outers.append(way_map[member['ref']]) + p = '' + inners_path = glue_ways(inners) + outers_path = glue_ways(outers) + for way in outers_path: + path = get_path(way) + p += path + ' ' + for way in inners_path: + way.reverse() + path = get_path(way) + p += path + ' ' + construct_way(drawing, None, tags, p) # Nodes drawing @@ -503,10 +569,17 @@ def node_sorter(element): else: return 0 + def draw(drawing, show_missed_tags=False, overlap=14, draw=True): ways = sorted(drawing['ways'], key=way_sorter) for way in ways: - draw_path(way['nodes'], way['style']) + if way['nodes']: + path = get_path(way['nodes']) + output_file.write('\n') + else: + output_file.write('\n') nodes = sorted(drawing['nodes'], key=node_sorter) for node in nodes: draw_shapes(node['shapes'], overlap, points, node['x'], node['y'], @@ -526,7 +599,7 @@ if not os.path.isfile(input_file_name): sys.exit(1) node_map, way_map, relation_map = osm_reader.parse_osm_file(input_file_name, - parse_ways=options['draw_ways'], parse_relations=False) + parse_ways=options['draw_ways'], parse_relations=options['draw_ways']) output_file = svg.SVG(open(options['output_file_name'], 'w+')) @@ -572,6 +645,7 @@ drawing = {'nodes': [], 'ways': []} if options['draw_ways']: construct_ways(drawing) + construct_relations(drawing) construct_nodes(drawing) diff --git a/engine/osm_reader.py b/engine/osm_reader.py index 9ae6536..07ebf09 100644 --- a/engine/osm_reader.py +++ b/engine/osm_reader.py @@ -189,7 +189,7 @@ def parse_osm_file_fast(file_name, parse_nodes=True, parse_ways=True, element['tags'][k] = v elif line[:5] in ['