mirror of
https://github.com/enzet/map-machine.git
synced 2025-06-24 13:37:11 +02:00
Issue #45: add road drawing to mapper.
This commit is contained in:
parent
73f2c467be
commit
c712949c29
1 changed files with 40 additions and 9 deletions
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Simple OpenStreetMap renderer.
|
Simple OpenStreetMap renderer.
|
||||||
"""
|
"""
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict, Set, Iterator
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import svgwrite
|
import svgwrite
|
||||||
|
@ -13,11 +13,12 @@ from svgwrite.shapes import Rect
|
||||||
from roentgen import ui
|
from roentgen import ui
|
||||||
from roentgen.constructor import Constructor
|
from roentgen.constructor import Constructor
|
||||||
from roentgen.direction import DirectionSet, Sector
|
from roentgen.direction import DirectionSet, Sector
|
||||||
from roentgen.figure import Building, Road, Segment
|
from roentgen.figure import Road
|
||||||
from roentgen.flinger import Flinger
|
from roentgen.flinger import Flinger
|
||||||
from roentgen.icon import ShapeExtractor
|
from roentgen.icon import ShapeExtractor
|
||||||
from roentgen.osm_reader import Map
|
from roentgen.osm_reader import Map, OSMNode
|
||||||
from roentgen.point import Occupied, Point
|
from roentgen.point import Occupied, Point
|
||||||
|
from roentgen.road import RoadPart, Intersection
|
||||||
from roentgen.scheme import Scheme
|
from roentgen.scheme import Scheme
|
||||||
|
|
||||||
__author__ = "Sergey Vartanov"
|
__author__ = "Sergey Vartanov"
|
||||||
|
@ -81,7 +82,7 @@ class Painter:
|
||||||
self.svg.add(path)
|
self.svg.add(path)
|
||||||
ui.progress_bar(-1, 0, text="Drawing ways")
|
ui.progress_bar(-1, 0, text="Drawing ways")
|
||||||
|
|
||||||
roads = sorted(
|
roads: Iterator[Road] = sorted(
|
||||||
constructor.roads, key=lambda x: x.matcher.priority
|
constructor.roads, key=lambda x: x.matcher.priority
|
||||||
)
|
)
|
||||||
for road in roads:
|
for road in roads:
|
||||||
|
@ -142,12 +143,12 @@ class Painter:
|
||||||
ui.progress_bar(
|
ui.progress_bar(
|
||||||
index, level_count, step=1, text="Drawing buildings")
|
index, level_count, step=1, text="Drawing buildings")
|
||||||
fill: Color()
|
fill: Color()
|
||||||
for way in constructor.buildings: # type: Building
|
for way in constructor.buildings:
|
||||||
if way.get_levels() < level:
|
if way.get_levels() < level:
|
||||||
continue
|
continue
|
||||||
shift_1 = [0, -previous_level * level_height]
|
shift_1 = [0, -previous_level * level_height]
|
||||||
shift_2 = [0, -level * level_height]
|
shift_2 = [0, -level * level_height]
|
||||||
for segment in way.parts: # type: Segment
|
for segment in way.parts:
|
||||||
if level == 0.5:
|
if level == 0.5:
|
||||||
fill = Color("#AAAAAA")
|
fill = Color("#AAAAAA")
|
||||||
elif level == 1:
|
elif level == 1:
|
||||||
|
@ -167,7 +168,7 @@ class Painter:
|
||||||
|
|
||||||
# Draw building roofs.
|
# Draw building roofs.
|
||||||
|
|
||||||
for way in constructor.buildings: # type: Building
|
for way in constructor.buildings:
|
||||||
if way.get_levels() == level:
|
if way.get_levels() == level:
|
||||||
shift = np.array([0, -way.get_levels() * level_height])
|
shift = np.array([0, -way.get_levels() * level_height])
|
||||||
path_commands: str = way.get_path(self.flinger, shift)
|
path_commands: str = way.get_path(self.flinger, shift)
|
||||||
|
@ -289,15 +290,45 @@ class Painter:
|
||||||
scale = self.flinger.get_scale(road.outers[0][0].coordinates)
|
scale = self.flinger.get_scale(road.outers[0][0].coordinates)
|
||||||
path_commands: str = road.get_path(self.flinger)
|
path_commands: str = road.get_path(self.flinger)
|
||||||
path = Path(d=path_commands)
|
path = Path(d=path_commands)
|
||||||
path.update({
|
style: Dict[str, Any] = {
|
||||||
"fill": "none",
|
"fill": "none",
|
||||||
"stroke": color.hex,
|
"stroke": color.hex,
|
||||||
"stroke-linecap": "round",
|
"stroke-linecap": "round",
|
||||||
"stroke-linejoin": "round",
|
"stroke-linejoin": "round",
|
||||||
"stroke-width": scale * width + extra_width
|
"stroke-width": scale * width + extra_width
|
||||||
})
|
}
|
||||||
|
path.update(style)
|
||||||
self.svg.add(path)
|
self.svg.add(path)
|
||||||
|
|
||||||
|
def draw_roads(self, roads: Iterator[Road]) -> None:
|
||||||
|
nodes: Dict[OSMNode, Set[RoadPart]] = {}
|
||||||
|
|
||||||
|
for road in roads:
|
||||||
|
for index in range(len(road.outers[0]) - 1):
|
||||||
|
node_1: OSMNode = road.outers[0][index]
|
||||||
|
node_2: OSMNode = road.outers[0][index + 1]
|
||||||
|
point_1: np.array = self.flinger.fling(node_1.coordinates)
|
||||||
|
point_2: np.array = self.flinger.fling(node_2.coordinates)
|
||||||
|
scale: float = self.flinger.get_scale(node_1.coordinates)
|
||||||
|
part_1: RoadPart = RoadPart(point_1, point_2, road.lanes, scale)
|
||||||
|
part_2: RoadPart = RoadPart(point_2, point_1, road.lanes, scale)
|
||||||
|
# part_1.draw_normal(self.svg)
|
||||||
|
|
||||||
|
for node in node_1, node_2:
|
||||||
|
if node not in nodes:
|
||||||
|
nodes[node] = set()
|
||||||
|
|
||||||
|
nodes[node_1].add(part_1)
|
||||||
|
nodes[node_2].add(part_2)
|
||||||
|
|
||||||
|
for node in nodes:
|
||||||
|
parts = nodes[node]
|
||||||
|
if len(parts) < 4:
|
||||||
|
continue
|
||||||
|
scale: float = self.flinger.get_scale(node.coordinates)
|
||||||
|
intersection: Intersection = Intersection(list(parts))
|
||||||
|
intersection.draw(self.svg, scale, True)
|
||||||
|
|
||||||
|
|
||||||
def check_level_number(tags: Dict[str, Any], level: float):
|
def check_level_number(tags: Dict[str, Any], level: float):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue