Issue #63: add options for MapCSS generation.

This commit is contained in:
Sergey Vartanov 2021-08-15 09:55:46 +03:00
parent e5671fcf8f
commit 87facc7299
6 changed files with 114 additions and 65 deletions

View file

@ -1,42 +0,0 @@
/*
Map paint style that adds icons from Röntgen icon set
*/
meta {
title: "Röntgen icons";
description: "Icons from Röntgen icon set for JOSM";
author: "Sergey Vartanov";
version: "0.1";
link: "https://github.com/enzet/Roentgen";
}
canvas {
fill-color: #FFFFFF;
}
way {
fill-opacity: 1;
text-color: black;
text-offset-y: -11;
}
relation {
fill-opacity: 1;
text-color: black;
text-offset-y: -11;
}
node {
symbol-shape: circle;
symbol-size: 1;
text: auto;
text-color: black;
text-offset-y: -11;
text-anchor-horizontal: center;
font-size: 11;
}
way[building] {
fill-color: #D8D0C8;
opacity: 1;
}
relation[building] {
fill-color: #D8D0C8;
opacity: 1;
}

View file

@ -13,7 +13,6 @@ import numpy as np
import svgwrite
from roentgen.workspace import workspace
from roentgen import server, tile
from roentgen.constructor import Constructor
from roentgen.flinger import Flinger
from roentgen.grid import draw_icons
@ -219,18 +218,28 @@ if __name__ == "__main__":
if options.command == "render":
main(options)
elif options.command == "tile":
from roentgen import tile
tile.ui(options)
elif options.command == "icons":
draw_icons()
elif options.command == "mapcss":
from roentgen.mapcss import write_mapcss
write_mapcss()
elif options.command == "mapcss":
from roentgen import mapcss
mapcss.ui(options)
elif options.command == "element":
draw_element(options)
elif options.command == "server":
from roentgen import server
server.ui(options)
elif options.command == "taginfo":
from roentgen.taginfo import write_taginfo_project_file

View file

@ -16,16 +16,68 @@ from roentgen.scheme import Scheme, Matcher
__author__ = "Sergey Vartanov"
__email__ = "me@enzet.ru"
NODE_CONFIG: str = """
node {
symbol-shape: circle;
symbol-size: 1;
text: auto;
text-color: black;
text-offset-y: -11;
text-anchor-horizontal: center;
font-size: 11;
}"""
WAY_CONFIG: str = """
canvas {
fill-color: #FFFFFF;
}
way {
fill-opacity: 1;
text-color: black;
text-offset-y: -11;
}
relation {
fill-opacity: 1;
text-color: black;
text-offset-y: -11;
}
way[building] {
fill-color: #D8D0C8;
opacity: 1;
}
relation[building] {
fill-color: #D8D0C8;
opacity: 1;
}"""
HEADER: str = """
/*
Map paint style that adds icons from Röntgen icon set
*/
meta {
title: "Röntgen icons";
description: "Icons from Röntgen icon set for JOSM";
author: "Sergey Vartanov";
version: "0.1";
link: "https://github.com/enzet/Roentgen";
}"""
class MapCSSWriter:
def __init__(
self,
scheme: Scheme,
icon_directory_name: str,
add_icons_for_lifecycle: bool,
add_icons: bool = True,
add_ways: bool = True,
add_icons_for_lifecycle: bool = True,
):
self.add_icons_for_lifecycle = add_icons_for_lifecycle
self.icon_directory_name = icon_directory_name
self.add_icons: bool = add_icons
self.add_ways: bool = add_ways
self.add_icons_for_lifecycle: bool = add_icons_for_lifecycle
self.icon_directory_name: str = icon_directory_name
print(self.add_icons, self.add_ways, self.add_icons_for_lifecycle)
self.point_matchers: List[Matcher] = scheme.node_matchers
self.line_matchers: List[Matcher] = scheme.way_matchers
@ -78,18 +130,23 @@ class MapCSSWriter:
"""
Construct icon selectors for MapCSS 0.2 scheme.
"""
with workspace.MAPCSS_PART_FILE_PATH.open() as input_file:
output_file.write(input_file.read())
output_file.write(HEADER + "\n\n")
output_file.write("\n")
if self.add_ways:
output_file.write(WAY_CONFIG + "\n\n")
for line_matcher in self.line_matchers:
for target in ["way", "relation"]:
output_file.write(self.add_selector(target, line_matcher))
if self.add_icons:
output_file.write(NODE_CONFIG + "\n\n")
for matcher in self.point_matchers:
for target in ["node", "area"]:
output_file.write(self.add_selector(target, matcher))
if self.add_icons:
for matcher in self.point_matchers:
for target in ["node", "area"]:
output_file.write(self.add_selector(target, matcher))
if self.add_ways:
for line_matcher in self.line_matchers:
for target in ["way", "relation"]:
output_file.write(self.add_selector(target, line_matcher))
if not self.add_icons_for_lifecycle:
return
@ -107,7 +164,7 @@ class MapCSSWriter:
)
def write_mapcss() -> None:
def ui(options) -> None:
"""
Write MapCSS 0.2 scheme.
"""
@ -123,7 +180,11 @@ def write_mapcss() -> None:
icons_with_outline_path, color=Color("black"), outline=True
)
mapcss_writer: MapCSSWriter = MapCSSWriter(
scheme, workspace.MAPCSS_ICONS_DIRECTORY_NAME, True
scheme,
workspace.MAPCSS_ICONS_DIRECTORY_NAME,
options.icons,
options.ways,
options.lifecycle,
)
with workspace.get_mapcss_file_path().open("w+") as output_file:
mapcss_writer.write(output_file)

View file

@ -31,7 +31,7 @@ def parse_options(args) -> argparse.Namespace:
render = subparser.add_parser("render")
subparser.add_parser("icons")
subparser.add_parser("mapcss")
mapcss = subparser.add_parser("mapcss")
subparser.add_parser("taginfo")
tile = subparser.add_parser("tile")
element = subparser.add_parser("element")
@ -41,6 +41,7 @@ def parse_options(args) -> argparse.Namespace:
add_tile_arguments(tile)
add_server_arguments(server)
add_element_arguments(element)
add_mapcss_arguments(mapcss)
arguments: argparse.Namespace = parser.parse_args(args[1:])
@ -171,6 +172,27 @@ def add_render_arguments(render) -> None:
)
def add_mapcss_arguments(mapcss) -> None:
mapcss.add_argument(
"--icons",
action=argparse.BooleanOptionalAction,
default=True,
help="add icons for nodes and areas",
)
mapcss.add_argument(
"--ways",
action=argparse.BooleanOptionalAction,
default=True,
help="add style for ways and relations",
)
mapcss.add_argument(
"--lifecycle",
action=argparse.BooleanOptionalAction,
default=True,
help="add icons for lifecycle tags",
)
def progress_bar(
number: int, total: int, length: int = 20, step: int = 1000, text: str = ""
) -> None:

View file

@ -23,7 +23,6 @@ class Workspace:
ICONS_CONFIG_PATH: Path = Path("icons/config.json")
GITHUB_TEST_PATH: Path = Path(".github/workflows/test.yml")
DATA_PATH: Path = Path("data")
MAPCSS_PART_FILE_PATH: Path = DATA_PATH / "roentgen_icons_part.mapcss"
# Generated directories and files.
@ -35,7 +34,7 @@ class Workspace:
self._icons_by_id_path: Path = output_path / "icons_by_id"
self._icons_by_name_path: Path = output_path / "icons_by_name"
self._mapcss_path: Path = output_path / "roentgen_icons_mapcss"
self._mapcss_path: Path = output_path / "roentgen_mapcss"
self._tile_path: Path = output_path / "tiles"
def get_icons_by_id_path(self) -> Path:
@ -56,7 +55,7 @@ class Workspace:
def get_mapcss_file_path(self) -> Path:
"""Directory for MapCSS files."""
return self.get_mapcss_path() / "roentgen_icons.mapcss"
return self.get_mapcss_path() / "roentgen.mapcss"
def get_mapcss_icons_path(self) -> Path:
"""Directory for icons used by MapCSS file."""

View file

@ -13,7 +13,7 @@ def test_mapcss() -> None:
"""
Test MapCSS generation.
"""
writer: MapCSSWriter = MapCSSWriter(SCHEME, "icons", False)
writer: MapCSSWriter = MapCSSWriter(SCHEME, "icons")
matcher: NodeMatcher = NodeMatcher(
{"tags": {"natural": "tree"}, "shapes": ["tree"]}
)