1
Mapnik Eine Werkzeugsammlung für die Ableitung
von Webkarten aus GIS-Daten
Peter Kunz
Bundesamt für Kartographie und Geodäsie
2
Workshop
Erste Schritte mit Mapnik
OSM-Daten vorbereiten
Postgis-DB erzeugen
OSM-Daten in Postgis-DB importieren und für das Rendern
mit Mapnik vorbereiten
Mit GDAL Schummerung und Höhenlinien berechnen
OSM-Karte rendern
Lokales Kachelarchiv rendern
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
3
Mapnik
Bibliothek für das Rendern von Karten
Bekannteste Anwendung:
Hauptkarte (Slippy Map) von Open Street Map (OSM)
Freie Software (Open Source)
Anwendung
− Web-Server = Rendern bei Request
− Desktop = Vorprozessieren von Kacheln
C++ und Python API
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
4
Wozu Mapnik?
Nur bedingt geeignet für die Herstellung
herkömmlicher Einzelkarten für den Druck
Hervorragend geeignet für das
Rendern von Kacheln für einen WMTS
5
WMTS mit Kacheln 256 x 256 Pixel
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
256 Pixel
25
6 P
ixe
l
6
Warum gerade Mapnik?
Plattformen PC, Mac, Unix/Linux
Konzept Saubere Trennung von
» Programmierlogik,
» Datenhaltung und
» Kartenaufbau/-gestaltung
Ergebnisse Sehr gute grafische Qualität
Robust Erprobt bei Massendaten
Schnell BRD ca. 14 Tage alle Zoomstufen
Skalierbar Rendern kann auf mehrere Prozesse/
Rechner verteilt werden
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
7
Mapnik Datenformate Ein- und Ausgabe
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Ausgabe
AGG-Renderer
PNG 8, 24 und 32 bit/Pixel
JPEG 24 bit/Pixel
TIFF
Cairo-Renderer
SVG
PS
Datenquellen
PostGIS-Datenbanken
ESRI Shapefiles
TIFF Rasterdaten
OSM XML
alle OGR-Vektorformate !!
alle GDAL-Rasterformate !!
8
MAPNIK
Mapnik erzeugt Karten
Postgis
DB1
Postgis
DB2
Shapedatei
Ausgangsdaten Zieldaten
Einzelne Karte
Kachelarchiv Programmierschnittstelle
C++
Python
MAPNIK
Rasterdaten
9
Die wichtigsten Mapnik-Objekte
Map Die Karte
Layer Ein Karte/Map enthält mehrere Layer. Dort wird die
Datenherkunft beschrieben
Style Ein Layer verweist auf die jeweilige Kartengestaltung
Rule Jedes Styleelement enthält mehrere Regeln
Filter Eine Regel gilt ggf. nur für bestimmte Objekte
Scaledenominatoren Jeder Regel gilt nur für einen oder für
mehrere Maßstäbe
Symbolizern In den Regeln werden die eigentlichen
Zeichenanweisungen mithilfe von Symbolizern beschrieben
10
Definition des Kartenaufbaus
im Pythonskript
Pythonskript
Hier erfolgt Festlegung
- der Datenquellen
- des Kartenaufbaus
- der Grafikstile / Kartengestaltung und
- der Programmierlogik für die Erzeugung der Tiles
Daten Programmlogik UND Gestaltung
Rein programmatisch in C++ bzw. Python
11
Reiner Python-Code
für das Rednern einer Karte
# -*- coding: latin-1 -*-
# Import der Mapnik Python bindings
import mapnik2 as mapnik
# Karten-Objekt anlegen
m = mapnik.Map(900,450)
m.background = mapnik.Color('steelblue')
# Style erzeugen
s = mapnik.Style()
# Rule erzeugen
r = mapnik.Rule()
polygon_symbolizer = mapnik.PolygonSymbolizer(mapnik.Color(r=255,g=231,b=88))
r.symbols.append(polygon_symbolizer) # Symbolizer dem Rule-Objekt hinzufügen
line_symbolizer = mapnik.LineSymbolizer(mapnik.Color('rgb(50%,50%,50%)'),0.1)
r.symbols.append(line_symbolizer) # Symbolizer dem Rule-Objekt hinzufügen
s.rules.append(r) # Rule dem Style hinzufügen
m.append_style('My Style',s) # Style der Map hinzufügen
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
12
Reiner Python-Code
für das Rednern einer Karte
# Layer erzeugen
layer = mapnik.Layer('world')
# Datenquelle
ds = mapnik.Shapefile(file='ne_110m_admin_0_countries.shp')
# dem Layer die Datenquelle hinzufügen
layer.datasource = ds
# Style anwenden auf Layer
layer.styles.append('My Style')
# Layer der Karte hinzufügen
m.layers.append(layer)
# Zoom auf die BBox des Layers
m.zoom_all()
# Karte rendern
mapnik.render_to_file(m,'world.png', 'png')
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Ü5
13
Definition des Kartenaufbaus
in einem Mapfile
Pythonskript
zum Rendern der Karte
Mapfile mit
- Datenquellen
- Kartenaufbau
- Kartengestaltung
- ggf. Verweis auf weitere
ausgelagerte Dokumente
Daten Programmlogik Gestaltung
z.B. generate_image,py z.B. osm.xml und alle *.inc
14
Pythonskripte zum Starten des
eigentlichen Renderns
generate_image.py
erzeugt ein einzelnes Bild
entsprechend der
Kartendefinition (Stylesheet)
und des gewünschten
räumlichen Ausschnitts
(Bounding Box)
generate_tiles.py
ist vergleichbar, erzeugt aber
ein Kachelarchiv für den
Webserver in den
gewünschten Zoomstufen
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
15
Pythonskript mit Verweis auf Mapfile
import mapnik2
m = mapnik2.Map(1000,1000)
kartenaufbau = '/usr/local/share/mapnik/karte.xml'
mapnik2.load_map(m, kartenaufbau)
bbox=mapnik2.Box2d(620512, 5786283, 626050, 5791821)
m.zoom_to_box(bbox)
mapnik2.render_to_file(m,'/home/user/GIS/Uebung_01/karte.png')
Mapfile Meine_Karte.XML
<?xml version="1.0" encoding="utf-
8"?>
<!DOCTYPE Map [
<!ENTITY % entities SYSTEM
"inc/entities.xml.inc">
%entities;
]>
<Map
bgcolor="&farbe_hintergrund;"
srs="+proj=utm +zone=32 +ellps=WGS84
+datum=WGS84 +units=m +no_defs"
minimum_version="0.7.1">
&fontset-settings;
<!-- *********************** -->
&layer-landbedeckung;
&layer-hoehenlinien;
&layer-schummerung;
&layer-gewaesser;
&landuse-overlay;
&layer-water_features;
&layer-tunnel;
&layer-buildings;
&layer-highway-area-casing;
&layer-strassen-kontur;
&layer-strassen-fuellung;
&landuse-overlay-nsg;
&layer-ferry-routes;
&layer-aerialways;
&layer-roads;
&layer-bridges;
&layer-admin;
&layer-power;
&layer-placenames;
&layer-amenity-stations;
&layer-amenity-symbols;
&layer-amenity-points;
&highway-junctions;
&layer-river-text;
&layer-roads-text;
&layer-text;
&layer-hl-zahlen;
</Map>
Layer in der
Reihenfolge der
Darstellung
Verweis auf Entitäten
Verweis auf Fonts
Hintergrundfarbe und CRS der Karte
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Landbedeckung
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Landbedeckung
Gewässer
Höhenlinien
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Landbedeckung
Gewässer
Höhenlinien
Gebäude
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Landbedeckung
Gewässer
Höhenlinien
Gebäude
Straßenkonturen
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Landbedeckung
Gewässer
Höhenlinien
Gebäude
Straßenkonturen
Straßendecker
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Landbedeckung
Gewässer
Höhenlinien
Gebäude
Straßenkonturen
Straßendecker
Schrift
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Landbedeckung
Gewässer
Höhenlinien
Gebäude
Straßenkonturen
Straßendecker
Schrift
Schummerung
<Layer name="buildings" status="on" srs="&osm2pgsql_projection;">
<StyleName>buildings</StyleName>
<Datasource>
<Parameter name="type">PostGIS</Parameter>
<Parameter name="host">141.74.243.77</Parameter>
<Parameter name="dbname">hausumringe3</Parameter>
<Parameter name="user">postgres</Parameter>
<Parameter name="password">kennwort</Parameter>
<Parameter name="table">hu_brd</Parameter>
<Parameter
name="extent">1092780,5985032,1129239,6021567</Parameter>
</Datasource>
</Layer>
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Extent der Kachel in der
Projektion der DB
Layername Referenzierter Stil
Datenquelle
Layer
Woher kommen die Daten?
In welchem SRS liegt Datenquelle vor?
Welche Objekte sollen ausgewählt / dargestellt werden?
Welcher Stil soll für die Darstellung verwendet werden?
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und
Geodäsie
TextSymbolizer
ShieldSymbolizer
PolygonPatternSymbolizer
LineSymbolizer
PointSymbolizer RasterSymbolizer
PolygonSymbolizer LinePatternSymbolizer
<Style name=„Siedlung“>
<Rule>
&maxscale_zoom11;
&minscale_zoom12;
<PolygonSymbolizer>
<CssParameter name="fill">&farbe_haus12;</CssParameter>
<CssParameter name="gamma">0.7</CssParameter>
</PolygonSymbolizer>
<LineSymbolizer>
<CssParameter name="stroke">&farbe_haus12;</CssParameter>
<CssParameter name="stroke-width">0.2</CssParameter>
</LineSymbolizer>
</Rule>
</Style>
Style
Wie sollen die Objekte dargestellt werden?
In welchen Zoomstufen / Maßstabsbereichen wird ein Objekt dargestellt?
Einschränkung der Objektauswahl durch Filter
Welcher Symbolizer wird für das Zeichnen verwendet?
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Darstellung nur in Zoomstufen 8 bis 12
Polygonfüllung
Kontur des Polygons
ShieldSymbolizer und PolygonPatternSymbolizer
<Rule>
<Filter>[landuse] = 'hopfen'</Filter>
&maxscale_zoom8;
&maxscale_zoom12;
<PolygonPatternSymbolizer file="&symbols;/SK25_41510kl3.png" />
</Rule>
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Symbol für Füllung
Bild für ShieldSymbolizer
<Rule>
<Filter>[highway] = 'BAB' and [length] = 3</Filter>
&maxscale_zoom15;
&minscale_zoom15;
<ShieldSymbolizer fontset-name="bold-fonts" size="20"
fill="&farbe_bab_nummer;" placement="line"
file="&symbols;/bab_shield3.png" minimum-distance="120"
spacing="800">[ref]</ShieldSymbolizer>
</Rule>
106 4
106
28
Koordinatenreferenzsysteme
Falls in Pythonskript keine Angabe gilt SRS des Mapfile <Map background-color="#b5d0d0" srs="+init=epsg:4326" minimum-
version="2.0.0">
SRS des Mapfile kann in Pythonskript überschrieben werden m.srs = „+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m
+no_defs“
Jeder Layer muss auch mit den Angaben des SRS der Datenquelle ausgestattet werden
<Layer name="roads-text-name" status="on"
srs="&osm2pgsql_projection;">
<StyleName>roads-text-name</StyleName>
<Datasource>
<Parameter name="table">&prefix;_line</Parameter>
&datasource-settings;
</Datasource>
</Layer>
29
Entities (sg. Enitity) deutsch Einheiten, Gebilde, um wiederkehrende
Informationseinheiten zu standardisieren
Wiederholungen im Mapfile
− Datenquellen
− Verzeichnisse für die Symbole/Icons
− Farbdefinitionen
− Maßstabsbereiche
− Koordinatenreferenzsysteme
Entities vergleichbar mit Variablen/Konstanten
Mapfile kann in mehrere handliche Dokumente unterteilt
werden.
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
30
Verweis auf eine Entität
<!ENTITY % entities SYSTEM "inc/entities.xml.inc">
%entities;
<!ENTITY % settings SYSTEM "settings.xml.inc">
%settings;
<!ENTITY datasource-settings SYSTEM "datasource-settings.xml.inc">
&datasource-settings;
<!ENTITY fontset-settings SYSTEM "fontset-settings.xml.inc">
&fontset-settings;
<!ENTITY srs900913 "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0
+lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null
+no_defs +over">
&srs900913;
<!ENTITY % layers SYSTEM "layers.xml.inc">
%layers;
<!ENTITY % color-settings SYSTEM "farben.xml.inc">
%farben;
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
31
Anwendung von Entities z.B. Maßstabsbereiche und Farben
<Style name="minor-roads-fill">
<Rule>
<Filter>[highway] = 'motorway' and not [tunnel] = 'yes'</Filter>
&maxscale_zoom10;
&minscale_zoom10;
<LineSymbolizer stroke="&farbe_motorway_fuell;" stroke-width="9.5" stroke-
linejoin="round"/>
</Rule>
<Rule>
<Filter>[highway] = 'primary' and not [tunnel] = 'yes'</Filter>
&maxscale_zoom10;
&minscale_zoom10;
<LineSymbolizer stroke="&farbe_primary_fuell;" stroke-width="4.18" stroke-
linejoin="round" stroke-linecap="round"/>
</Rule>
<Rule>
<Filter>[highway] = 'secondary' and not [tunnel] = 'yes'</Filter>
&maxscale_zoom10;
&minscale_zoom10;
<LineSymbolizer stroke="&farbe_secondary_fuell" stroke-width="4.18" stroke-
linejoin="round" stroke-linecap="round"/>
</Rule>
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
32
Anwendung von Entities
z.B. Verzeichnisse, Datenquellen, SRS
<Style name="points">
<Rule>
&maxscale_zoom12;
&minscale_zoom15;
<Filter>[man_made]='schloss' or [man_made]='burg'</Filter>
<PointSymbolizer file="&symbols;/SK10_23800kl.png" allow_overlap="false"
opacity="0.8"/>
</Rule>
<Rule>
&maxscale_zoom16;
<Filter>[man_made]='schloss' or [man_made]='burg'</Filter>
<PointSymbolizer file="&symbols;/SK10_23800.png" allow_overlap="false"/>
</Rule>
</Style>
<Layer name="amenity-points" status="on" srs="&osm2pgsql_projection;">
<StyleName>points</StyleName>
<Datasource>
<Parameter name="table">
(select way,"natural“ man_made from &prefix;_point
where man_made is not null or "natural" in
('hoehleneingang','nadelbaum','laubbaum','felsblock')) as points</Parameter>
&datasource-settings;
</Datasource>
</Layer>
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
33
datasource-settings.xml.inc Wichtigste, häufig verwendete Datenquelle
<Parameter name="type">postgis</Parameter>
<Parameter name="password">xxxyyyzzz</Parameter>
<Parameter name="host">141.74.243.234</Parameter>
<Parameter name="port">5432</Parameter>
<Parameter name="user">username</Parameter>
<Parameter name="dbname">bdlm_osm</Parameter>
<Parameter name="multiple_geometries">true</Parameter>
<Parameter name="estimate_extent">false</Parameter>
<Parameter
name="extent">1192991,6835611,1213423,6856068</Parameter>
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
34
layers.xml.inc
<!ENTITY layer-shapefiles SYSTEM "layer-shapefiles.xml.inc">
<!ENTITY layer-landcover SYSTEM "layer-landcover.xml.inc">
<!ENTITY layer-water SYSTEM "layer-water.xml.inc">
<!ENTITY layer-water_features SYSTEM "layer-water_features.xml.inc">
<!ENTITY layer-buildings SYSTEM "layer-buildings.xml.inc">
<!ENTITY layer-ferry-routes SYSTEM "layer-ferry-routes.xml.inc">
<!ENTITY layer-aerialways SYSTEM "layer-aerialways.xml.inc">
<!ENTITY layer-placenames SYSTEM "layer-placenames.xml.inc">
<!ENTITY layer-amenity-stations SYSTEM "layer-amenity-stations.xml.inc">
<!ENTITY layer-amenity-symbols SYSTEM "layer-amenity-symbols.xml.inc">
<!ENTITY layer-amenity-points SYSTEM "layer-amenity-points.xml.inc">
<!ENTITY layer-power SYSTEM "layer-power.xml.inc">
<!ENTITY layer-admin SYSTEM "layer-admin.xml.inc">
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Mapnik: Ableitung von Topographischen Webkarten aus amtlichen Geobasisdaten 14.05.2013
36
Höhenlinien und Schummerung mit
GDAL - Geospatial Data Abstraction Library http://www.gdal.org/
Informationen
gdalinfo dgm10_geo.tif
Umprojektion von geogr. nach UTM32
gdalwarp -t_srs "+proj=utm +zone=32 +datum=WGS84" -r cubic
dgm10_geo.tif dgm10_utm32.tif
Höhenlinien erzeugen
gdal_contour -a hoehe dgm10_utm32.tif hl_utm32_10m.shp -i 20
Schummerung
gdaldem hillshade dgm10_utm32.tif hillshade.tif -z 3
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
37
Rasterlayer
hier Schummerung
<Style name="hillshadestyle2">
<Rule>
<RasterSymbolizer>
<CssParameter name="scaling">fast</CssParameter>
<CssParameter name="opacity">0.8</CssParameter>
<CssParameter name="mode">multiply</CssParameter>
</RasterSymbolizer>
</Rule>
</Style>
<Layer name="schummerung" status="on">
<StyleName>hillshadestyle2</StyleName>
<Datasource>
<Parameter name="type">raster</Parameter>
<Parameter name="file">&rasterdaten;/schummerung.tif</Parameter>
<Parameter name="format">tiff</Parameter>
<Parameter name="lox">582192</Parameter>
<Parameter name="loy">5235730</Parameter>
<Parameter name="hix">598576</Parameter>
<Parameter name="hiy">5238976</Parameter>
</Datasource>
</Layer>
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Datenquelle
Referenzierter Stil
Rastersymbolizer mit
Parametern
38
Rasterlayer
Verweis auf georeferenzierte
Rasterdaten vom Typ GDAL
<Style name="hillshadestyle">
<Rule>
<RasterSymbolizer>
<CssParameter name="scaling">fast</CssParameter>
<CssParameter name="opacity">0.8</CssParameter>
<CssParameter name="mode">multiply</CssParameter>
</RasterSymbolizer>
</Rule>
</Style>
<Layer name="GDAL Layer from TIFF file">
<StyleName>schummerung2</StyleName>
<Datasource>
<Parameter name="type">gdal</Parameter>
<Parameter
name="file">/home/user/GIS/dgm10/hillshade.tif</Parameter>
</Datasource>
</Layer>
39
Problem entsteht vermehrt beim Rendern kleiner Kacheln
256 x 256 Pixel
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Ham
Fehlende Beschriftung
in benachbarten Kacheln
Flens
leswig
40 Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Hamburg
512 px
buffer_size = 512 Pixel
Größerer Extent je nach Zoomstufe
512 px * Auflösung in Meter/Pixel
Lösung 1:
Berücksichtigung eines größeren Extents beim Rendern
Fehlende Beschriftung
in benachbarten Kacheln
41 Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Hamburg
2560 Pixel
25
60
Pix
el
Lösung 2:
Rendern von großen Kacheln 2560 x 2560 Pixel
Nachträgliches Unterteilen in 100 kleine Kacheln 256 x 256 px
Fehlende Beschriftung
in benachbarten Kacheln
Ratze
42
Datenmengen
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
Datenquelle PostGIS und
DGM
Basis-DLM 15 GB
DLM250 1 GB
Höhenlinien 15 GB
Hausumringe (48,4 Mio.) 12 GB
Hauskoordinaten (ca. 22,3
Mio)
3 GB
DGM10 20 GB Kachelarchive
Volltonvariante 300 GB
Schummerungsvariante 500 GB
Graustufen 300 GB
Halbton 300 GB
Summe 1,4 TB
Mapnik Workshop, Peter Kunz, Bundesamt für Kartographie und Geodäsie
BRD und Luxemburg – Basis-DLM und OSM
44
Derivation of a Multiscale Topographic Web Map Tile Service based on Federal Datasets
Peter Kunz
45
Links
Mapnik
http://mapnik.org/
Mapnik Mailing list
http://mapnik.org/contact/
Repositories auf Github
https://github.com/mapnik
OpenStreetMap-Wiki
http://wiki.openstreetmap.org/wiki/Mapnik
OpenStreetMap Subversion-Repository
http://svn.openstreetmap.org/applications/rendering/mapnik/
GDAL
http://www.gdal.org/