class: center middle title # Mapnik oder MapServer ## … wer macht die schönsten Karten? --- # Über mich ### Oliver Tonnhofer * Omniscale GmbH & Co. KG, Oldenburg * Open Source Entwicklung (Client/Server) * MapProxy und Imposm Entwicklung und Support --- class: title middle # Mapnik # MapServer --- class: no-cover bg-img background-image: url(imgs/osm.omniscale.de.png) # Eigene Kartendienste ## OpenStreetMap - seit 2009 - Kunden - Breitbandatlas - Netzbetreiber - Energieversorger - … - maps.omniscale.com - 100% Mapnik .disclaimer[© Kartendaten: OpenStreetMap (ODbL)] --- class: no-cover bg-img background-image: url(imgs/orka-mv.png) # Kunden Kartendienste ## OSM und amtliche Daten - Dienstleistung und Software-Entwicklung - u.A. Offene Regionalkarte MVP - ~90% MapServer .disclaimer[© Hansestadt Rostock (CC BY 3.0); Kartendaten: OpenStreetMap (ODbL) und uVGB-MV] --- class: center, middle # Was machen Mapnik und MapServer? --- class: center
Aus ``` LINESTRING(0 0, 10 10, 50 10) ``` wird
--- class: center
Aus ``` POLYGON((0 0, 10 0, 10 10, 0 10, 0 0)) ``` wird
--- class: center, middle # Aus Geodaten werden Karten --- class: center, middle class: bg-img background-image: url(imgs/map-hamburg.png) .disclaimer[© Kartendaten: OpenStreetMap (ODbL)] ??? http://localhost:7070/mapnik?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=false&LAYERS=osm&mml=omni-live.mml&mss=palette.mss%2Cbase.mss%2Croads.mss%2Clabels.mss&MAP.RESOLUTION=144&SRS=EPSG%3A3857&STYLES=&WIDTH=1109&HEIGHT=778&BBOX=1110011.200816069%2C7083813.949249047%2C1115309.242339085%2C7087530.699749413 --- # Gemeinsamkeiten ||MapServer|Mapnik| |-|:-:|:-:| |Aus Geodaten werden Karten| ✔ | ✔ | --- # Gemeinsamkeiten ||MapServer|Mapnik| |-|:-:|:-:| |Aus Geodaten werden Karten| ✔ | ✔ | |OpenSource| ✔ | ✔ | || MIT | LGPL | |Etablierte Projekte| ✔ | ✔ | || 1994 | 2005 | ??? 10, 20 Jahre, viele Entwickler --- # Unterschiede? ||MapServer|Mapnik| |-|:-:|:-:| |Sprache| C | C++ | |Dokumentation| HTML/PDF | Wiki | || auch Deutsch | | || umfangreich | ausreichend | |Einsatzgebiete| ? | ? | ??? MapServer: GDI, Behörden Mapnik: OSM --- # Aus *Geodaten* werden Karten ### Datenquellen ||MapServer|Mapnik| |-|:-:|:-:| |PostGIS|✔|✔| |Shapefiles|✔|✔| |(Geo)TIFF|✔|✔| |GeoJSON|✔|✔| --- # Aus Geodaten werden *Karten* ### Ausgabeformate ||MapServer|Mapnik| |-|:-:|:-:| |PNG (8/24bit)|✔|✔| |JPEG|✔|✔| |EPS|✔|✔| |SVG|✔|✔| --- class: huge # Wo sind die Unterschiede? --- class: huge # Wie erstelle ich Karten? --- class: middle # MapServer.org .quote[ Map**Server** is a … **platform**
for publishing spatial data …
to the **web**. ] # Mapnik.org .quote[ Mapnik a free **toolkit**
for developing mapping applications. ] --- # MapServer - Karten**server** - CGI/FastCGI Anwendung - Direkte Unterstützung von WMS --- # Mapnik - **Programbibliothek** - C++/Python API - Kein Server - Keine Unterstützung von WMS --- # Mapnik .center[Karten*renderer* kein Karten*server!*] ```python m = mapnik.Map(1600, 800) mapnik.load_map(m, 'map.xml') m.zoom_to_box(mapnik.Box2d(-180, -90, 180, 90)) mapnik.render_to_file(m, 'map.png') ``` --- # Mapnik Server - [OGCServer](https://github.com/mapnik/OGCServer) - [MapProxy](http://mapproxy.org) - [Paleoserver](https://github.com/springmeyer/paleoserver) - [renderd/mod_tile](https://github.com/openstreetmap/mod_tile/) - [tirex](http://wiki.openstreetmap.org/wiki/Tirex) - [landspeed.js](https://github.com/mapbox/landspeed.js/) - … --- # MapServer WMS Karten*server* .fixed[ http://localhost/ **cgi-bin/mapserv** ?SERVICE=WMS&VERSION=1.1.1
&REQUEST=GetMap&FORMAT=image/png
&LAYERS=osm
&**MAP=/path/to/mapfile.map**
&**WIDTH=1600**&**HEIGHT=800**
&**BBOX=-180,-90,180,90**&SRS=EPSG:4326 ] --- class: huge # Kartenstyling ??? Wie werden aus Geodaten Karten? --- # MapServer ### Mapfiles ``` LAYER NAME world STATUS ON TYPE POLYGON DATA "/path/to/processed_p_3000" CLASS # Zoom{<=5} MINSCALEDENOM 12500000 STYLE COLOR "#e8e6e0" END END END ``` --- # Mapnik ### XML ``` <Layer name="world" srs="+init=epsg:4326"> <StyleName>world</StyleName> <Datasource> <Parameter name="file">/path/to/processed_p_3000.shp</Parameter> <Parameter name="type">shape</Parameter> </Datasource> </Layer> <Style name="world" filter-mode="first"> <Rule> <!--Zoom{<=5}--> <MinScaleDenominator>12500000</MinScaleDenominator> <PolygonSymbolizer fill="#e8e6e0" /> </Rule> </Style> ``` --- # Mapnik ### CartoCSS ``` @land: #e8e6e0; #world[zoom<=5] { polygon-fill: @land; } ``` --- class: center # Mapnik ### TileMill
--- # Mapnik ## Python API ```python r = mapnik.Rule() r.filter = mapnik.Expression("[type] = 'road'") stroke = mapnik.Stroke(mapnik.Color('#a00'), 2) line_symbolizer = mapnik.LineSymbolizer(stroke) r.symbols.append(line_symbolizer) ``` --- # MapServer ## MapScript ```python c = mapscript.classObj() c.setExpression("('[type]' eq 'roads')") sty = mapscript.styleObj() sty.width = 2 sty.color = mapscript.colorObj(100, 0, 0) c.insertStyle(sty) ``` --- class: bg-img background-image: url(imgs/hamburg2-mk.png) -- # Mapnik --- class: bg-img background-image: url(imgs/hamburg2-ms6.png) # MapServer --- class: bg-img huge background-image: url(imgs/hamburg2-ms6.png) # Mapnik oder MapServer ## … wer macht die schönsten Karten? --- # *Zoom* .center[
] --- # *Zoom* *Zoom* .center[
] --- # Kerning/Unterschneidung
??? http://commons.wikimedia.org/wiki/File:Kerning_EN.svg http://upload.wikimedia.org/wikipedia/commons/d/da/Kerning_EN.svg --- class: center ### Mapnik
### MapServer
--- class: bg-img huge background-image: url(imgs/hamburg2-ms6.png) --- class: huge # Mapnik macht die schöneren Karten? --- class: center ### MapServer 6
### MapServer 7
--- class: bg-img background-image: url(imgs/hamburg-mid-mk.png) --- class: bg-img background-image: url(imgs/hamburg-mid-ms7.png) --- class: huge # Druck # Retina/HighDPI --- class: bg-img background-image: url(imgs/hidpi3-ms7.png) --- class: bg-img background-image: url(imgs/hidpi3-mk.png) --- # Skalierung ||MapServer|Mapnik| |-|:-:|:-:| |DPI|✔|| |Scale Factor||✔| ??? http://localhost:7071/mapnik?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=false&LAYERS=osm&mml=omni-live.mml&mss=palette.mss%2Cbase.mss%2Croads.mss%2Clabels.mss&MAP.RESOLUTION=216&SRS=EPSG%3A3857&STYLES=&WIDTH=1413&HEIGHT=1018&BBOX=1114567.4755134413%2C7089794.840176304%2C1115411.2686459955%2C7090402.753416884 http://localhost:7071/mapserver-dev?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=false&LAYERS=map&mml=omni-live.mml&mss=palette.mss%2Cbase.mss%2Croads.mss%2Clabels.mss&SRS=EPSG%3A3857&STYLES=&WIDTH=1648&HEIGHT=1191&BBOX=1115057.982779729%2C7086639.771501675%2C1122930.996693102%2C7092329.552794654 --- class: bg-img background-image: url(imgs/linespacing-ms7.png) --- class: bg-img background-image: url(imgs/linespacing-mk.png) ??? http://localhost:7070/mapserver-dev?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=false&LAYERS=map&mml=omni-live.mml&mss=palette.mss%2Cbase.mss%2Croads.mss%2Clabels.mss&MAP.RESOLUTION=216&SRS=EPSG%3A3857&STYLES=&WIDTH=1413&HEIGHT=1018&BBOX=1114790.0442501197%2C7086905.4490230335%2C1115633.837382674%2C7087513.362263613 -- ## Mapnik - `character-spacing="2"` - `line-spacing="6"` - `text-transform="uppercase"` --- class: bg-img background-image: url(imgs/halo-ms7.png) # MapServer ## Halo pro Label --- class: bg-img background-image: url(imgs/halo-mk.png) # Mapnik ## Halo pro Zeichen --- class: center # MapServer ## Label Leaders
.disclaimer[© Mapserver Dokumentation] --- class: center # MapServer ## Dynamische Symbole
.disclaimer[© Mapserver Dokumentation] ??? Heatmap http://mapserver.org/development/rfc/ms-rfc-108.html https://www.mapbox.com/blog/colorize-alpha-image-filter/ --- # Compositing .center[
]
.disclaimer[© Mapnik Projekt: Testdateien] -- .center[
] ??? https://github.com/mapnik/mapnik/wiki/Compositing http://mapserver.org/development/rfc/ms-rfc-113.html#rfc113 --- # Wer macht die schönsten Karten? - Mapnik -- - MapServer 7 - Beta bereits veröffentlicht. --- class: huge # Mapnik oder MapServer ## … wer ist schneller? --- # Geschwindigkeit ### FOSS4G WMS Shootout 2011
??? keine großen unterschiede, großer abstand zu anderen servern --- class: huge # Mapnik oder MapServer ## … wer ist flexibler für Anwendungsentwickler? --- class: huge # Dynamische Anwendungen --- # Mapnik Python API ```python mapnik.load_map(m, 'map.xml') f = mapnik.Feature(mapnik.Context(), 1) f.add_geometries_from_wkt('POINT ( 51.963446 7.613375 )') ds = mapnik.MemoryDatasource() ds.add_feature(f) lyr = mapnik.Layer('Layer', '+init=epsg:4326') lyr.datasource = ds m.layers.append(lyrs) ``` --- # MapServer ``` MapScript API *meh* ``` -- - MapServer unterstützt OGR - OGR unterstützt GeoJSON - GeoJSON Treiber von OGR unterstützt HTTP --- # MapServer ## HTTP Datenquelle ``` LAYER CONNECTIONTYPE ogr CONNECTION '"http://localhost/my_features"' … END ``` ??? Daten aus Webanwendung RESTful API --- # MapServer ## [Run-time substitution](http://mapserver.org/cgi/runsub.html) .center[```http://mapserv?map=… **area=10000**```] ``` LAYER VALIDATION "area" "[0-9]+" END CLASS FILTER (area>='%area%') END END ``` --- # MapServer ## [Run-time substitution](http://mapserver.org/cgi/runsub.html) + HTTP Datenquelle ``` LAYER VALIDATION 'bbox' '[-,.0-9]+' 'srs' '(epsg|EPSG):[0-9]+' 'width' '[0-9]+' 'height' '[0-9]+' END CONNECTIONTYPE ogr CONNECTION '"http://localhost/my_features?srs=%srs% &bbox=%bbox%&width=%width%&height=%height%&"' … END ``` --- # Fazit - Bildqualität - Geschwindigkeit - Funktionsumfang - Einsatzgebiet - Flexibilität --- class: huge # Mapnik oder MapServer? --- name: fin class: middle center # Fin ### Vielen Dank! Fragen? Oliver Tonnhofer `
` `@oltonn`