diff --git a/overpy/__init__.py b/overpy/__init__.py index 2c019fd..8e038bd 100644 --- a/overpy/__init__.py +++ b/overpy/__init__.py @@ -1127,7 +1127,7 @@ class RelationMember(object): Base class to represent a member of a relation. """ - def __init__(self, ref=None, role=None, result=None): + def __init__(self, attributes=None, geometry=None, ref=None, role=None, result=None): """ :param ref: Reference Id :type ref: Integer @@ -1138,6 +1138,8 @@ def __init__(self, ref=None, role=None, result=None): self.ref = ref self._result = result self.role = role + self.attributes = attributes + self.geometry = geometry @classmethod def from_json(cls, data, result=None): @@ -1160,7 +1162,35 @@ def from_json(cls, data, result=None): ref = data.get("ref") role = data.get("role") - return cls(ref=ref, role=role, result=result) + + attributes = {} + ignore = ["geometry", "type", "ref", "role"] + for n, v in data.items(): + if n in ignore: + continue + attributes[n] = v + + geometry = data.get("geometry") + if isinstance(geometry, list): + geometry_orig = geometry + geometry = [] + for v in geometry_orig: + geometry.append( + RelationWayGeometryValue( + lat=v.get("lat"), + lon=v.get("lon") + ) + ) + else: + geometry = None + + return cls( + attributes=attributes, + geometry=geometry, + ref=ref, + role=role, + result=result + ) @classmethod def from_xml(cls, child, result=None): @@ -1185,7 +1215,33 @@ def from_xml(cls, child, result=None): if ref is not None: ref = int(ref) role = child.attrib.get("role") - return cls(ref=ref, role=role, result=result) + + attributes = {} + ignore = ["geometry", "ref", "role", "type"] + for n, v in child.attrib.items(): + if n in ignore: + continue + attributes[n] = v + + geometry = None + for sub_child in child: + if sub_child.tag.lower() == "nd": + if geometry is None: + geometry = [] + geometry.append( + RelationWayGeometryValue( + lat=Decimal(sub_child.attrib["lat"]), + lon=Decimal(sub_child.attrib["lon"]) + ) + ) + + return cls( + attributes=attributes, + geometry=geometry, + ref=ref, + role=role, + result=result + ) class RelationNode(RelationMember): @@ -1208,6 +1264,15 @@ def __repr__(self): return "".format(self.ref, self.role) +class RelationWayGeometryValue(object): + def __init__(self, lat, lon): + self.lat = lat + self.lon = lon + + def __repr__(self): + return "".format(self.lat, self.lon) + + class RelationRelation(RelationMember): _type_value = "relation" @@ -1235,7 +1300,7 @@ class OSMSAXHandler(handler.ContentHandler): #: Tuple of opening elements to ignore ignore_start = ('osm', 'meta', 'note', 'bounds', 'remark') #: Tuple of closing elements to ignore - ignore_end = ('osm', 'meta', 'note', 'bounds', 'remark', 'tag', 'nd', 'member', 'center') + ignore_end = ('osm', 'meta', 'note', 'bounds', 'remark', 'tag', 'nd', 'center') def __init__(self, result): """ @@ -1245,6 +1310,8 @@ def __init__(self, result): handler.ContentHandler.__init__(self) self._result = result self._curr = {} + #: Current relation member object + self.cur_relation_member = None def startElement(self, name, attrs): """ @@ -1392,11 +1459,21 @@ def _handle_start_nd(self, attrs): :param attrs: Attributes of the element :type attrs: Dict """ - try: - node_ref = attrs['ref'] - except KeyError: - raise ValueError("Unable to find required ref value.") - self._curr['node_ids'].append(int(node_ref)) + if isinstance(self.cur_relation_member, RelationWay): + if self.cur_relation_member.geometry is None: + self.cur_relation_member.geometry = [] + self.cur_relation_member.geometry.append( + RelationWayGeometryValue( + lat=Decimal(attrs["lat"]), + lon=Decimal(attrs["lon"]) + ) + ) + else: + try: + node_ref = attrs['ref'] + except KeyError: + raise ValueError("Unable to find required ref value.") + self._curr['node_ids'].append(int(node_ref)) def _handle_start_relation(self, attrs): """ @@ -1429,7 +1506,10 @@ def _handle_start_member(self, attrs): :param attrs: Attributes of the element :type attrs: Dict """ + params = { + # ToDo: Parse attributes + 'attributes': {}, 'ref': None, 'result': self._result, 'role': None @@ -1439,13 +1519,18 @@ def _handle_start_member(self, attrs): if attrs.get('role', None): params['role'] = attrs['role'] - if attrs['type'] == 'area': - self._curr['members'].append(RelationArea(**params)) - elif attrs['type'] == 'node': - self._curr['members'].append(RelationNode(**params)) - elif attrs['type'] == 'way': - self._curr['members'].append(RelationWay(**params)) - elif attrs['type'] == 'relation': - self._curr['members'].append(RelationRelation(**params)) - else: + cls_map = { + "area": RelationArea, + "node": RelationNode, + "relation": RelationRelation, + "way": RelationWay + } + cls = cls_map.get(attrs["type"]) + if cls is None: raise ValueError("Undefined type for member: '%s'" % attrs['type']) + + self.cur_relation_member = cls(**params) + self._curr['members'].append(self.cur_relation_member) + + def _handle_end_member(self): + self.cur_relation_member = None diff --git a/tests/README.md b/tests/README.md index c342699..4db1894 100644 --- a/tests/README.md +++ b/tests/README.md @@ -21,6 +21,14 @@ relation-03 (2016-11-23) out center; ``` +relation-04 (2016-11-24) +------------------------ + +``` +(rel["ref"="A 555"];); +out geom; +``` + way-03.xml (2016-11-22) ----------------------- diff --git a/tests/base_class.py b/tests/base_class.py index 9f891b1..0fc04a7 100644 --- a/tests/base_class.py +++ b/tests/base_class.py @@ -259,6 +259,34 @@ def _test_relation03(self, result): assert relation.center_lat == Decimal("50.8176646") assert relation.center_lon == Decimal("7.0208539") + def _test_relation04(self, result): + assert len(result.nodes) == 0 + assert len(result.relations) == 1 + assert len(result.ways) == 0 + + relation = result.relations[0] + + assert isinstance(relation, overpy.Relation) + assert isinstance(relation.id, int) + assert relation.id == 23092 + + assert isinstance(relation.tags, dict) + assert len(relation.tags) == 10 + + way = relation.members[2] + + assert isinstance(way, overpy.RelationWay) + assert len(way.attributes) == 0 + assert isinstance(way.attributes, dict) + + assert isinstance(way.geometry, list) + assert len(way.geometry) == 2 + assert isinstance(way.geometry[0], overpy.RelationWayGeometryValue) + assert isinstance(way.geometry[0].lat, Decimal) + assert isinstance(way.geometry[0].lon, Decimal) + assert way.geometry[0].lat == Decimal("50.8137408") + assert way.geometry[0].lon == Decimal("6.9813352") + class BaseTestWay(object): def _test_way01(self, result): diff --git a/tests/json/relation-04.json b/tests/json/relation-04.json new file mode 100644 index 0000000..a1be375 --- /dev/null +++ b/tests/json/relation-04.json @@ -0,0 +1,1378 @@ +{ + "version": 0.6, + "generator": "Overpass API", + "osm3s": { + "timestamp_osm_base": "2016-11-24T21:40:02Z", + "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL." + }, + "elements": [ + +{ + "type": "relation", + "id": 23092, + "bounds": { + "minlat": 50.7432318, + "minlon": 6.9639432, + "maxlat": 50.8920975, + "maxlon": 7.0777645 + }, + "members": [ + { + "type": "way", + "ref": 4334856, + "role": "", + "geometry": [ + { "lat": 50.8104598, "lon": 6.9871803 }, + { "lat": 50.8117239, "lon": 6.9849282 } + ] + }, + { + "type": "way", + "ref": 234434903, + "role": "", + "geometry": [ + { "lat": 50.8117239, "lon": 6.9849282 }, + { "lat": 50.8137408, "lon": 6.9813352 } + ] + }, + { + "type": "way", + "ref": 37881522, + "role": "", + "geometry": [ + { "lat": 50.8137408, "lon": 6.9813352 }, + { "lat": 50.8140146, "lon": 6.9808445 } + ] + }, + { + "type": "way", + "ref": 37881521, + "role": "", + "geometry": [ + { "lat": 50.8140146, "lon": 6.9808445 }, + { "lat": 50.8193541, "lon": 6.9713457 }, + { "lat": 50.8203182, "lon": 6.9697248 }, + { "lat": 50.8210652, "lon": 6.9685758 }, + { "lat": 50.8217885, "lon": 6.9676136 }, + { "lat": 50.8225495, "lon": 6.9667439 }, + { "lat": 50.8233005, "lon": 6.9660515 }, + { "lat": 50.8238128, "lon": 6.9656463 }, + { "lat": 50.8243279, "lon": 6.9653077 } + ] + }, + { + "type": "way", + "ref": 4356491, + "role": "", + "geometry": [ + { "lat": 50.7433997, "lon": 7.0777645 }, + { "lat": 50.7434097, "lon": 7.0775890 }, + { "lat": 50.7434629, "lon": 7.0774402 }, + { "lat": 50.7435198, "lon": 7.0773718 }, + { "lat": 50.7437507, "lon": 7.0771524 } + ] + }, + { + "type": "way", + "ref": 235363211, + "role": "", + "geometry": [ + { "lat": 50.7437507, "lon": 7.0771524 }, + { "lat": 50.7446592, "lon": 7.0762926 } + ] + }, + { + "type": "way", + "ref": 48290877, + "role": "", + "geometry": [ + { "lat": 50.7446592, "lon": 7.0762926 }, + { "lat": 50.7450803, "lon": 7.0757571 }, + { "lat": 50.7453888, "lon": 7.0753312 }, + { "lat": 50.7457125, "lon": 7.0748518 }, + { "lat": 50.7460370, "lon": 7.0743265 }, + { "lat": 50.7462718, "lon": 7.0739425 }, + { "lat": 50.7464798, "lon": 7.0735173 }, + { "lat": 50.7468359, "lon": 7.0727449 } + ] + }, + { + "type": "way", + "ref": 210683519, + "role": "", + "geometry": [ + { "lat": 50.7468359, "lon": 7.0727449 }, + { "lat": 50.7471006, "lon": 7.0720546 }, + { "lat": 50.7473135, "lon": 7.0714640 }, + { "lat": 50.7475199, "lon": 7.0708095 }, + { "lat": 50.7479418, "lon": 7.0693723 } + ] + }, + { + "type": "way", + "ref": 42743961, + "role": "", + "geometry": [ + { "lat": 50.7464112, "lon": 7.0734310 }, + { "lat": 50.7459053, "lon": 7.0743560 }, + { "lat": 50.7457638, "lon": 7.0745740 } + ] + }, + { + "type": "way", + "ref": 210683522, + "role": "", + "geometry": [ + { "lat": 50.7457638, "lon": 7.0745740 }, + { "lat": 50.7456300, "lon": 7.0747409 }, + { "lat": 50.7454858, "lon": 7.0749187 }, + { "lat": 50.7452550, "lon": 7.0752554 }, + { "lat": 50.7450000, "lon": 7.0756385 }, + { "lat": 50.7448878, "lon": 7.0758027 }, + { "lat": 50.7447522, "lon": 7.0759730 }, + { "lat": 50.7445514, "lon": 7.0762032 }, + { "lat": 50.7443577, "lon": 7.0764098 }, + { "lat": 50.7441185, "lon": 7.0766490 } + ] + }, + { + "type": "way", + "ref": 48290881, + "role": "", + "geometry": [ + { "lat": 50.7441185, "lon": 7.0766490 }, + { "lat": 50.7439033, "lon": 7.0768575 }, + { "lat": 50.7437722, "lon": 7.0769631 }, + { "lat": 50.7436609, "lon": 7.0770394 } + ] + }, + { + "type": "way", + "ref": 235363214, + "role": "", + "geometry": [ + { "lat": 50.7436609, "lon": 7.0770394 }, + { "lat": 50.7435688, "lon": 7.0771154 }, + { "lat": 50.7434662, "lon": 7.0771906 }, + { "lat": 50.7434058, "lon": 7.0772230 }, + { "lat": 50.7433331, "lon": 7.0772525 }, + { "lat": 50.7432822, "lon": 7.0772636 }, + { "lat": 50.7432318, "lon": 7.0772601 } + ] + }, + { + "type": "way", + "ref": 4400137, + "role": "", + "geometry": [ + { "lat": 50.8887155, "lon": 6.9676900 }, + { "lat": 50.8876384, "lon": 6.9678150 } + ] + }, + { + "type": "way", + "ref": 230940375, + "role": "", + "geometry": [ + { "lat": 50.8876384, "lon": 6.9678150 }, + { "lat": 50.8870572, "lon": 6.9679058 }, + { "lat": 50.8858563, "lon": 6.9680103 } + ] + }, + { + "type": "way", + "ref": 4400140, + "role": "", + "geometry": [ + { "lat": 50.8797318, "lon": 6.9690108 }, + { "lat": 50.8799208, "lon": 6.9689396 }, + { "lat": 50.8807058, "lon": 6.9688470 }, + { "lat": 50.8824762, "lon": 6.9687068 } + ] + }, + { + "type": "way", + "ref": 4400142, + "role": "", + "geometry": [ + { "lat": 50.8919691, "lon": 6.9670292 }, + { "lat": 50.8918982, "lon": 6.9671419 }, + { "lat": 50.8918068, "lon": 6.9672404 }, + { "lat": 50.8917186, "lon": 6.9673001 }, + { "lat": 50.8916153, "lon": 6.9673480 }, + { "lat": 50.8914588, "lon": 6.9673816 } + ] + }, + { + "type": "way", + "ref": 235824476, + "role": "", + "geometry": [ + { "lat": 50.8914588, "lon": 6.9673816 }, + { "lat": 50.8892470, "lon": 6.9676302 }, + { "lat": 50.8887155, "lon": 6.9676900 } + ] + }, + { + "type": "way", + "ref": 4400143, + "role": "", + "geometry": [ + { "lat": 50.8887787, "lon": 6.9681629 }, + { "lat": 50.8896224, "lon": 6.9680604 }, + { "lat": 50.8897525, "lon": 6.9680446 } + ] + }, + { + "type": "way", + "ref": 235824475, + "role": "", + "geometry": [ + { "lat": 50.8897525, "lon": 6.9680446 }, + { "lat": 50.8906556, "lon": 6.9679349 }, + { "lat": 50.8912013, "lon": 6.9678862 } + ] + }, + { + "type": "way", + "ref": 178797123, + "role": "", + "geometry": [ + { "lat": 50.8912013, "lon": 6.9678862 }, + { "lat": 50.8913492, "lon": 6.9678648 } + ] + }, + { + "type": "way", + "ref": 233553030, + "role": "", + "geometry": [ + { "lat": 50.8913492, "lon": 6.9678648 }, + { "lat": 50.8916648, "lon": 6.9677762 }, + { "lat": 50.8917895, "lon": 6.9677694 }, + { "lat": 50.8919294, "lon": 6.9677947 }, + { "lat": 50.8920975, "lon": 6.9678618 } + ] + }, + { + "type": "way", + "ref": 4829989, + "role": "", + "geometry": [ + { "lat": 50.8105743, "lon": 6.9865001 }, + { "lat": 50.8088268, "lon": 6.9896207 } + ] + }, + { + "type": "way", + "ref": 99834112, + "role": "", + "geometry": [ + { "lat": 50.8088268, "lon": 6.9896207 }, + { "lat": 50.8066272, "lon": 6.9935457 }, + { "lat": 50.8057165, "lon": 6.9951151 } + ] + }, + { + "type": "way", + "ref": 133081219, + "role": "", + "geometry": [ + { "lat": 50.8057165, "lon": 6.9951151 }, + { "lat": 50.8050332, "lon": 6.9962100 }, + { "lat": 50.8043133, "lon": 6.9972614 } + ] + }, + { + "type": "way", + "ref": 234434905, + "role": "", + "geometry": [ + { "lat": 50.8043133, "lon": 6.9972614 }, + { "lat": 50.8038004, "lon": 6.9979304 }, + { "lat": 50.8032120, "lon": 6.9986363 }, + { "lat": 50.8029818, "lon": 6.9989181 } + ] + }, + { + "type": "way", + "ref": 20661567, + "role": "", + "geometry": [ + { "lat": 50.8849681, "lon": 6.9681126 }, + { "lat": 50.8839667, "lon": 6.9682524 }, + { "lat": 50.8829770, "lon": 6.9684059 } + ] + }, + { + "type": "way", + "ref": 230941900, + "role": "", + "geometry": [ + { "lat": 50.8829770, "lon": 6.9684059 }, + { "lat": 50.8826286, "lon": 6.9684595 } + ] + }, + { + "type": "way", + "ref": 20661568, + "role": "", + "geometry": [ + { "lat": 50.8850872, "lon": 6.9685052 }, + { "lat": 50.8859127, "lon": 6.9684079 } + ] + }, + { + "type": "way", + "ref": 20661572, + "role": "", + "geometry": [ + { "lat": 50.8859127, "lon": 6.9684079 }, + { "lat": 50.8872823, "lon": 6.9682592 }, + { "lat": 50.8876807, "lon": 6.9682539 } + ] + }, + { + "type": "way", + "ref": 230940374, + "role": "", + "geometry": [ + { "lat": 50.8876807, "lon": 6.9682539 }, + { "lat": 50.8887787, "lon": 6.9681629 } + ] + }, + { + "type": "way", + "ref": 20661573, + "role": "", + "geometry": [ + { "lat": 50.8858563, "lon": 6.9680103 }, + { "lat": 50.8849681, "lon": 6.9681126 } + ] + }, + { + "type": "way", + "ref": 20662817, + "role": "", + "geometry": [ + { "lat": 50.8823655, "lon": 6.9684998 }, + { "lat": 50.8806620, "lon": 6.9686453 } + ] + }, + { + "type": "way", + "ref": 230941903, + "role": "", + "geometry": [ + { "lat": 50.8806620, "lon": 6.9686453 }, + { "lat": 50.8793943, "lon": 6.9687847 } + ] + }, + { + "type": "way", + "ref": 20662819, + "role": "", + "geometry": [ + { "lat": 50.8824762, "lon": 6.9687068 }, + { "lat": 50.8827522, "lon": 6.9686901 } + ] + }, + { + "type": "way", + "ref": 20662824, + "role": "", + "geometry": [ + { "lat": 50.8827522, "lon": 6.9686901 }, + { "lat": 50.8839133, "lon": 6.9686122 }, + { "lat": 50.8850872, "lon": 6.9685052 } + ] + }, + { + "type": "way", + "ref": 20662827, + "role": "", + "geometry": [ + { "lat": 50.8826286, "lon": 6.9684595 }, + { "lat": 50.8823655, "lon": 6.9684998 } + ] + }, + { + "type": "way", + "ref": 27492515, + "role": "", + "geometry": [ + { "lat": 50.8029818, "lon": 6.9989181 }, + { "lat": 50.8026288, "lon": 6.9992932 } + ] + }, + { + "type": "way", + "ref": 129125122, + "role": "", + "geometry": [ + { "lat": 50.8093979, "lon": 6.9890430 }, + { "lat": 50.8104598, "lon": 6.9871803 } + ] + }, + { + "type": "way", + "ref": 234434901, + "role": "", + "geometry": [ + { "lat": 50.8063753, "lon": 6.9944172 }, + { "lat": 50.8093979, "lon": 6.9890430 } + ] + }, + { + "type": "way", + "ref": 234434904, + "role": "", + "geometry": [ + { "lat": 50.8053262, "lon": 6.9961817 }, + { "lat": 50.8058108, "lon": 6.9953914 }, + { "lat": 50.8063753, "lon": 6.9944172 } + ] + }, + { + "type": "way", + "ref": 27492542, + "role": "", + "geometry": [ + { "lat": 50.8029899, "lon": 6.9991939 }, + { "lat": 50.8032828, "lon": 6.9988807 }, + { "lat": 50.8038702, "lon": 6.9982129 }, + { "lat": 50.8044350, "lon": 6.9974695 }, + { "lat": 50.8053262, "lon": 6.9961817 } + ] + }, + { + "type": "way", + "ref": 27492543, + "role": "", + "geometry": [ + { "lat": 50.8026483, "lon": 6.9995590 }, + { "lat": 50.8029899, "lon": 6.9991939 } + ] + }, + { + "type": "way", + "ref": 29233646, + "role": "", + "geometry": [ + { "lat": 50.8793943, "lon": 6.9687847 }, + { "lat": 50.8716935, "lon": 6.9696241 }, + { "lat": 50.8701666, "lon": 6.9697243 }, + { "lat": 50.8688585, "lon": 6.9697057 }, + { "lat": 50.8652424, "lon": 6.9693872 } + ] + }, + { + "type": "way", + "ref": 235820561, + "role": "", + "geometry": [ + { "lat": 50.8652424, "lon": 6.9693872 }, + { "lat": 50.8636340, "lon": 6.9692339 } + ] + }, + { + "type": "way", + "ref": 29233647, + "role": "", + "geometry": [ + { "lat": 50.8636340, "lon": 6.9692339 }, + { "lat": 50.8608791, "lon": 6.9689787 } + ] + }, + { + "type": "way", + "ref": 235820559, + "role": "", + "geometry": [ + { "lat": 50.8608791, "lon": 6.9689787 }, + { "lat": 50.8590168, "lon": 6.9688055 } + ] + }, + { + "type": "way", + "ref": 235820562, + "role": "", + "geometry": [ + { "lat": 50.8590168, "lon": 6.9688055 }, + { "lat": 50.8523854, "lon": 6.9681888 } + ] + }, + { + "type": "way", + "ref": 29233648, + "role": "", + "geometry": [ + { "lat": 50.8522171, "lon": 6.9684787 }, + { "lat": 50.8590359, "lon": 6.9691023 } + ] + }, + { + "type": "way", + "ref": 29382960, + "role": "", + "geometry": [ + { "lat": 50.8391695, "lon": 6.9667285 }, + { "lat": 50.8411491, "lon": 6.9672118 }, + { "lat": 50.8425706, "lon": 6.9674985 } + ] + }, + { + "type": "way", + "ref": 271008229, + "role": "", + "geometry": [ + { "lat": 50.8425706, "lon": 6.9674985 }, + { "lat": 50.8443277, "lon": 6.9677563 } + ] + }, + { + "type": "way", + "ref": 271008238, + "role": "", + "geometry": [ + { "lat": 50.8443277, "lon": 6.9677563 }, + { "lat": 50.8453254, "lon": 6.9678465 }, + { "lat": 50.8468114, "lon": 6.9679862 } + ] + }, + { + "type": "way", + "ref": 271008230, + "role": "", + "geometry": [ + { "lat": 50.8468114, "lon": 6.9679862 }, + { "lat": 50.8491169, "lon": 6.9681907 } + ] + }, + { + "type": "way", + "ref": 271008226, + "role": "", + "geometry": [ + { "lat": 50.8491169, "lon": 6.9681907 }, + { "lat": 50.8518181, "lon": 6.9684403 } + ] + }, + { + "type": "way", + "ref": 40033062, + "role": "", + "geometry": [ + { "lat": 50.8391857, "lon": 6.9664246 }, + { "lat": 50.8386690, "lon": 6.9662911 } + ] + }, + { + "type": "way", + "ref": 40033063, + "role": "", + "geometry": [ + { "lat": 50.8386690, "lon": 6.9662911 }, + { "lat": 50.8314332, "lon": 6.9644546 } + ] + }, + { + "type": "way", + "ref": 29384561, + "role": "", + "geometry": [ + { "lat": 50.8523854, "lon": 6.9681888 }, + { "lat": 50.8519590, "lon": 6.9681595 } + ] + }, + { + "type": "way", + "ref": 29384563, + "role": "", + "geometry": [ + { "lat": 50.8519590, "lon": 6.9681595 }, + { "lat": 50.8506534, "lon": 6.9680320 } + ] + }, + { + "type": "way", + "ref": 271008224, + "role": "", + "geometry": [ + { "lat": 50.8506534, "lon": 6.9680320 }, + { "lat": 50.8490308, "lon": 6.9678717 } + ] + }, + { + "type": "way", + "ref": 271008227, + "role": "", + "geometry": [ + { "lat": 50.8490308, "lon": 6.9678717 }, + { "lat": 50.8478121, "lon": 6.9677589 } + ] + }, + { + "type": "way", + "ref": 271008237, + "role": "", + "geometry": [ + { "lat": 50.8478121, "lon": 6.9677589 }, + { "lat": 50.8459552, "lon": 6.9676249 }, + { "lat": 50.8451822, "lon": 6.9675256 } + ] + }, + { + "type": "way", + "ref": 271008232, + "role": "", + "geometry": [ + { "lat": 50.8451822, "lon": 6.9675256 }, + { "lat": 50.8433946, "lon": 6.9673373 } + ] + }, + { + "type": "way", + "ref": 271008239, + "role": "", + "geometry": [ + { "lat": 50.8433946, "lon": 6.9673373 }, + { "lat": 50.8424071, "lon": 6.9671724 }, + { "lat": 50.8411984, "lon": 6.9669289 }, + { "lat": 50.8391857, "lon": 6.9664246 } + ] + }, + { + "type": "way", + "ref": 29384564, + "role": "", + "geometry": [ + { "lat": 50.8518181, "lon": 6.9684403 }, + { "lat": 50.8522171, "lon": 6.9684787 } + ] + }, + { + "type": "way", + "ref": 31282638, + "role": "", + "geometry": [ + { "lat": 50.7547305, "lon": 7.0468957 }, + { "lat": 50.7550333, "lon": 7.0462257 } + ] + }, + { + "type": "way", + "ref": 31282787, + "role": "", + "geometry": [ + { "lat": 50.7548175, "lon": 7.0462659 }, + { "lat": 50.7545192, "lon": 7.0469416 } + ] + }, + { + "type": "way", + "ref": 383262762, + "role": "", + "geometry": [ + { "lat": 50.7545192, "lon": 7.0469416 }, + { "lat": 50.7522859, "lon": 7.0519784 }, + { "lat": 50.7519030, "lon": 7.0528750 } + ] + }, + { + "type": "way", + "ref": 31304443, + "role": "", + "geometry": [ + { "lat": 50.7519030, "lon": 7.0528750 }, + { "lat": 50.7514373, "lon": 7.0540731 }, + { "lat": 50.7512408, "lon": 7.0546346 }, + { "lat": 50.7511231, "lon": 7.0549962 }, + { "lat": 50.7508172, "lon": 7.0560135 } + ] + }, + { + "type": "way", + "ref": 128541594, + "role": "", + "geometry": [ + { "lat": 50.7508172, "lon": 7.0560135 }, + { "lat": 50.7504938, "lon": 7.0572440 } + ] + }, + { + "type": "way", + "ref": 31304503, + "role": "", + "geometry": [ + { "lat": 50.7509429, "lon": 7.0561605 }, + { "lat": 50.7512483, "lon": 7.0551357 }, + { "lat": 50.7513759, "lon": 7.0547500 }, + { "lat": 50.7515670, "lon": 7.0542197 }, + { "lat": 50.7520213, "lon": 7.0530348 }, + { "lat": 50.7524214, "lon": 7.0520935 }, + { "lat": 50.7547305, "lon": 7.0468957 } + ] + }, + { + "type": "way", + "ref": 31363881, + "role": "", + "geometry": [ + { "lat": 50.8026288, "lon": 6.9992932 }, + { "lat": 50.8018617, "lon": 7.0000625 }, + { "lat": 50.8010270, "lon": 7.0007950 }, + { "lat": 50.8001164, "lon": 7.0015291 }, + { "lat": 50.7928343, "lon": 7.0072406 }, + { "lat": 50.7832350, "lon": 7.0147268 }, + { "lat": 50.7826087, "lon": 7.0151803 } + ] + }, + { + "type": "way", + "ref": 31363891, + "role": "", + "geometry": [ + { "lat": 50.7826087, "lon": 7.0151803 }, + { "lat": 50.7823221, "lon": 7.0153822 } + ] + }, + { + "type": "way", + "ref": 31363892, + "role": "", + "geometry": [ + { "lat": 50.7823221, "lon": 7.0153822 }, + { "lat": 50.7802850, "lon": 7.0170023 }, + { "lat": 50.7782200, "lon": 7.0186241 } + ] + }, + { + "type": "way", + "ref": 31363898, + "role": "", + "geometry": [ + { "lat": 50.7826777, "lon": 7.0153975 }, + { "lat": 50.7833048, "lon": 7.0149295 }, + { "lat": 50.8001641, "lon": 7.0017836 }, + { "lat": 50.8010947, "lon": 7.0010142 }, + { "lat": 50.8019538, "lon": 7.0002540 }, + { "lat": 50.8026483, "lon": 6.9995590 } + ] + }, + { + "type": "way", + "ref": 31363910, + "role": "", + "geometry": [ + { "lat": 50.7823930, "lon": 7.0156008 }, + { "lat": 50.7826777, "lon": 7.0153975 } + ] + }, + { + "type": "way", + "ref": 31364152, + "role": "", + "geometry": [ + { "lat": 50.7782200, "lon": 7.0186241 }, + { "lat": 50.7779774, "lon": 7.0188037 } + ] + }, + { + "type": "way", + "ref": 31364158, + "role": "", + "geometry": [ + { "lat": 50.7783056, "lon": 7.0188240 }, + { "lat": 50.7788577, "lon": 7.0183860 }, + { "lat": 50.7803473, "lon": 7.0172040 }, + { "lat": 50.7816582, "lon": 7.0161766 }, + { "lat": 50.7823930, "lon": 7.0156008 } + ] + }, + { + "type": "way", + "ref": 31364178, + "role": "", + "geometry": [ + { "lat": 50.7780676, "lon": 7.0190054 }, + { "lat": 50.7783056, "lon": 7.0188240 } + ] + }, + { + "type": "way", + "ref": 31364384, + "role": "", + "geometry": [ + { "lat": 50.7749036, "lon": 7.0214625 }, + { "lat": 50.7780676, "lon": 7.0190054 } + ] + }, + { + "type": "way", + "ref": 31364387, + "role": "", + "geometry": [ + { "lat": 50.7744886, "lon": 7.0214841 }, + { "lat": 50.7712930, "lon": 7.0240315 }, + { "lat": 50.7695809, "lon": 7.0254447 }, + { "lat": 50.7686243, "lon": 7.0263151 } + ] + }, + { + "type": "way", + "ref": 31364484, + "role": "", + "geometry": [ + { "lat": 50.7748248, "lon": 7.0212347 }, + { "lat": 50.7744886, "lon": 7.0214841 } + ] + }, + { + "type": "way", + "ref": 31364512, + "role": "", + "geometry": [ + { "lat": 50.7745735, "lon": 7.0217089 }, + { "lat": 50.7749036, "lon": 7.0214625 } + ] + }, + { + "type": "way", + "ref": 31364656, + "role": "", + "geometry": [ + { "lat": 50.7686546, "lon": 7.0266216 }, + { "lat": 50.7696586, "lon": 7.0256891 }, + { "lat": 50.7713905, "lon": 7.0242565 }, + { "lat": 50.7745735, "lon": 7.0217089 } + ] + }, + { + "type": "way", + "ref": 31364667, + "role": "", + "geometry": [ + { "lat": 50.7686243, "lon": 7.0263151 }, + { "lat": 50.7676165, "lon": 7.0273126 }, + { "lat": 50.7665957, "lon": 7.0283332 }, + { "lat": 50.7653333, "lon": 7.0297134 } + ] + }, + { + "type": "way", + "ref": 271008234, + "role": "", + "geometry": [ + { "lat": 50.7653333, "lon": 7.0297134 }, + { "lat": 50.7643799, "lon": 7.0308081 } + ] + }, + { + "type": "way", + "ref": 31364888, + "role": "", + "geometry": [ + { "lat": 50.7635269, "lon": 7.0321873 }, + { "lat": 50.7641966, "lon": 7.0313729 } + ] + }, + { + "type": "way", + "ref": 122158730, + "role": "", + "geometry": [ + { "lat": 50.7641966, "lon": 7.0313729 }, + { "lat": 50.7644716, "lon": 7.0310241 } + ] + }, + { + "type": "way", + "ref": 31364985, + "role": "", + "geometry": [ + { "lat": 50.7644716, "lon": 7.0310241 }, + { "lat": 50.7648596, "lon": 7.0305814 } + ] + }, + { + "type": "way", + "ref": 271008235, + "role": "", + "geometry": [ + { "lat": 50.7648596, "lon": 7.0305814 }, + { "lat": 50.7657812, "lon": 7.0295145 }, + { "lat": 50.7666465, "lon": 7.0285903 } + ] + }, + { + "type": "way", + "ref": 271008231, + "role": "", + "geometry": [ + { "lat": 50.7666465, "lon": 7.0285903 }, + { "lat": 50.7679887, "lon": 7.0272481 } + ] + }, + { + "type": "way", + "ref": 271008233, + "role": "", + "geometry": [ + { "lat": 50.7679887, "lon": 7.0272481 }, + { "lat": 50.7686546, "lon": 7.0266216 } + ] + }, + { + "type": "way", + "ref": 31365377, + "role": "", + "geometry": [ + { "lat": 50.7643799, "lon": 7.0308081 }, + { "lat": 50.7640807, "lon": 7.0311662 } + ] + }, + { + "type": "way", + "ref": 31365425, + "role": "", + "geometry": [ + { "lat": 50.7640807, "lon": 7.0311662 }, + { "lat": 50.7638566, "lon": 7.0314272 } + ] + }, + { + "type": "way", + "ref": 271008236, + "role": "", + "geometry": [ + { "lat": 50.7638566, "lon": 7.0314272 }, + { "lat": 50.7628914, "lon": 7.0326760 }, + { "lat": 50.7621053, "lon": 7.0336961 } + ] + }, + { + "type": "way", + "ref": 36447898, + "role": "", + "geometry": [ + { "lat": 50.7621053, "lon": 7.0336961 }, + { "lat": 50.7613433, "lon": 7.0347526 } + ] + }, + { + "type": "way", + "ref": 271008228, + "role": "", + "geometry": [ + { "lat": 50.7613433, "lon": 7.0347526 }, + { "lat": 50.7608295, "lon": 7.0354890 } + ] + }, + { + "type": "way", + "ref": 31366812, + "role": "", + "geometry": [ + { "lat": 50.7588227, "lon": 7.0386254 }, + { "lat": 50.7583011, "lon": 7.0394929 }, + { "lat": 50.7576749, "lon": 7.0405773 }, + { "lat": 50.7569096, "lon": 7.0419812 }, + { "lat": 50.7558745, "lon": 7.0439976 }, + { "lat": 50.7548175, "lon": 7.0462659 } + ] + }, + { + "type": "way", + "ref": 31366880, + "role": "", + "geometry": [ + { "lat": 50.7550333, "lon": 7.0462257 }, + { "lat": 50.7559939, "lon": 7.0442408 }, + { "lat": 50.7570656, "lon": 7.0421620 }, + { "lat": 50.7578037, "lon": 7.0408023 }, + { "lat": 50.7584541, "lon": 7.0396561 }, + { "lat": 50.7589669, "lon": 7.0387984 } + ] + }, + { + "type": "way", + "ref": 31367017, + "role": "", + "geometry": [ + { "lat": 50.7609333, "lon": 7.0356976 }, + { "lat": 50.7619690, "lon": 7.0342371 }, + { "lat": 50.7630051, "lon": 7.0328461 }, + { "lat": 50.7635269, "lon": 7.0321873 } + ] + }, + { + "type": "way", + "ref": 31367443, + "role": "", + "geometry": [ + { "lat": 50.7607331, "lon": 7.0359794 }, + { "lat": 50.7609333, "lon": 7.0356976 } + ] + }, + { + "type": "way", + "ref": 31367449, + "role": "", + "geometry": [ + { "lat": 50.7589669, "lon": 7.0387984 }, + { "lat": 50.7602933, "lon": 7.0366481 }, + { "lat": 50.7607331, "lon": 7.0359794 } + ] + }, + { + "type": "way", + "ref": 31367526, + "role": "", + "geometry": [ + { "lat": 50.7606164, "lon": 7.0358121 }, + { "lat": 50.7601681, "lon": 7.0365126 }, + { "lat": 50.7588227, "lon": 7.0386254 } + ] + }, + { + "type": "way", + "ref": 31367534, + "role": "", + "geometry": [ + { "lat": 50.7608295, "lon": 7.0354890 }, + { "lat": 50.7606164, "lon": 7.0358121 } + ] + }, + { + "type": "way", + "ref": 31369852, + "role": "", + "geometry": [ + { "lat": 50.7779774, "lon": 7.0188037 }, + { "lat": 50.7748248, "lon": 7.0212347 } + ] + }, + { + "type": "way", + "ref": 449397558, + "role": "", + "geometry": [ + { "lat": 50.7479418, "lon": 7.0693723 }, + { "lat": 50.7494783, "lon": 7.0624630 } + ] + }, + { + "type": "way", + "ref": 31797389, + "role": "", + "geometry": [ + { "lat": 50.7494783, "lon": 7.0624630 }, + { "lat": 50.7502727, "lon": 7.0588905 }, + { "lat": 50.7506441, "lon": 7.0572942 }, + { "lat": 50.7509429, "lon": 7.0561605 } + ] + }, + { + "type": "way", + "ref": 31798039, + "role": "", + "geometry": [ + { "lat": 50.7504938, "lon": 7.0572440 }, + { "lat": 50.7501306, "lon": 7.0588140 } + ] + }, + { + "type": "way", + "ref": 235363212, + "role": "", + "geometry": [ + { "lat": 50.7501306, "lon": 7.0588140 }, + { "lat": 50.7492636, "lon": 7.0626737 }, + { "lat": 50.7489407, "lon": 7.0641605 } + ] + }, + { + "type": "way", + "ref": 156492546, + "role": "", + "geometry": [ + { "lat": 50.7489407, "lon": 7.0641605 }, + { "lat": 50.7488307, "lon": 7.0647205 }, + { "lat": 50.7483739, "lon": 7.0668216 } + ] + }, + { + "type": "way", + "ref": 156492545, + "role": "", + "geometry": [ + { "lat": 50.7483739, "lon": 7.0668216 }, + { "lat": 50.7483009, "lon": 7.0672440 }, + { "lat": 50.7478400, "lon": 7.0692844 } + ] + }, + { + "type": "way", + "ref": 130749935, + "role": "", + "geometry": [ + { "lat": 50.7478400, "lon": 7.0692844 }, + { "lat": 50.7477294, "lon": 7.0697394 }, + { "lat": 50.7476187, "lon": 7.0701855 }, + { "lat": 50.7474997, "lon": 7.0706232 }, + { "lat": 50.7473468, "lon": 7.0711189 }, + { "lat": 50.7472087, "lon": 7.0715434 }, + { "lat": 50.7470472, "lon": 7.0719838 }, + { "lat": 50.7469114, "lon": 7.0723163 }, + { "lat": 50.7467733, "lon": 7.0726489 }, + { "lat": 50.7465937, "lon": 7.0730580 }, + { "lat": 50.7464112, "lon": 7.0734310 } + ] + }, + { + "type": "way", + "ref": 32472877, + "role": "", + "geometry": [ + { "lat": 50.8246828, "lon": 6.9651077 }, + { "lat": 50.8253375, "lon": 6.9647718 }, + { "lat": 50.8260000, "lon": 6.9645354 }, + { "lat": 50.8266134, "lon": 6.9643649 }, + { "lat": 50.8272671, "lon": 6.9642646 }, + { "lat": 50.8278017, "lon": 6.9642349 } + ] + }, + { + "type": "way", + "ref": 31798988, + "role": "", + "geometry": [ + { "lat": 50.8278017, "lon": 6.9642349 }, + { "lat": 50.8284805, "lon": 6.9642342 }, + { "lat": 50.8294617, "lon": 6.9643395 }, + { "lat": 50.8302437, "lon": 6.9644810 }, + { "lat": 50.8309474, "lon": 6.9646345 } + ] + }, + { + "type": "way", + "ref": 31798989, + "role": "", + "geometry": [ + { "lat": 50.8590359, "lon": 6.9691023 }, + { "lat": 50.8634113, "lon": 6.9695191 } + ] + }, + { + "type": "way", + "ref": 235820560, + "role": "", + "geometry": [ + { "lat": 50.8634113, "lon": 6.9695191 }, + { "lat": 50.8656224, "lon": 6.9697185 } + ] + }, + { + "type": "way", + "ref": 235820563, + "role": "", + "geometry": [ + { "lat": 50.8656224, "lon": 6.9697185 }, + { "lat": 50.8679633, "lon": 6.9699314 } + ] + }, + { + "type": "way", + "ref": 235820564, + "role": "", + "geometry": [ + { "lat": 50.8679633, "lon": 6.9699314 }, + { "lat": 50.8691580, "lon": 6.9700171 }, + { "lat": 50.8699302, "lon": 6.9700221 } + ] + }, + { + "type": "way", + "ref": 235820570, + "role": "", + "geometry": [ + { "lat": 50.8699302, "lon": 6.9700221 }, + { "lat": 50.8717399, "lon": 6.9699121 }, + { "lat": 50.8746263, "lon": 6.9695939 } + ] + }, + { + "type": "way", + "ref": 32472855, + "role": "", + "geometry": [ + { "lat": 50.8246253, "lon": 6.9648384 }, + { "lat": 50.8242516, "lon": 6.9650453 } + ] + }, + { + "type": "way", + "ref": 32472856, + "role": "", + "geometry": [ + { "lat": 50.8242516, "lon": 6.9650453 }, + { "lat": 50.8237235, "lon": 6.9653841 }, + { "lat": 50.8232034, "lon": 6.9657948 }, + { "lat": 50.8224317, "lon": 6.9665263 }, + { "lat": 50.8216642, "lon": 6.9673886 }, + { "lat": 50.8209037, "lon": 6.9684049 }, + { "lat": 50.8201541, "lon": 6.9695500 }, + { "lat": 50.8192181, "lon": 6.9711445 }, + { "lat": 50.8138575, "lon": 6.9806731 } + ] + }, + { + "type": "way", + "ref": 37881520, + "role": "", + "geometry": [ + { "lat": 50.8138575, "lon": 6.9806731 }, + { "lat": 50.8135770, "lon": 6.9811721 } + ] + }, + { + "type": "way", + "ref": 37881519, + "role": "", + "geometry": [ + { "lat": 50.8135770, "lon": 6.9811721 }, + { "lat": 50.8113547, "lon": 6.9851361 } + ] + }, + { + "type": "way", + "ref": 234434902, + "role": "", + "geometry": [ + { "lat": 50.8113547, "lon": 6.9851361 }, + { "lat": 50.8105743, "lon": 6.9865001 } + ] + }, + { + "type": "way", + "ref": 32472875, + "role": "", + "geometry": [ + { "lat": 50.8243279, "lon": 6.9653077 }, + { "lat": 50.8246828, "lon": 6.9651077 } + ] + }, + { + "type": "way", + "ref": 32473071, + "role": "", + "geometry": [ + { "lat": 50.8309464, "lon": 6.9643368 }, + { "lat": 50.8302815, "lon": 6.9641912 } + ] + }, + { + "type": "way", + "ref": 128522486, + "role": "", + "geometry": [ + { "lat": 50.8302815, "lon": 6.9641912 }, + { "lat": 50.8294728, "lon": 6.9640448 }, + { "lat": 50.8284964, "lon": 6.9639463 }, + { "lat": 50.8277970, "lon": 6.9639432 } + ] + }, + { + "type": "way", + "ref": 36447896, + "role": "", + "geometry": [ + { "lat": 50.8277970, "lon": 6.9639432 }, + { "lat": 50.8272631, "lon": 6.9639682 }, + { "lat": 50.8265661, "lon": 6.9640827 }, + { "lat": 50.8259717, "lon": 6.9642405 }, + { "lat": 50.8252714, "lon": 6.9645096 }, + { "lat": 50.8246253, "lon": 6.9648384 } + ] + }, + { + "type": "way", + "ref": 32473075, + "role": "", + "geometry": [ + { "lat": 50.8314332, "lon": 6.9644546 }, + { "lat": 50.8309464, "lon": 6.9643368 } + ] + }, + { + "type": "way", + "ref": 32473086, + "role": "", + "geometry": [ + { "lat": 50.8309474, "lon": 6.9646345 }, + { "lat": 50.8314534, "lon": 6.9647679 } + ] + }, + { + "type": "way", + "ref": 32473087, + "role": "", + "geometry": [ + { "lat": 50.8314534, "lon": 6.9647679 }, + { "lat": 50.8386440, "lon": 6.9665955 } + ] + }, + { + "type": "way", + "ref": 40033064, + "role": "", + "geometry": [ + { "lat": 50.8386440, "lon": 6.9665955 }, + { "lat": 50.8391695, "lon": 6.9667285 } + ] + }, + { + "type": "way", + "ref": 189189059, + "role": "", + "geometry": [ + { "lat": 50.8746263, "lon": 6.9695939 }, + { "lat": 50.8760907, "lon": 6.9694358 } + ] + }, + { + "type": "way", + "ref": 271008225, + "role": "", + "geometry": [ + { "lat": 50.8760907, "lon": 6.9694358 }, + { "lat": 50.8775484, "lon": 6.9692784 } + ] + }, + { + "type": "way", + "ref": 41550921, + "role": "", + "geometry": [ + { "lat": 50.8775484, "lon": 6.9692784 }, + { "lat": 50.8797318, "lon": 6.9690108 } + ] + } + ], + "tags": { + "TMC:cid_58:tabcd_1:Class": "Road", + "TMC:cid_58:tabcd_1:LCLversion": "8.00", + "TMC:cid_58:tabcd_1:LocationCode": "7142", + "name": "Bundesautobahn 555", + "network": "BAB", + "operator": "Bundesrepublik Deutschland", + "ref": "A 555", + "route": "road", + "type": "route", + "wikipedia": "de:Bundesautobahn 555" + } +} + + ] +} diff --git a/tests/test_json.py b/tests/test_json.py index 676bd2b..60a1a0a 100644 --- a/tests/test_json.py +++ b/tests/test_json.py @@ -36,6 +36,11 @@ def test_relation03(self): result = api.parse_json(read_file("json/relation-03.json")) self._test_relation03(result) + def test_relation04(self): + api = overpy.Overpass() + result = api.parse_json(read_file("json/relation-04.json")) + self._test_relation04(result) + class TestWay(BaseTestWay): def test_way01(self): diff --git a/tests/test_xml.py b/tests/test_xml.py index 3823c6a..c25e836 100644 --- a/tests/test_xml.py +++ b/tests/test_xml.py @@ -56,6 +56,15 @@ def test_relation03(self): result = api.parse_xml(read_file("xml/relation-03.xml"), parser=overpy.XML_PARSER_SAX) self._test_relation03(result) + def test_relation04(self): + api = overpy.Overpass() + # DOM + result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XML_PARSER_DOM) + self._test_relation04(result) + # SAX + result = api.parse_xml(read_file("xml/relation-04.xml"), parser=overpy.XML_PARSER_SAX) + self._test_relation04(result) + class TestWay(BaseTestWay): def test_way01(self): diff --git a/tests/xml/relation-04.xml b/tests/xml/relation-04.xml new file mode 100644 index 0000000..d6dbe8c --- /dev/null +++ b/tests/xml/relation-04.xml @@ -0,0 +1,697 @@ + + +The data included in this document is from www.openstreetmap.org. The data is made available under ODbL. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +