regions.py

Fri, 04 May 2018 21:44:27 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Fri, 04 May 2018 21:44:27 +0300
changeset 100
9b5e6b5e5e0b
parent 88
3b86597c5a88
child 109
88a5110b66ba
permissions
-rw-r--r--

..

88
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python3
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
2 from xml.etree import ElementTree
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
3 from geometry import *
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
5 def parse_nodes(root):
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
6 nodes = {}
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
7 for child in root:
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8 if child.tag == 'node':
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
9 lat, lon = float(child.attrib['lat']), float(child.attrib['lon'])
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
10 nodes[child.attrib['id']] = Location(lat, lon)
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11 return nodes
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
12
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
13 def parse_way(way, nodes):
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
14 result = {'shape': [], 'name': None}
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
15 for child in way:
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
16 if child.tag == 'nd':
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
17 result['shape'].append(child.attrib['ref'])
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
18 elif child.tag == 'tag':
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 if child.attrib['k'] == 'shape':
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
20 raise ValueError('tag "shape" is not allowed')
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
21 result[child.attrib['k']] = child.attrib['v']
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
22 if result['shape'][-1] != result['shape'][0]:
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
23 raise ValueError('polygon for %r is not closed' % result)
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
24 result['shape'] = [nodes[ref] for ref in result['shape'][:-1]]
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 result['shape'] = Polygon(*result['shape'])
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
26 return result
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
27
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
28 def parse_regions(filename):
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
29 tree = ElementTree.parse(filename)
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30 root = tree.getroot()
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 nodes = parse_nodes(root)
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
32 regions = {}
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 for child in root:
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
34 if child.tag == 'way':
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
35 way = parse_way(child, nodes = nodes)
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
36 if 'region' in way and 'name' in way:
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
37 way['priority'] = int(way.get('priority', 1))
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
38 regions[way['name']] = way
3b86597c5a88 major update, moved the map to an osm patch
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
39 return regions

mercurial