Add documentation.

This commit is contained in:
Sergey Vartanov 2021-06-06 02:54:20 +03:00
parent 6a9af15b05
commit 20b2ec1871
3 changed files with 45 additions and 34 deletions

View file

@ -170,20 +170,20 @@ class Constructor:
Construct Röntgen ways. Construct Röntgen ways.
""" """
way_number: int = 0 way_number: int = 0
for way_id in self.map_.way_map: # type: int for way_id in self.map_.ways: # type: int
ui.progress_bar( ui.progress_bar(
way_number, way_number,
len(self.map_.way_map), len(self.map_.ways),
step=10, step=10,
text="Constructing ways", text="Constructing ways",
) )
way_number += 1 way_number += 1
way: OSMWay = self.map_.way_map[way_id] way: OSMWay = self.map_.ways[way_id]
if not self.check_level(way.tags): if not self.check_level(way.tags):
continue continue
self.construct_line(way, [], [way.nodes]) self.construct_line(way, [], [way.nodes])
ui.progress_bar(-1, len(self.map_.way_map), text="Constructing ways") ui.progress_bar(-1, len(self.map_.ways), text="Constructing ways")
def construct_line( def construct_line(
self, self,
@ -294,8 +294,8 @@ class Constructor:
""" """
Construct Röntgen ways from OSM relations. Construct Röntgen ways from OSM relations.
""" """
for relation_id in self.map_.relation_map: for relation_id in self.map_.relations:
relation: OSMRelation = self.map_.relation_map[relation_id] relation: OSMRelation = self.map_.relations[relation_id]
tags = relation.tags tags = relation.tags
if not self.check_level(tags): if not self.check_level(tags):
continue continue
@ -306,11 +306,11 @@ class Constructor:
for member in relation.members: # type: OSMMember for member in relation.members: # type: OSMMember
if member.type_ == "way": if member.type_ == "way":
if member.role == "inner": if member.role == "inner":
if member.ref in self.map_.way_map: if member.ref in self.map_.ways:
inner_ways.append(self.map_.way_map[member.ref]) inner_ways.append(self.map_.ways[member.ref])
elif member.role == "outer": elif member.role == "outer":
if member.ref in self.map_.way_map: if member.ref in self.map_.ways:
outer_ways.append(self.map_.way_map[member.ref]) outer_ways.append(self.map_.ways[member.ref])
else: else:
print(f'Unknown member role "{member.role}".') print(f'Unknown member role "{member.role}".')
if outer_ways: if outer_ways:
@ -325,8 +325,8 @@ class Constructor:
node_number: int = 0 node_number: int = 0
sorted_node_ids: Iterator[int] = sorted( sorted_node_ids: Iterator[int] = sorted(
self.map_.node_map.keys(), self.map_.nodes.keys(),
key=lambda x: -self.map_.node_map[x].coordinates[0], key=lambda x: -self.map_.nodes[x].coordinates[0],
) )
missing_tags = Counter() missing_tags = Counter()
@ -334,9 +334,9 @@ class Constructor:
for node_id in sorted_node_ids: # type: int for node_id in sorted_node_ids: # type: int
node_number += 1 node_number += 1
ui.progress_bar( ui.progress_bar(
node_number, len(self.map_.node_map), text="Constructing nodes" node_number, len(self.map_.nodes), text="Constructing nodes"
) )
node: OSMNode = self.map_.node_map[node_id] node: OSMNode = self.map_.nodes[node_id]
flung = self.flinger.fling(node.coordinates) flung = self.flinger.fling(node.coordinates)
tags = node.tags tags = node.tags
@ -379,4 +379,4 @@ class Constructor:
if key not in icon_set.processed if key not in icon_set.processed
) )
ui.progress_bar(-1, len(self.map_.node_map), text="Constructing nodes") ui.progress_bar(-1, len(self.map_.nodes), text="Constructing nodes")

View file

@ -59,6 +59,9 @@ class OSMNode(Tagged):
@classmethod @classmethod
def from_xml_structure(cls, element, is_full: bool = False) -> "OSMNode": def from_xml_structure(cls, element, is_full: bool = False) -> "OSMNode":
"""
Parse node from OSM XML `<node>` element.
"""
node = cls() node = cls()
attributes = element.attrib attributes = element.attrib
node.id_ = int(attributes["id"]) node.id_ = int(attributes["id"])
@ -114,6 +117,9 @@ class OSMWay(Tagged):
@classmethod @classmethod
def from_xml_structure(cls, element, nodes, is_full: bool) -> "OSMWay": def from_xml_structure(cls, element, nodes, is_full: bool) -> "OSMWay":
"""
Parse way from OSM XML `<way>` element.
"""
way = cls(int(element.attrib["id"])) way = cls(int(element.attrib["id"]))
if is_full: if is_full:
way.visible = element.attrib["visible"] way.visible = element.attrib["visible"]
@ -188,6 +194,9 @@ class OSMRelation(Tagged):
@classmethod @classmethod
def from_xml_structure(cls, element, is_full: bool) -> "OSMRelation": def from_xml_structure(cls, element, is_full: bool) -> "OSMRelation":
"""
Parse relation from OSM XML `<relation>` element.
"""
attributes = element.attrib attributes = element.attrib
relation = cls(int(attributes["id"])) relation = cls(int(attributes["id"]))
if is_full: if is_full:
@ -245,39 +254,39 @@ class Map:
""" """
def __init__(self): def __init__(self):
self.node_map: Dict[int, OSMNode] = {} self.nodes: Dict[int, OSMNode] = {}
self.way_map: Dict[int, OSMWay] = {} self.ways: Dict[int, OSMWay] = {}
self.relation_map: Dict[int, OSMRelation] = {} self.relations: Dict[int, OSMRelation] = {}
self.authors: Set[str] = set() self.authors: Set[str] = set()
self.time: MinMax = MinMax() self.time: MinMax = MinMax()
self.boundary_box: List[MinMax] = [MinMax(), MinMax()] self.boundary_box: List[MinMax] = [MinMax(), MinMax()]
def add_node(self, node: OSMNode): def add_node(self, node: OSMNode) -> None:
""" """
Add node and update map parameters. Add node and update map parameters.
""" """
self.node_map[node.id_] = node self.nodes[node.id_] = node
if node.user: if node.user:
self.authors.add(node.user) self.authors.add(node.user)
self.time.update(node.timestamp) self.time.update(node.timestamp)
self.boundary_box[0].update(node.coordinates[0]) self.boundary_box[0].update(node.coordinates[0])
self.boundary_box[1].update(node.coordinates[1]) self.boundary_box[1].update(node.coordinates[1])
def add_way(self, way: OSMWay): def add_way(self, way: OSMWay) -> None:
""" """
Add way and update map parameters. Add way and update map parameters.
""" """
self.way_map[way.id_] = way self.ways[way.id_] = way
if way.user: if way.user:
self.authors.add(way.user) self.authors.add(way.user)
self.time.update(way.timestamp) self.time.update(way.timestamp)
def add_relation(self, relation: OSMRelation): def add_relation(self, relation: OSMRelation) -> None:
""" """
Add relation and update map parameters. Add relation and update map parameters.
""" """
self.relation_map[relation.id_] = relation self.relations[relation.id_] = relation
class OverpassReader: class OverpassReader:
@ -321,6 +330,8 @@ class OverpassReader:
class OSMReader: class OSMReader:
""" """
OpenStreetMap XML file parser. OpenStreetMap XML file parser.
See https://wiki.openstreetmap.org/wiki/OSM_XML
""" """
def __init__( def __init__(
@ -375,7 +386,7 @@ class OSMReader:
if element.tag == "way" and self.parse_ways: if element.tag == "way" and self.parse_ways:
self.map_.add_way( self.map_.add_way(
OSMWay.from_xml_structure( OSMWay.from_xml_structure(
element, self.map_.node_map, self.is_full element, self.map_.nodes, self.is_full
) )
) )
if element.tag == "relation" and self.parse_relations: if element.tag == "relation" and self.parse_relations:

View file

@ -19,8 +19,8 @@ def test_node() -> None:
<node id="42" lon="5" lat="10" /> <node id="42" lon="5" lat="10" />
</osm>""" </osm>"""
) )
assert 42 in map_.node_map assert 42 in map_.nodes
node: OSMNode = map_.node_map[42] node: OSMNode = map_.nodes[42]
assert node.id_ == 42 assert node.id_ == 42
assert np.allclose(node.coordinates, np.array([10, 5])) assert np.allclose(node.coordinates, np.array([10, 5]))
@ -38,8 +38,8 @@ def test_node_with_tag() -> None:
</node> </node>
</osm>""" </osm>"""
) )
assert 42 in map_.node_map assert 42 in map_.nodes
node: OSMNode = map_.node_map[42] node: OSMNode = map_.nodes[42]
assert node.id_ == 42 assert node.id_ == 42
assert np.allclose(node.coordinates, np.array([10, 5])) assert np.allclose(node.coordinates, np.array([10, 5]))
assert node.tags["key"] == "value" assert node.tags["key"] == "value"
@ -56,8 +56,8 @@ def test_way() -> None:
<way id="42" /> <way id="42" />
</osm>""" </osm>"""
) )
assert 42 in map_.way_map assert 42 in map_.ways
way: OSMWay = map_.way_map[42] way: OSMWay = map_.ways[42]
assert way.id_ == 42 assert way.id_ == 42
@ -76,7 +76,7 @@ def test_nodes() -> None:
</way> </way>
</osm>""" </osm>"""
) )
way: OSMWay = map_.way_map[2] way: OSMWay = map_.ways[2]
assert len(way.nodes) == 1 assert len(way.nodes) == 1
assert way.nodes[0].id_ == 1 assert way.nodes[0].id_ == 1
assert way.tags["key"] == "value" assert way.tags["key"] == "value"
@ -100,8 +100,8 @@ def test_relation() -> None:
</relation> </relation>
</osm>""" </osm>"""
) )
assert 3 in map_.relation_map assert 3 in map_.relations
relation: OSMRelation = map_.relation_map[3] relation: OSMRelation = map_.relations[3]
assert relation.id_ == 3 assert relation.id_ == 3
assert relation.tags["key"] == "value" assert relation.tags["key"] == "value"
assert len(relation.members) == 1 assert len(relation.members) == 1