Map Machine: Python renderer for OpenStreetMap with custom icons

https://github.com/enzet/map-machine

The Map Machine project consists of

The idea behind the Map Machine project is to show all the richness of the OpenStreetMap data: to have a possibility to display any map feature represented by OpenStreetMap data tags by means of colors, shapes, and icons. Map Machine is created both for map contributors: to display all changes one made on the map even if they are small, and for map users: to dig down into the map and find every detail that was mapped.

Unlike standard OpenStreetMap layers, Map Machine is a playground for experiments where one can easily try to support any unsupported tag, proposed tagging scheme, tags with little or even single usage, deprecated ones that are still in use.

Map Machine is intended to be highly configurable, so it can generate precise but messy maps for OSM contributors as well as pretty and clean maps for OSM users. It can also use some slow algorithms for experimental features.

See

Usage example

map-machine render -b 2.284,48.860,2.290,48.865

will automatically download OSM data and render an SVG map of the specified area to out/map.svg. See Map generation.

map-machine tile -b 2.361,48.871,2.368,48.875

will automatically download OSM data and render PNG tiles that cover the specified area to the out/tiles directory. See Tile generation.

Röntgen icon set

The central feature of the project is the Röntgen icon set. It is a set of monochrome 14 × 14 px pixel-aligned icons specially created for the Map Machine project. Unlike the Map Machine source code, which is under the MIT license, all icons are under the CC BY license. So, with the appropriate credit the icon set can be used outside the project. Some icons can be used as emoji symbols.

All icons tend to support a common design style, which is heavily inspired by Maki, Osmic, and Temaki.

Icons

Feel free to request new icons via issues for whatever you want to see on the map. No matter how frequently the tag is used in OpenStreetMap since the final goal is to cover all tags. However, commonly used tags have priority, other things being equal.

Generate an icon grid and sets of individual icons with map-machine icons. It will update the doc/grid.svg file, and create SVG files in the out/icons_by_id directory where files are named using shape identifiers (e.g. power_tower_portal_2_level.svg) and in the icons_by_name directory where files are named using shape names (e.g. Röntgen portal two-level transmission tower.svg). Files from the last directory are used in the OpenStreetMap wiki (e.g. File:Röntgen_portal_two-level_transmission_tower.svg).

Map features

Extra icons

Map Machine uses icons to visualize tags for nodes and areas. But unlike other renderers, Map Machine can use more than one icon to visualize an entity and can use colors to visualize colour value or other entity properties (like material or genus).

Isometric building shapes

With --buildings isometric or --buildings isometric-no-parts (not set by default), buildings are drawn using isometric shapes for walls and shade in proportion to building:levels, building:min_level, height, and min_height values.

Example

map-machine render -c -26.19049,28.05605 -s 600,400 --buildings isometric

3D buildings

Road lanes

To determine the road width Map Machine uses the width tag value or estimates it based on the lanes value. If lane value is specified, it also draws lane separators. This map style is highly inspired by Christoph Hormann's post Navigating the Maze.

Example

map-machine render -c 47.61224,-122.33866 -s 600,400

Road lanes

Trees

Visualization of tree leaf types (broadleaved or needle-leaved) and genus or taxon by means of icon shapes and leaf cycles (deciduous or evergreen) by means of color.

Example

Trees

Viewpoint and camera direction

direction tag values for tourism = viewpoint and camera:direction for man_made = surveillance are rendered with sectors displaying the direction and angle (15º if angle is not specified) or the whole circle for panorama view. Radial gradient is used for surveillance and inverted radial gradient is used for viewpoints.

Example

map-machine render -c 52.50892,13.3244 -s 600,400 -z 18.5

Surveillance

Viewpoints

Power tower design

Visualize design values used with power = tower and power = pole tags. design has more than 1 million usages in OpenStreetMap.

Power tower design

Power tower design

Colors

Map icons have colour tag value if it is present, otherwise, icons are displayed with dark grey color by default, purple color for shop nodes, red color for emergency features, and special colors for natural features. Map Machine also takes into account building:colour, roof:colour and other *:colour tags, and uses the colour tag value to paint subway lines.

Building colors

Emergency

Emergency

Japanese map symbols

Japanese maps usually use special symbols called chizukigou (地図記号) which are different from standard map symbols used in other countries. They can be enabled with --country jp option.

Japanese map symbols

Indoor features

Draw indoor features specifying level with --level option. Possible values are numbers (e.g. 1, 0.5), lists of number separated by ; (e.g. 1;2;4;4.5), all, overground, and underground. The default value is not all, but overground, so underground objects are not shown on the map if --level option is not specified.

Example

map-machine render -c 4.5978,-74.07507 -s 600,400 -z 19.5 --level 0

Indoor

Shape combination

One of the key features of Map Machine is constructing icons from several shapes.

Masts

For man_made = mast distinguish types (communication, lighting, monitoring, and siren) and construction (freestanding or lattice, and using of guys) are rendered by combining 7 unique icon shapes.

Mast types

Volcanoes

For natural = volcano status (active, dormant, extinct, or unspecified) and type (stratovolcano, shield, or scoria) are rendered by combining 7 unique icon shapes.

Volcano types

Wireframe view

Creation time mode

Visualize element creation time with --mode time.

Creation time mode

Author mode

Every way and node displayed with the random color picked for each author with --mode author.

Author mode

Installation

Requirements: Python 3.9.

pip install git+https://github.com/enzet/map-machine

For more detailed instructions, see instructions.

Map generation

The render command is used to generate an SVG map from OpenStreetMap data. You can run it using:

map-machine render \
    -b <min longitude>,<min latitude>,<max longitude>,<max latitude> \
    -o <output file name> \
    -z <OSM zoom level> \
    <other arguments>

Example

map-machine render \
    --boundary-box 2.284,48.860,2.290,48.865 \
    --output out/esplanade_du_trocadéro.svg

will download OSM data to cache/2.284,48.860,2.290,48.865.osm and render an SVG map of the specified area to out/esplanade_du_trocadéro.svg.

Arguments

Option Description
-i, --input <path> input XML file name or names (if not specified, file will be downloaded using the OpenStreetMap API)
-o, --output <path> output SVG file name, default value: out/map.svg
-b, --boundary-box <lon1>,<lat1>,<lon2>,<lat2> geo boundary box
--cache <path> path for temporary OSM files, default value: cache
-z, --zoom <float> OSM zoom level, default value: 18.0
-c, --coordinates <latitude>,<longitude> coordinates of any location inside the tile
-s, --size <width>,<height> resulted image size

plus map configuration options

Tile generation

Command tile is used to generate PNG tiles for slippy maps. To use them, run Map Machine tile server.

Option Description
-c, --coordinates <latitude>,<longitude> coordinates of any location inside the tile
-t, --tile <zoom level>/<x>/<y> tile specification
--cache <path> path for temporary OSM files, default value: cache
-b, --boundary-box <lon1>,<lat1>,<lon2>,<lat2> construct the minimum amount of tiles that cover the requested boundary box
-z, --zoom <range> OSM zoom levels; can be list of numbers or ranges, e.g. 16-18, 16,17,18, or 16,18-20, default value: 18
-i, --input <path> input OSM XML file name (if not specified, the file will be downloaded using the OpenStreetMap API)

plus map configuration options

Generate one tile

Specify the tile coordinates:

map-machine tile --tile <OSM zoom level>/<x>/<y>

or specify any geographical coordinates inside a tile:

map-machine tile \
    --coordinates <latitude>,<longitude> \
    --zoom <OSM zoom levels>

The tile will be stored as an SVG file out/tiles/tile_<zoom level>_<x>_<y>.svg and a PNG file out/tiles/tile_<zoom level>_<x>_<y>.svg, where x and y are tile coordinates. The --zoom option will be ignored if it is used with the --tile option.

Example:

map-machine tile -c 55.7510637,37.6270761 -z 18

will generate an SVG file out/tiles/tile_18_158471_81953.svg and a PNG file out/tiles/tile_18_158471_81953.png.

Generate a set of tiles

Specify the boundary box to get the minimal set of tiles that covers the area:

map-machine tile \
    --boundary-box <min longitude>,<min latitude>,<max longitude>,<max latitude> \
    --zoom <OSM zoom levels>

The boundary box will be extended to the boundaries of the minimal tileset that covers the area, then it will be extended a bit more to avoid some artifacts on the edges rounded to 3 digits after the decimal point. The map with the new boundary box coordinates will be written to the cache directory as SVG and PNG files. All tiles will be stored as SVG files out/tiles/tile_<zoom level>_<x>_<y>.svg and PNG files out/tiles/tile_<zoom level>_<x>_<y>.svg, where x and y are tile coordinates.

Example:

map-machine tile -b 2.361,48.871,2.368,48.875

will generate 36 PNG tiles at zoom level 18 from tile 18/132791/90164 all the way to 18/132796/90169 and two cached files cache/2.360,48.869,2.370,48.877_18.svg and cache/2.360,48.869,2.370,48.877_18.png.

Tile server

The server command is used to run a tile server for slippy maps.

Stop server interrupting the process with Ctrl + C.

Option Description
--cache <path> path for temporary OSM files, default value: cache
--port <integer> port number, default value: 8080

Example

Create a minimal amount of tiles that cover specified boundary box for zoom levels 16, 17, 18, and 19:

map-machine tile -b 2.364,48.854,2.367,48.857 -z 16-19

Run tile server on 127.0.0.1:8080:

Use JavaScript code for Leaflet:

var map = L.map('mapid').setView([48.8555, 2.3655], 18);
L.tileLayer('http://127.0.0.1:8080/tiles/{z}/{x}/{y}', {
    maxZoom: 19,
    attribution: 'Map data &copy; ' +
        '<a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> ' +
        'contributors, imagery &copy; ' +
        '<a href="https:/github.com/enzet/map-machine">Map Machine</a>',
    id: 'map_machine',
    tileSize: 256,
    zoomOffset: 0
}).addTo(map);

HTML code:

<div id="mapid" style="width: 1000px; height: 600px;"></div>

Map options

Map configuration options used by render and tile commands:

Option Description
--scheme <id> or <path> scheme identifier (look for <id>.yml file) or path to a YAML scheme file, default value: default
--buildings <mode> building drawing mode: no, flat, isometric, isometric-no-parts, default value: flat
--mode <string> map drawing mode: normal, author, time, white, black, default value: normal
--overlap <integer> how many pixels should be left around icons and text, default value: 12
--labels <string> label drawing mode: no, main, all, address, default value: main
--level display only this floor level, default value: overground
--seed <string> seed for random
--tooltips add tooltips with tags for icons in SVG files
--country two-letter code (ISO 3166-1 alpha-2) of country, that should be used for location restrictions, default value: world
--ignore-level-matching draw all map features ignoring the current level
--roofs draw building roofs, set by default
--building-colors paint walls (if isometric mode is enabled) and roofs with specified colors
--show-overlapped show hidden nodes with a dot

MapCSS 0.2 generation

The mapcss command can be used to generate a MapCSS scheme. map-machine mapcss will create an out/map_machine_mapcss directory with simple MapCSS 0.2 scheme adding icons from the Röntgen icon set to nodes and areas: .mapcss file and directory with icons.

To create a MapCSS style with Map Machine style also for ways and relations, run map-machine mapcss --ways.

Option Description
--icons add icons for nodes and areas, set by default
--ways add style for ways and relations
--lifecycle add icons for lifecycle tags; be careful: this will increase the number of node and area selectors by 9 times, set by default

Use Röntgen as JOSM map paint style

  • Run map-machine mapcss.
  • Open JOSM.
  • Go to Preferences → Third tab on the left → Map Paint Styles.
  • Active styles: press +.
  • URL / File: set path to out/map_machine_mapcss/map_machine.mapcss.

To enable/disable the Map Machine map paint style go to View → Map Paint Styles → Map Machine.

Example

JOSM example

Example of using Röntgen icons on top of the Mapnik style in JOSM. Map Paint Styles look like this:

  • ✓ Mapnik (true)
  • ✓ Map Machine
{
"by": "altilunium",
"descendants": 5,
"id": 40244729,
"kids": [
40268695,
40267056,
40267419,
40267933,
40270307
],
"score": 135,
"time": 1714717463,
"title": "Map Machine: Python renderer for OpenStreetMap with custom icons",
"type": "story",
"url": "https://github.com/enzet/map-machine"
}
{
"author": "enzet",
"date": null,
"description": "Python renderer for OpenStreetMap with custom icons intended to display as many map features as possible - enzet/map-machine",
"image": "https://opengraph.githubassets.com/da7943c2eb7965279c2a9875ef3dadaff147ec13fe02d86652794bd864e00cbb/enzet/map-machine",
"logo": "https://logo.clearbit.com/github.com",
"publisher": "GitHub",
"title": "GitHub - enzet/map-machine: Python renderer for OpenStreetMap with custom icons intended to display as many map features as possible",
"url": "https://github.com/enzet/map-machine"
}
{
"url": "https://github.com/enzet/map-machine",
"title": "GitHub - enzet/map-machine: Python renderer for OpenStreetMap with custom icons intended to display as many map features as possible",
"description": "The Map Machine project consists of a Python OpenStreetMap renderer: SVG map generation, SVG and PNG tile generation, the Röntgen icon set: unique CC-BY 4.0 map icons. The idea behind the Map Machine...",
"links": [
"https://github.com/enzet/map-machine"
],
"image": "https://opengraph.githubassets.com/da7943c2eb7965279c2a9875ef3dadaff147ec13fe02d86652794bd864e00cbb/enzet/map-machine",
"content": "<div><article>\n<p>The <strong>Map Machine</strong> project consists of</p>\n<ul>\n<li>a Python <a target=\"_blank\" href=\"http://openstreetmap.org/\">OpenStreetMap</a> renderer:\n<ul>\n<li>SVG <a target=\"_blank\" href=\"https://github.com/enzet/map-machine#map-generation\">map generation</a>,</li>\n<li>SVG and PNG <a target=\"_blank\" href=\"https://github.com/enzet/map-machine#tile-generation\">tile generation</a>,</li>\n</ul>\n</li>\n<li>the <a target=\"_blank\" href=\"https://github.com/enzet/map-machine#r%C3%B6ntgen-icon-set\">Röntgen</a> icon set: unique CC-BY 4.0 map icons.</li>\n</ul>\n<p>The idea behind the Map Machine project is to <strong>show all the richness of the OpenStreetMap data</strong>: to have a possibility to display any map feature represented by OpenStreetMap data tags by means of colors, shapes, and icons. Map Machine is created both for map contributors: to display all changes one made on the map even if they are small, and for map users: to dig down into the map and find every detail that was mapped.</p>\n<p>Unlike standard OpenStreetMap layers, <strong>Map Machine is a playground for experiments</strong> where one can easily try to support any unsupported tag, proposed tagging scheme, tags with little or even single usage, deprecated ones that are still in use.</p>\n<p>Map Machine is intended to be highly configurable, so it can generate precise but messy maps for OSM contributors as well as pretty and clean maps for OSM users. It can also use some slow algorithms for experimental features.</p>\n<p>See</p>\n<ul>\n<li><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#installation\">installation instructions</a>,</li>\n<li><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#map-features\">map features</a>,</li>\n<li><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#use-r%C3%B6ntgen-as-josm-map-paint-style\">using Röntgen as JOSM style</a>.</li>\n</ul>\n<p></p><h2>Usage example</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#usage-example\"></a><p></p>\n<div><pre>map-machine render -b 2.284,48.860,2.290,48.865</pre></div>\n<p>will automatically download OSM data and render an SVG map of the specified area to <code>out/map.svg</code>. See <a target=\"_blank\" href=\"https://github.com/enzet/map-machine#map-generation\">Map generation</a>.</p>\n<div><pre>map-machine tile -b 2.361,48.871,2.368,48.875</pre></div>\n<p>will automatically download OSM data and render PNG tiles that cover the specified area to the <code>out/tiles</code> directory. See <a target=\"_blank\" href=\"https://github.com/enzet/map-machine#tile-generation\">Tile generation</a>.</p>\n<p></p><h2>Röntgen icon set</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#r%C3%B6ntgen-icon-set\"></a><p></p>\n<p>The central feature of the project is the Röntgen icon set. It is a set of monochrome 14 × 14 px pixel-aligned icons specially created for the Map Machine project. Unlike the Map Machine source code, which is under the MIT license, all icons are under the <a target=\"_blank\" href=\"http://creativecommons.org/licenses/by/4.0/\">CC BY</a> license. So, with the appropriate credit the icon set can be used outside the project. Some icons can be used as emoji symbols.</p>\n<p>All icons tend to support a common design style, which is heavily inspired by <a target=\"_blank\" href=\"https://github.com/mapbox/maki\">Maki</a>, <a target=\"_blank\" href=\"https://github.com/gmgeo/osmic\">Osmic</a>, and <a target=\"_blank\" href=\"https://github.com/ideditor/temaki\">Temaki</a>.</p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/grid.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/grid.svg\" alt=\"Icons\" /></a></p>\n<p>Feel free to request new icons via issues for whatever you want to see on the map. No matter how frequently the tag is used in OpenStreetMap since the final goal is to cover all tags. However, commonly used tags have priority, other things being equal.</p>\n<p>Generate an icon grid and sets of individual icons with <code>map-machine icons</code>. It will update the <code>doc/grid.svg</code> file, and create SVG files in the <code>out/icons_by_id</code> directory where files are named using shape identifiers (e.g. <code>power_tower_portal_2_level.svg</code>) and in the <code>icons_by_name</code> directory where files are named using shape names (e.g. <code>Röntgen portal two-level transmission tower.svg</code>). Files from the last directory are used in the OpenStreetMap wiki (e.g. <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/File:R%C3%B6ntgen_portal_two-level_transmission_tower.svg\"><code>File:Röntgen_portal_two-level_transmission_tower.svg</code></a>).</p>\n<p></p><h2>Map features</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#map-features\"></a><p></p>\n<p></p><h3>Extra icons</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#extra-icons\"></a><p></p>\n<p>Map Machine uses icons to visualize tags for nodes and areas. But unlike other renderers, Map Machine can use more than one icon to visualize an entity and can use colors to visualize <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:colour\"><code>colour</code></a> value or other entity properties (like <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:material\"><code>material</code></a> or <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:genus\"><code>genus</code></a>).</p>\n<p></p><h3>Isometric building shapes</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#isometric-building-shapes\"></a><p></p>\n<p>With <code>--buildings isometric</code> or <code>--buildings isometric-no-parts</code> (not set by default), buildings are drawn using isometric shapes for walls and shade in proportion to <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:building:levels\"><code>building:levels</code></a>, <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:building:min_level\"><code>building:min_level</code></a>, <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:height\"><code>height</code></a>, and <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:min_height\"><code>min_height</code></a> values.</p>\n<p></p><h4>Example</h4><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#example\"></a><p></p>\n<div><pre>map-machine render -c -26.19049,28.05605 -s 600,400 --buildings isometric</pre></div>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/buildings.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/buildings.svg\" alt=\"3D buildings\" /></a></p>\n<p></p><h3>Road lanes</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#road-lanes\"></a><p></p>\n<p>To determine the road width Map Machine uses the <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:width\"><code>width</code></a> tag value or estimates it based on the <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:lanes\"><code>lanes</code></a> value. If lane value is specified, it also draws lane separators. This map style is highly inspired by Christoph Hormann's post <a target=\"_blank\" href=\"http://blog.imagico.de/navigating-the-maze-part-2/\">Navigating the Maze</a>.</p>\n<p></p><h4>Example</h4><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#example-1\"></a><p></p>\n<div><pre>map-machine render -c 47.61224,-122.33866 -s 600,400</pre></div>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/lanes.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/lanes.svg\" alt=\"Road lanes\" /></a></p>\n<p></p><h3>Trees</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#trees\"></a><p></p>\n<p>Visualization of tree leaf types (broadleaved or needle-leaved) and genus or taxon by means of icon shapes and leaf cycles (deciduous or evergreen) by means of color.</p>\n<p></p><h4>Example</h4><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#example-2\"></a><p></p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/trees.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/trees.svg\" alt=\"Trees\" /></a></p>\n<p></p><h3>Viewpoint and camera direction</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#viewpoint-and-camera-direction\"></a><p></p>\n<p><a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:direction\"><code>direction</code></a> tag values for <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:tourism\"><code>tourism</code></a> = <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Tag:tourism=viewpoint\"><code>viewpoint</code></a> and <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:camera:direction\"><code>camera:direction</code></a> for <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:man_made\"><code>man_made</code></a> = <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Tag:man_made=surveillance\"><code>surveillance</code></a> are rendered with sectors displaying the direction and angle (15º if angle is not specified) or the whole circle for panorama view. Radial gradient is used for surveillance and inverted radial gradient is used for viewpoints.</p>\n<p></p><h4>Example</h4><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#example-3\"></a><p></p>\n<div><pre>map-machine render -c 52.50892,13.3244 -s 600,400 -z 18.5</pre></div>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/surveillance.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/surveillance.svg\" alt=\"Surveillance\" /></a></p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/viewpoints.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/viewpoints.svg\" alt=\"Viewpoints\" /></a></p>\n<p></p><h3>Power tower design</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#power-tower-design\"></a><p></p>\n<p>Visualize <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:design\"><code>design</code></a> values used with <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:power\"><code>power</code></a> = <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Tag:power=tower\"><code>tower</code></a> and <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:power\"><code>power</code></a> = <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Tag:power=pole\"><code>pole</code></a> tags. <code>design</code> has more than 1 million usages in OpenStreetMap.</p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/icons_power.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/icons_power.svg\" alt=\"Power tower design\" /></a></p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/power.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/power.svg\" alt=\"Power tower design\" /></a></p>\n<p></p><h3>Colors</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#colors\"></a><p></p>\n<p>Map icons have <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:colour\"><code>colour</code></a> tag value if it is present, otherwise, icons are displayed with dark grey color by default, purple color for shop nodes, red color for emergency features, and special colors for natural features. Map Machine also takes into account <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:building:colour\"><code>building:colour</code></a>, <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:roof:colour\"><code>roof:colour</code></a> and other <code>*:colour</code> tags, and uses the <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:colour\"><code>colour</code></a> tag value to paint subway lines.</p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/colors.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/colors.svg\" alt=\"Building colors\" /></a></p>\n<p></p><h3>Emergency</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#emergency\"></a><p></p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/icons_emergency.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/icons_emergency.svg\" alt=\"Emergency\" /></a></p>\n<p></p><h3>Japanese map symbols</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#japanese-map-symbols\"></a><p></p>\n<p>Japanese maps usually use <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_Japanese_map_symbols\">special symbols</a> called <em>chizukigou</em> (地図記号) which are different from standard map symbols used in other countries. They can be enabled with <code>--country jp</code> option.</p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/icons_japanese.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/icons_japanese.svg\" alt=\"Japanese map symbols\" /></a></p>\n<p></p><h3>Indoor features</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#indoor-features\"></a><p></p>\n<p>Draw indoor features specifying level with <code>--level</code> option. Possible values are numbers (e.g. <code>1</code>, <code>0.5</code>), lists of number separated by <code>;</code> (e.g. <code>1;2;4;4.5</code>), <code>all</code>, <code>overground</code>, and <code>underground</code>. The default value is not <code>all</code>, but <code>overground</code>, so underground objects are not shown on the map if <code>--level</code> option is not specified.</p>\n<p></p><h4>Example</h4><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#example-4\"></a><p></p>\n<div><pre>map-machine render -c 4.5978,-74.07507 -s 600,400 -z 19.5 --level 0</pre></div>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/indoor.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/indoor.svg\" alt=\"Indoor\" /></a></p>\n<p></p><h3>Shape combination</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#shape-combination\"></a><p></p>\n<p>One of the key features of Map Machine is constructing icons from several shapes.</p>\n<p></p><h4>Masts</h4><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#masts\"></a><p></p>\n<p>For <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:man_made\"><code>man_made</code></a> = <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Tag:man_made=mast\"><code>mast</code></a> distinguish types (communication, lighting, monitoring, and siren) and construction (freestanding or lattice, and using of guys) are rendered by combining 7 unique icon shapes.</p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/mast.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/mast.svg\" alt=\"Mast types\" /></a></p>\n<p></p><h4>Volcanoes</h4><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#volcanoes\"></a><p></p>\n<p>For <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Key:natural\"><code>natural</code></a> = <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Tag:natural=volcano\"><code>volcano</code></a> status (active, dormant, extinct, or unspecified) and type (stratovolcano, shield, or scoria) are rendered by combining 7 unique icon shapes.</p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/volcano.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/volcano.svg\" alt=\"Volcano types\" /></a></p>\n<p></p><h2>Wireframe view</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#wireframe-view\"></a><p></p>\n<p></p><h3>Creation time mode</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#creation-time-mode\"></a><p></p>\n<p>Visualize element creation time with <code>--mode time</code>.</p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/time.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/time.svg\" alt=\"Creation time mode\" /></a></p>\n<p></p><h3>Author mode</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#author-mode\"></a><p></p>\n<p>Every way and node displayed with the random color picked for each author with <code>--mode author</code>.</p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/author.svg\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/author.svg\" alt=\"Author mode\" /></a></p>\n<p></p><h2>Installation</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#installation\"></a><p></p>\n<p>Requirements: Python 3.9.</p>\n<ul>\n<li>Install the <a target=\"_blank\" href=\"https://www.cairographics.org/download/\">cairo 2D graphic library</a>,</li>\n<li>install the <a target=\"_blank\" href=\"https://libgeos.org/\">GEOS library</a>,</li>\n<li>install the Python packages with the command:</li>\n</ul>\n<div><pre>pip install git+https://github.com/enzet/map-machine</pre></div>\n<p>For more detailed instructions, see <a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/INSTALL.md\">instructions</a>.</p>\n<p></p><h2>Map generation</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#map-generation\"></a><p></p>\n<p>The <code>render</code> command is used to generate an SVG map from OpenStreetMap data. You can run it using:</p>\n<div><pre>map-machine render \\\n -b <span>&lt;</span>min longitude<span>&gt;</span>,<span>&lt;</span>min latitude<span>&gt;</span>,<span>&lt;</span>max longitude<span>&gt;</span>,<span>&lt;</span>max latitude<span>&gt;</span> \\\n -o <span>&lt;</span>output file name<span>&gt;</span> \\\n -z <span>&lt;</span>OSM zoom level<span>&gt;</span> \\\n <span>&lt;</span>other arguments<span>&gt;</span></pre></div>\n<p></p><h3>Example</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#example-5\"></a><p></p>\n<div><pre>map-machine render \\\n --boundary-box 2.284,48.860,2.290,48.865 \\\n --output out/esplanade_du_trocadéro.svg</pre></div>\n<p>will download OSM data to <code>cache/2.284,48.860,2.290,48.865.osm</code> and render an SVG map of the specified area to <code>out/esplanade_du_trocadéro.svg</code>.</p>\n<p></p><h3>Arguments</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#arguments\"></a><p></p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><span><code>-i</code></span>, <span><code>--input</code></span> <code>&lt;path&gt;</code></td>\n<td>input XML file name or names (if not specified, file will be downloaded using the OpenStreetMap API)</td>\n</tr>\n<tr>\n<td><span><code>-o</code></span>, <span><code>--output</code></span> <code>&lt;path&gt;</code></td>\n<td>output SVG file name, default value: <code>out/map.svg</code></td>\n</tr>\n<tr>\n<td><span><code>-b</code></span>, <span><code>--boundary-box</code></span> <code>&lt;lon1&gt;,&lt;lat1&gt;,&lt;lon2&gt;,&lt;lat2&gt;</code></td>\n<td>geo boundary box</td>\n</tr>\n<tr>\n<td><span><code>--cache</code></span> <code>&lt;path&gt;</code></td>\n<td>path for temporary OSM files, default value: <code>cache</code></td>\n</tr>\n<tr>\n<td><span><code>-z</code></span>, <span><code>--zoom</code></span> <code>&lt;float&gt;</code></td>\n<td>OSM zoom level, default value: 18.0</td>\n</tr>\n<tr>\n<td><span><code>-c</code></span>, <span><code>--coordinates</code></span> <code>&lt;latitude&gt;,&lt;longitude&gt;</code></td>\n<td>coordinates of any location inside the tile</td>\n</tr>\n<tr>\n<td><span><code>-s</code></span>, <span><code>--size</code></span> <code>&lt;width&gt;,&lt;height&gt;</code></td>\n<td>resulted image size</td>\n</tr>\n</tbody>\n</table>\n<p>plus <a target=\"_blank\" href=\"https://github.com/enzet/map-machine#map-options\">map configuration options</a></p>\n<p></p><h2>Tile generation</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#tile-generation\"></a><p></p>\n<p>Command <code>tile</code> is used to generate PNG tiles for <a target=\"_blank\" href=\"https://wiki.openstreetmap.org/wiki/Slippy_Map\">slippy maps</a>. To use them, run <a target=\"_blank\" href=\"https://github.com/enzet/map-machine#tile-server\">Map Machine tile server</a>.</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><span><code>-c</code></span>, <span><code>--coordinates</code></span> <code>&lt;latitude&gt;,&lt;longitude&gt;</code></td>\n<td>coordinates of any location inside the tile</td>\n</tr>\n<tr>\n<td><span><code>-t</code></span>, <span><code>--tile</code></span> <code>&lt;zoom level&gt;/&lt;x&gt;/&lt;y&gt;</code></td>\n<td>tile specification</td>\n</tr>\n<tr>\n<td><span><code>--cache</code></span> <code>&lt;path&gt;</code></td>\n<td>path for temporary OSM files, default value: <code>cache</code></td>\n</tr>\n<tr>\n<td><span><code>-b</code></span>, <span><code>--boundary-box</code></span> <code>&lt;lon1&gt;,&lt;lat1&gt;,&lt;lon2&gt;,&lt;lat2&gt;</code></td>\n<td>construct the minimum amount of tiles that cover the requested boundary box</td>\n</tr>\n<tr>\n<td><span><code>-z</code></span>, <span><code>--zoom</code></span> <code>&lt;range&gt;</code></td>\n<td>OSM zoom levels; can be list of numbers or ranges, e.g. <code>16-18</code>, <code>16,17,18</code>, or <code>16,18-20</code>, default value: <code>18</code></td>\n</tr>\n<tr>\n<td><span><code>-i</code></span>, <span><code>--input</code></span> <code>&lt;path&gt;</code></td>\n<td>input OSM XML file name (if not specified, the file will be downloaded using the OpenStreetMap API)</td>\n</tr>\n</tbody>\n</table>\n<p>plus <a target=\"_blank\" href=\"https://github.com/enzet/map-machine#map-options\">map configuration options</a></p>\n<p></p><h3>Generate one tile</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#generate-one-tile\"></a><p></p>\n<p>Specify the tile coordinates:</p>\n<div><pre>map-machine tile --tile <span>&lt;</span>OSM zoom level<span>&gt;</span>/<span>&lt;</span>x<span>&gt;</span>/<span>&lt;</span>y<span>&gt;</span></pre></div>\n<p>or specify any geographical coordinates inside a tile:</p>\n<div><pre>map-machine tile \\\n --coordinates <span>&lt;</span>latitude<span>&gt;</span>,<span>&lt;</span>longitude<span>&gt;</span> \\\n --zoom <span>&lt;</span>OSM zoom levels<span>&gt;</span></pre></div>\n<p>The tile will be stored as an SVG file <code>out/tiles/tile_&lt;zoom level&gt;_&lt;x&gt;_&lt;y&gt;.svg</code> and a PNG file <code>out/tiles/tile_&lt;zoom level&gt;_&lt;x&gt;_&lt;y&gt;.svg</code>, where <code>x</code> and <code>y</code> are tile coordinates. The <code>--zoom</code> option will be ignored if it is used with the <code>--tile</code> option.</p>\n<p>Example:</p>\n<div><pre>map-machine tile -c 55.7510637,37.6270761 -z 18</pre></div>\n<p>will generate an SVG file <code>out/tiles/tile_18_158471_81953.svg</code> and a PNG file <code>out/tiles/tile_18_158471_81953.png</code>.</p>\n<p></p><h3>Generate a set of tiles</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#generate-a-set-of-tiles\"></a><p></p>\n<p>Specify the boundary box to get the minimal set of tiles that covers the area:</p>\n<div><pre>map-machine tile \\\n --boundary-box <span>&lt;</span>min longitude<span>&gt;</span>,<span>&lt;</span>min latitude<span>&gt;</span>,<span>&lt;</span>max longitude<span>&gt;</span>,<span>&lt;</span>max latitude<span>&gt;</span> \\\n --zoom <span>&lt;</span>OSM zoom levels<span>&gt;</span></pre></div>\n<p>The boundary box will be extended to the boundaries of the minimal tileset that covers the area, then it will be extended a bit more to avoid some artifacts on the edges rounded to 3 digits after the decimal point. The map with the new boundary box coordinates will be written to the cache directory as SVG and PNG files. All tiles will be stored as SVG files <code>out/tiles/tile_&lt;zoom level&gt;_&lt;x&gt;_&lt;y&gt;.svg</code> and PNG files <code>out/tiles/tile_&lt;zoom level&gt;_&lt;x&gt;_&lt;y&gt;.svg</code>, where <code>x</code> and <code>y</code> are tile coordinates.</p>\n<p>Example:</p>\n<div><pre>map-machine tile -b 2.361,48.871,2.368,48.875</pre></div>\n<p>will generate 36 PNG tiles at zoom level 18 from tile 18/132791/90164 all the way to 18/132796/90169 and two cached files <code>cache/2.360,48.869,2.370,48.877_18.svg</code> and <code>cache/2.360,48.869,2.370,48.877_18.png</code>.</p>\n<p></p><h2>Tile server</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#tile-server\"></a><p></p>\n<p>The <code>server</code> command is used to run a tile server for slippy maps.</p>\n<p>Stop server interrupting the process with Ctrl + C.</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><span><code>--cache</code></span> <code>&lt;path&gt;</code></td>\n<td>path for temporary OSM files, default value: <code>cache</code></td>\n</tr>\n<tr>\n<td><span><code>--port</code></span> <code>&lt;integer&gt;</code></td>\n<td>port number, default value: 8080</td>\n</tr>\n</tbody>\n</table>\n<p></p><h3>Example</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#example-6\"></a><p></p>\n<p>Create a minimal amount of tiles that cover specified boundary box for zoom levels 16, 17, 18, and 19:</p>\n<div><pre>map-machine tile -b 2.364,48.854,2.367,48.857 -z 16-19</pre></div>\n<p>Run tile server on 127.0.0.1:8080:</p>\n<p>Use JavaScript code for <a target=\"_blank\" href=\"https://leafletjs.com/\">Leaflet</a>:</p>\n<div><pre><span>var</span> <span>map</span> <span>=</span> <span>L</span><span>.</span><span>map</span><span>(</span><span>'mapid'</span><span>)</span><span>.</span><span>setView</span><span>(</span><span>[</span><span>48.8555</span><span>,</span> <span>2.3655</span><span>]</span><span>,</span> <span>18</span><span>)</span><span>;</span>\n<span>L</span><span>.</span><span>tileLayer</span><span>(</span><span>'http://127.0.0.1:8080/tiles/{z}/{x}/{y}'</span><span>,</span> <span>{</span>\n <span>maxZoom</span>: <span>19</span><span>,</span>\n <span>attribution</span>: <span>'Map data &amp;copy; '</span> <span>+</span>\n <span>'&lt;a href=\"https://www.openstreetmap.org/copyright\"&gt;OpenStreetMap&lt;/a&gt; '</span> <span>+</span>\n <span>'contributors, imagery &amp;copy; '</span> <span>+</span>\n <span>'&lt;a href=\"https:/github.com/enzet/map-machine\"&gt;Map Machine&lt;/a&gt;'</span><span>,</span>\n <span>id</span>: <span>'map_machine'</span><span>,</span>\n <span>tileSize</span>: <span>256</span><span>,</span>\n <span>zoomOffset</span>: <span>0</span>\n<span>}</span><span>)</span><span>.</span><span>addTo</span><span>(</span><span>map</span><span>)</span><span>;</span></pre></div>\n<p>HTML code:</p>\n<div><pre><span>&lt;</span><span>div</span> <span>id</span>=\"<span>mapid</span>\" <span>style</span>=\"<span>width: 1000px; height: 600px;</span>\"<span>&gt;</span><span>&lt;/</span><span>div</span><span>&gt;</span></pre></div>\n<p></p><h2>Map options</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#map-options\"></a><p></p>\n<p>Map configuration options used by <code>render</code> and <code>tile</code> commands:</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><span><code>--scheme</code></span> <code>&lt;id&gt; or &lt;path&gt;</code></td>\n<td>scheme identifier (look for <code>&lt;id&gt;.yml</code> file) or path to a YAML scheme file, default value: <code>default</code></td>\n</tr>\n<tr>\n<td><span><code>--buildings</code></span> <code>&lt;mode&gt;</code></td>\n<td>building drawing mode: no, flat, isometric, isometric-no-parts, default value: <code>flat</code></td>\n</tr>\n<tr>\n<td><span><code>--mode</code></span> <code>&lt;string&gt;</code></td>\n<td>map drawing mode: normal, author, time, white, black, default value: <code>normal</code></td>\n</tr>\n<tr>\n<td><span><code>--overlap</code></span> <code>&lt;integer&gt;</code></td>\n<td>how many pixels should be left around icons and text, default value: 12</td>\n</tr>\n<tr>\n<td><span><code>--labels</code></span> <code>&lt;string&gt;</code></td>\n<td>label drawing mode: no, main, all, address, default value: <code>main</code></td>\n</tr>\n<tr>\n<td><span><code>--level</code></span></td>\n<td>display only this floor level, default value: <code>overground</code></td>\n</tr>\n<tr>\n<td><span><code>--seed</code></span> <code>&lt;string&gt;</code></td>\n<td>seed for random</td>\n</tr>\n<tr>\n<td><span><code>--tooltips</code></span></td>\n<td>add tooltips with tags for icons in SVG files</td>\n</tr>\n<tr>\n<td><span><code>--country</code></span></td>\n<td>two-letter code (ISO 3166-1 alpha-2) of country, that should be used for location restrictions, default value: <code>world</code></td>\n</tr>\n<tr>\n<td><span><code>--ignore-level-matching</code></span></td>\n<td>draw all map features ignoring the current level</td>\n</tr>\n<tr>\n<td><span><code>--roofs</code></span></td>\n<td>draw building roofs, set by default</td>\n</tr>\n<tr>\n<td><span><code>--building-colors</code></span></td>\n<td>paint walls (if isometric mode is enabled) and roofs with specified colors</td>\n</tr>\n<tr>\n<td><span><code>--show-overlapped</code></span></td>\n<td>show hidden nodes with a dot</td>\n</tr>\n</tbody>\n</table>\n<p></p><h2>MapCSS 0.2 generation</h2><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#mapcss-02-generation\"></a><p></p>\n<p>The <code>mapcss</code> command can be used to generate a MapCSS scheme. <code>map-machine mapcss</code> will create an <code>out/map_machine_mapcss</code> directory with simple MapCSS 0.2 scheme adding icons from the Röntgen icon set to nodes and areas: <code>.mapcss</code> file and directory with icons.</p>\n<p>To create a MapCSS style with Map Machine style also for ways and relations, run <code>map-machine mapcss --ways</code>.</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><span><code>--icons</code></span></td>\n<td>add icons for nodes and areas, set by default</td>\n</tr>\n<tr>\n<td><span><code>--ways</code></span></td>\n<td>add style for ways and relations</td>\n</tr>\n<tr>\n<td><span><code>--lifecycle</code></span></td>\n<td>add icons for lifecycle tags; be careful: this will increase the number of node and area selectors by 9 times, set by default</td>\n</tr>\n</tbody>\n</table>\n<p></p><h3>Use Röntgen as JOSM map paint style</h3><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#use-r%C3%B6ntgen-as-josm-map-paint-style\"></a><p></p>\n<ul>\n<li>Run <code>map-machine mapcss</code>.</li>\n<li>Open <a target=\"_blank\" href=\"https://josm.openstreetmap.de/\">JOSM</a>.</li>\n<li>Go to Preferences → Third tab on the left → Map Paint Styles.</li>\n<li>Active styles: press +.</li>\n<li>URL / File: set path to <code>out/map_machine_mapcss/map_machine.mapcss</code>.</li>\n</ul>\n<p>To enable/disable the Map Machine map paint style go to View → Map Paint Styles → Map Machine.</p>\n<p></p><h4>Example</h4><a target=\"_blank\" href=\"https://github.com/enzet/map-machine#example-7\"></a><p></p>\n<p><a target=\"_blank\" href=\"https://github.com/enzet/map-machine/blob/main/doc/josm.png\"><img src=\"https://github.com/enzet/map-machine/raw/main/doc/josm.png\" alt=\"JOSM example\" /></a></p>\n<p>Example of using Röntgen icons on top of the Mapnik style in JOSM. Map Paint Styles look like this:</p>\n<ul>\n<li>✓ Mapnik (true)</li>\n<li>✓ Map Machine</li>\n</ul>\n</article></div>",
"author": "",
"favicon": "https://github.githubassets.com/favicons/favicon.svg",
"source": "github.com",
"published": "",
"ttr": 389,
"type": "object"
}