Skip to content

Commit

Permalink
src - add RelationRelations
Browse files Browse the repository at this point in the history
  • Loading branch information
dbuse authored and phibos committed May 7, 2015
1 parent 3723643 commit ac7df97
Showing 1 changed file with 45 additions and 25 deletions.
70 changes: 45 additions & 25 deletions overpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ def is_valid_type(element, cls):


class Overpass(object):

"""
Class to access the Overpass API
"""
Expand Down Expand Up @@ -151,9 +152,11 @@ def parse_xml(self, data, encoding="utf-8"):


class Result(object):

"""
Class to handle the result.
"""

def __init__(self, elements=None, api=None):
"""
Expand All @@ -165,7 +168,8 @@ def __init__(self, elements=None, api=None):
elements = []
self._nodes = OrderedDict((element.id, element) for element in elements if is_valid_type(element, Node))
self._ways = OrderedDict((element.id, element) for element in elements if is_valid_type(element, Way))
self._relations = OrderedDict((element.id, element) for element in elements if is_valid_type(element, Relation))
self._relations = OrderedDict((element.id, element)
for element in elements if is_valid_type(element, Relation))
self._class_collection_map = {Node: self._nodes, Way: self._ways, Relation: self._relations}
self.api = api

Expand Down Expand Up @@ -295,10 +299,10 @@ def get_node(self, node_id, resolve_missing=False):
raise exception.DataIncomplete("Resolve missing nodes is disabled")

query = ("\n"
"[out:json];\n"
"node({node_id});\n"
"out body;\n"
)
"[out:json];\n"
"node({node_id});\n"
"out body;\n"
)
query = query.format(
node_id=node_id
)
Expand Down Expand Up @@ -340,10 +344,10 @@ def get_relation(self, rel_id, resolve_missing=False):
raise exception.DataIncomplete("Resolve missing relations is disabled")

query = ("\n"
"[out:json];\n"
"relation({relation_id});\n"
"out body;\n"
)
"[out:json];\n"
"relation({relation_id});\n"
"out body;\n"
)
query = query.format(
relation_id=rel_id
)
Expand Down Expand Up @@ -385,10 +389,10 @@ def get_way(self, way_id, resolve_missing=False):
raise exception.DataIncomplete("Resolve missing way is disabled")

query = ("\n"
"[out:json];\n"
"way({way_id});\n"
"out body;\n"
)
"[out:json];\n"
"way({way_id});\n"
"out body;\n"
)
query = query.format(
way_id=way_id
)
Expand Down Expand Up @@ -421,6 +425,7 @@ def get_ways(self, way_id=None, **kwargs):


class Element(object):

"""
Base element
"""
Expand All @@ -440,6 +445,7 @@ def __init__(self, attributes=None, result=None, tags=None):


class Node(Element):

"""
Class to represent an element of type node
"""
Expand All @@ -461,7 +467,7 @@ def __init__(self, node_id=None, lat=None, lon=None, **kwargs):
self.id = node_id
self.lat = lat
self.lon = lon

def __repr__(self):
return "<overpy.Node id={} lat={} lon={}>".format(self.id, self.lat, self.lon)

Expand Down Expand Up @@ -550,6 +556,7 @@ def from_xml(cls, child, result=None):


class Way(Element):

"""
Class to represent an element of type way
"""
Expand All @@ -572,7 +579,7 @@ def __init__(self, way_id=None, node_ids=None, **kwargs):

#: List of Ids of the associated nodes
self._node_ids = node_ids

def __repr__(self):
return "<overpy.Way id={} nodes={}>".format(self.id, self._node_ids)

Expand Down Expand Up @@ -615,11 +622,11 @@ def get_nodes(self, resolve_missing=False):
raise exception.DataIncomplete("Unable to resolve all nodes")

query = ("\n"
"[out:json];\n"
"way({way_id});\n"
"node(w);\n"
"out body;\n"
)
"[out:json];\n"
"way({way_id});\n"
"node(w);\n"
"out body;\n"
)
query = query.format(
way_id=self.id
)
Expand Down Expand Up @@ -725,6 +732,7 @@ def from_xml(cls, child, result=None):


class Relation(Element):

"""
Class to represent an element of type relation
"""
Expand All @@ -743,7 +751,7 @@ def __init__(self, rel_id=None, members=None, **kwargs):
Element.__init__(self, **kwargs)
self.id = rel_id
self.members = members

def __repr__(self):
return "<overpy.Relation id={}>".format(self.id)

Expand Down Expand Up @@ -772,7 +780,7 @@ def from_json(cls, data, result=None):

members = []

supported_members = [RelationNode, RelationWay]
supported_members = [RelationNode, RelationWay, RelationRelation]
for member in data.get("members", []):
type_value = member.get("type")
for member_cls in supported_members:
Expand Down Expand Up @@ -816,7 +824,7 @@ def from_xml(cls, child, result=None):
tags = {}
members = []

supported_members = [RelationNode, RelationWay]
supported_members = [RelationNode, RelationWay, RelationRelation]
for sub_child in child:
if sub_child.tag.lower() == "tag":
name = sub_child.attrib.get("k")
Expand Down Expand Up @@ -850,9 +858,11 @@ def from_xml(cls, child, result=None):


class RelationMember(object):

"""
Base class to represent a member of a relation.
"""

def __init__(self, ref=None, role=None, result=None):
"""
:param ref: Reference Id
Expand Down Expand Up @@ -919,7 +929,7 @@ class RelationNode(RelationMember):

def resolve(self, resolve_missing=False):
return self._result.get_node(self.ref, resolve_missing=resolve_missing)

def __repr__(self):
return "<overpy.RelationNode ref={} role={}>".format(self.ref, self.role)

Expand All @@ -929,6 +939,16 @@ class RelationWay(RelationMember):

def resolve(self, resolve_missing=False):
return self._result.get_way(self.ref, resolve_missing=resolve_missing)

def __repr__(self):
return "<overpy.RelationWay ref={} role={}>".format(self.ref, self.role)


class RelationRelation(RelationMember):
_type_value = "relation"

def resolve(self, resolve_missing=False):
return self._result.get_relation(self.ref, resolve_missing=resolve_missing)

def __repr__(self):
return "<overpy.RelationRelation ref={} role={}>".format(self.ref, self.role)

0 comments on commit ac7df97

Please sign in to comment.