mirror of
https://github.com/enzet/map-machine.git
synced 2025-06-06 04:41:54 +02:00
Issue #39: support flipping icons horizontally.
If tags has "direction" key, direction is mostly to the left (to the West), and shape for the icon is right directed, we flip the shape horizontally.
This commit is contained in:
parent
2f957e880b
commit
1b40087b18
2 changed files with 15 additions and 4 deletions
|
@ -39,6 +39,7 @@ class Shape:
|
|||
offset: np.array # vector that should be used to shift the path
|
||||
id_: str # shape identifier
|
||||
name: Optional[str] = None # icon description
|
||||
is_right_directed: bool = False
|
||||
|
||||
def is_default(self) -> bool:
|
||||
"""
|
||||
|
@ -98,6 +99,7 @@ class ShapeExtractor:
|
|||
:param svg_file_name: input SVG file name with icons. File may contain
|
||||
any other irrelevant graphics.
|
||||
"""
|
||||
self.configuration = ShapeConfiguration(configuration_file_name)
|
||||
self.shapes: Dict[str, Shape] = {}
|
||||
|
||||
with open(svg_file_name) as input_file:
|
||||
|
@ -109,8 +111,6 @@ class ShapeExtractor:
|
|||
if isinstance(node, Element):
|
||||
self.parse(node)
|
||||
|
||||
self.configuration = ShapeConfiguration(configuration_file_name)
|
||||
|
||||
def parse(self, node: Element) -> None:
|
||||
"""
|
||||
Extract icon paths into a map.
|
||||
|
@ -154,7 +154,10 @@ class ShapeExtractor:
|
|||
name = child_node.childNodes[0].nodeValue
|
||||
break
|
||||
|
||||
self.shapes[id_] = Shape(path, point, id_, name)
|
||||
is_right_directed: bool = (
|
||||
id_ in self.configuration.right_directed
|
||||
)
|
||||
self.shapes[id_] = Shape(path, point, id_, name, is_right_directed)
|
||||
else:
|
||||
error(f"not standard ID {id_}")
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ from typing import Any, Dict, List, Optional, Set, Tuple, Union
|
|||
import yaml
|
||||
from colour import Color
|
||||
|
||||
from roentgen.direction import DirectionSet
|
||||
from roentgen.icon import (
|
||||
DEFAULT_COLOR, DEFAULT_SHAPE_ID, Icon, IconSet, ShapeExtractor,
|
||||
ShapeSpecification
|
||||
|
@ -184,6 +185,7 @@ class Scheme:
|
|||
:param icon_extractor: extractor with icon specifications
|
||||
:param tags: OpenStreetMap element tags dictionary
|
||||
:param for_: target (node, way, area or relation)
|
||||
:return (icon set, icon priority)
|
||||
"""
|
||||
tags_hash: str = (
|
||||
",".join(tags.keys()) + ":" + ",".join(map(str, tags.values()))
|
||||
|
@ -191,7 +193,7 @@ class Scheme:
|
|||
if tags_hash in self.cache:
|
||||
return self.cache[tags_hash]
|
||||
|
||||
main_icon: Icon = None
|
||||
main_icon: Optional[Icon] = None
|
||||
extra_icons: List[Icon] = []
|
||||
processed: Set[str] = set()
|
||||
priority: int = 0
|
||||
|
@ -264,6 +266,12 @@ class Scheme:
|
|||
returned: IconSet = IconSet(main_icon, extra_icons, processed)
|
||||
self.cache[tags_hash] = returned, priority
|
||||
|
||||
if "direction" in tags:
|
||||
if DirectionSet(tags["direction"]).is_right() is False:
|
||||
for specification in main_icon.shape_specifications:
|
||||
if specification.shape.is_right_directed:
|
||||
specification.flip_horizontally = True
|
||||
|
||||
return returned, priority
|
||||
|
||||
def get_style(self, tags: Dict[str, Any], scale):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue