Python renderer for OpenStreetMap with custom icons intended to display as many map features as possible

Overview

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.

Usage example

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

will automatically download OSM data and write output 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 write output 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 Röntgen icon set. It is a set of monochrome 14 × 14 px pixel-aligned icons specially created for Map Machine project. Unlike the Map Machine source code, which is under MIT license, all icons are under CC BY license. So, with the appropriate credit 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 icon grid and sets of individual icons with map-machine icons. It will update doc/grid.svg file, and create SVG files in out/icons_by_id directory where files are named using shape identifiers (e.g. power_tower_portal_2_level.svg) and in 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 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 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.

3D buildings

Road lanes

To determine 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.

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.

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.

Surveillance

Viewpoints

Power tower design

Visualize design values used with power = tower tag.

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 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

Shape combination

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

Masts

For man_made = mast distinguish types (communication, lignting, 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 scorial) 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 .

Map generation

Command render is used to generate 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 write an output SVG map of the specified area to out/esplanade_du_trocadéro.svg.

Arguments

Option Description
-i, --input input XML file name or names (if not specified, file will be downloaded using OpenStreetMap API)
-o, --output output SVG file name, default value: out/map.svg
-b, --boundary-box , , , geo boundary box; if the first value is negative, enclose the value with quotes and use space before -
--cache path for temporary OSM files, default value: cache
-z, --zoom OSM zoom level, default value: 18.0
-c, --coordinates , coordinates of any location inside the tile
-s, --size , 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 , coordinates of any location inside the tile
-t, --tile / / tile specification
--cache path for temporary OSM files, default value: cache
-b, --boundary-box , , , construct the minimum amount of tiles that cover the requested boundary box
-z, --zoom 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 input OSM XML file name (if not specified, the file will be downloaded using OpenStreetMap API)

plus map configuration options

Generate one tile

Specify 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>

Tile will be stored as SVG file out/tiles/tile_ _ _ .svg and PNG file out/tiles/tile_ _ _ .svg , where x and y are tile coordinates. --zoom option will be ignored if it is used with --tile option.

Example:

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

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

Generate a set of tiles

Specify 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. Map with 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_ _ _ .svg and PNG files out/tiles/tile_ _ _ .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

Command server is used to run tile server for slippy maps.

map-machine server

Stop server interrupting the process with Ctrl + C.

Option Description
--cache path for temporary OSM files, default value: cache
--port 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:

map-machine server

Use JavaScript code for Leaflet:

OpenStreetMap ' + 'contributors, imagery © ' + 'Map Machine', id: 'map_machine', tileSize: 256, zoomOffset: 0 }).addTo(map);">
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 © ' +
        'OpenStreetMap ' +
        'contributors, imagery © ' +
        'Map Machine',
    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
--buildings building drawing mode: no, flat, isometric, isometric-no-parts, default value: flat
--mode map drawing mode: normal, author, time, white, black, default value: normal
--overlap how many pixels should be left around icons and text, default value: 12
--labels label drawing mode: no, main, all, address, default value: main
--level display only this floor level, default value: overground
--seed 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

MapCSS 0.2 generation

Command mapcss is used to generate MapCSS scheme. map-machine mapcss will create out/map_machine_mapcss directory with simple MapCSS 0.2 scheme adding icons from Röntgen icon set to nodes and areas: .mapcss file and directory with icons.

To create MapCSS 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 Map Machine 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 Map Machine map paint style go to ViewMap Paint StylesMap Machine.

Example

JOSM example

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

  • ✓ Mapnik (true)
  • ✓ Map Machine
Owner
Sergey Vartanov
Sergey Vartanov
Manage your XYZ Hub or HERE Data Hub spaces from Python.

XYZ Spaces for Python Manage your XYZ Hub or HERE Data Hub spaces and Interactive Map Layer from Python. FEATURED IN: Online Python Machine Learning C

HERE Technologies 30 Oct 18, 2022
Python module and script to interact with the Tractive GPS tracker.

pyTractive GPS Python module and script to interact with the Tractive GPS tracker. Requirements Python 3 geopy folium pandas pillow usage: main.py [-h

Dr. Usman Kayani 3 Nov 16, 2022
Python module to access the OpenCage geocoding API

OpenCage Geocoding Module for Python A Python module to access the OpenCage Geocoder. Build Status / Code Quality / etc Usage Supports Python 3.6 or n

OpenCage GmbH 57 Nov 01, 2022
Asynchronous Client for the worlds fastest in-memory geo-database Tile38

This is an asynchonous Python client for Tile38 that allows for fast and easy interaction with the worlds fastest in-memory geodatabase Tile38.

Ben 53 Dec 29, 2022
iNaturalist observations along hiking trails

This tool reads the route of a hike and generates a table of iNaturalist observations along the trails. It also shows the observations and the route of the hike on a map. Moreover, it saves waypoints

7 Nov 11, 2022
Program that shows all the details of the given IP address. Build with Python and ipinfo.io API

ip-details This is a program that shows all the details of the given IP address. Build with Python and ipinfo.io API Usage To use this program, run th

4 Mar 01, 2022
Python 台灣行政區地圖 (2021)

Python 台灣行政區地圖 (2021) 以 python 讀取政府開放平台的 ShapeFile 地圖資訊。歡迎引用或是協作 另有縣市資訊、村里資訊與各種行政地圖資訊 例如: 直轄市、縣市界線(TWD97經緯度) 鄉鎮市區界線(TWD97經緯度) | 政府資料開放平臺: https://data

WeselyOng 12 Sep 27, 2022
Software for Advanced Spatial Econometrics

GeoDaSpace Software for Advanced Spatial Econometrics GeoDaSpace current version 1.0 (32-bit) Development environment: Mac OSX 10.5.x (32-bit) wxPytho

GeoDa Center 38 Jan 03, 2023
This program analizes films database with adresses, and creates a folium map with closest films to the coordinates

Films-map-project UCU CS lab 1.2, 1st year This program analizes films database with adresses, and creates a folium map with closest films to the coor

Artem Moskovets 1 Feb 09, 2022
ColoringMapAlgorithm-CSP- - Graphical Coloring of Countries with Condition Satisfaction Algorithm

ColoringMapAlgorithm-CSP- Condition Satisfaction Algorithm Output Condition

Kerem TAN 2 Jan 10, 2022
Xarray backend to Copernicus Sentinel-1 satellite data products

xarray-sentinel WARNING: this product is a "technology preview" / pre-Alpha Xarray backend to explore and load Copernicus Sentinel-1 satellite data pr

B-Open 191 Dec 15, 2022
Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.

django-rest-framework-gis Geographic add-ons for Django Rest Framework - Mailing List. Install last stable version from pypi pip install djangorestfra

OpenWISP 981 Jan 03, 2023
Summary statistics of geospatial raster datasets based on vector geometries.

rasterstats rasterstats is a Python module for summarizing geospatial raster datasets based on vector geometries. It includes functions for zonal stat

Matthew Perry 437 Dec 23, 2022
3D extension built off of shapely to make working with geospatial/trajectory data easier in python.

PyGeoShape 3D extension to shapely and pyproj to make working with geospatial/trajectory data easier in python. Getting Started Installation pip The e

Marc Brittain 5 Dec 27, 2022
Solving the Traveling Salesman Problem using Self-Organizing Maps

Solving the Traveling Salesman Problem using Self-Organizing Maps This repository contains an implementation of a Self Organizing Map that can be used

Diego Vicente 3.1k Dec 31, 2022
A modern, geometric typeface by @chrismsimpson (last commit @ 85fa625 Jun 9, 2020 before deletion)

Metropolis A modern, geometric typeface. Influenced by other popular geometric, minimalist sans-serif typefaces of the new millenium. Designed for opt

Darius 183 Dec 25, 2022
Django model field that can hold a geoposition, and corresponding widget

django-geoposition A model field that can hold a geoposition (latitude/longitude), and corresponding admin/form widget. Prerequisites Starting with ve

Philipp Bosch 324 Oct 17, 2022
Rasterio reads and writes geospatial raster datasets

Rasterio Rasterio reads and writes geospatial raster data. Geographic information systems use GeoTIFF and other formats to organize and store gridded,

Mapbox 1.9k Jan 07, 2023
Enable geospatial data mining through Google Earth Engine in Grasshopper 3D, via its most recent Hops component.

AALU_Geo Mining This repository is produced for a masterclass at the Architectural Association Landscape Urbanism programme. Requirements Rhinoceros (

4 Nov 16, 2022
Google maps for Jupyter notebooks

gmaps gmaps is a plugin for including interactive Google maps in the IPython Notebook. Let's plot a heatmap of taxi pickups in San Francisco: import g

Pascal Bugnion 747 Dec 19, 2022