31 result[key] = child.attrib['v'] |
31 result[key] = child.attrib['v'] |
32 if key == 'boundary' and result['boundary'] not in REGION_KEY_VALUES: |
32 if key == 'boundary' and result['boundary'] not in REGION_KEY_VALUES: |
33 return None # we're not interested in it! |
33 return None # we're not interested in it! |
34 if shape[-1] != shape[0]: |
34 if shape[-1] != shape[0]: |
35 raise ValueError('polygon is not closed: %r' % result) |
35 raise ValueError('polygon is not closed: %r' % result) |
36 if 'boundary' not in result: |
36 if 'boundary' in result: |
37 raise ValueError('polygon not tagged as a boundary: %r' % result) |
37 shape = [nodes[ref] for ref in shape[:-1]] |
38 shape = [nodes[ref] for ref in shape[:-1]] |
38 choose_shapes(result, result['boundary']).append(Polygon(*shape)) |
39 choose_shapes(result, result['boundary']).append(Polygon(*shape)) |
39 return result |
40 return result |
|
41 |
40 |
42 def parse_boundaries(root, *, nodes): |
41 def parse_boundaries(root, *, nodes): |
43 for child in root: |
42 for child in root: |
44 if child.tag == 'way': |
43 if child.tag == 'way': |
45 way = parse_way(child, nodes = nodes) |
44 way = parse_way(child, nodes = nodes) |
52 root = tree.getroot() |
51 root = tree.getroot() |
53 nodes = parse_nodes(root) |
52 nodes = parse_nodes(root) |
54 regions = dict() |
53 regions = dict() |
55 extra_shapes = list() |
54 extra_shapes = list() |
56 for way in parse_boundaries(root, nodes = nodes): |
55 for way in parse_boundaries(root, nodes = nodes): |
57 if 'boundary' in way and way['boundary'] != 'subregion' and 'name' in way: |
56 if 'boundary' in way and 'ref' in way: |
58 # defines a region |
57 # defines a region |
59 way['via_factor'] = int(way.get('via_factor', 1)) |
58 way['via_factor'] = int(way.get('via_factor', 1)) |
60 if way['name'] in regions: |
59 if way['ref'] in regions: |
61 raise ValueError(str.format( |
60 raise ValueError(str.format( |
62 'Region {name} defined twice', |
61 'Region {ref} defined twice', |
63 name = repr(way['name']), |
62 ref = repr(way['ref']), |
64 )) |
63 )) |
65 regions[way['name']] = way |
64 regions[way['ref']] = way |
66 del way['boundary'] |
65 del way['boundary'] |
67 if 'external' in way: |
66 if 'external' in way: |
68 way['boundary'] = 'minor_region' |
67 way['boundary'] = 'minor_region' |
69 for prefix in ['', 'short_', 'internal_']: |
68 for prefix in ['', 'short_', 'internal_']: |
70 name_key = prefix + 'name' |
69 name_key = prefix + 'name:fi' |
71 if name_key in way and way[name_key] and name_key + ':ja' not in way: |
70 ja_name_key = prefix + 'name:ja' |
72 way[name_key + ':ja'] = transliterate_katakana(way[name_key]) |
71 if name_key in way and way[name_key] and ja_name_key not in way: |
|
72 way[ja_name_key] = transliterate_katakana(way[name_key]) |
73 elif 'boundary' in way and 'is_in' in way: |
73 elif 'boundary' in way and 'is_in' in way: |
74 # adds an extra shape to an existing region |
74 # adds an extra shape to an existing region |
75 extra_shapes.append(way) |
75 extra_shapes.append(way) |
76 for extra_shape in extra_shapes: |
76 for extra_shape in extra_shapes: |
77 name = extra_shape['is_in'] |
77 name = extra_shape['is_in'] |