diff -r 9139a94e540c -r 3b86597c5a88 regions.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regions.py Fri Apr 13 17:32:40 2018 +0300 @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +from xml.etree import ElementTree +from geometry import * + +def parse_nodes(root): + nodes = {} + for child in root: + if child.tag == 'node': + lat, lon = float(child.attrib['lat']), float(child.attrib['lon']) + nodes[child.attrib['id']] = Location(lat, lon) + return nodes + +def parse_way(way, nodes): + result = {'shape': [], 'name': None} + for child in way: + if child.tag == 'nd': + result['shape'].append(child.attrib['ref']) + elif child.tag == 'tag': + if child.attrib['k'] == 'shape': + raise ValueError('tag "shape" is not allowed') + result[child.attrib['k']] = child.attrib['v'] + if result['shape'][-1] != result['shape'][0]: + raise ValueError('polygon for %r is not closed' % result) + result['shape'] = [nodes[ref] for ref in result['shape'][:-1]] + result['shape'] = Polygon(*result['shape']) + return result + +def parse_regions(filename): + tree = ElementTree.parse(filename) + root = tree.getroot() + nodes = parse_nodes(root) + regions = {} + for child in root: + if child.tag == 'way': + way = parse_way(child, nodes = nodes) + if 'region' in way and 'name' in way: + way['priority'] = int(way.get('priority', 1)) + regions[way['name']] = way + return regions