DE:Ajoessen/myMapnik
Vorwort
Hier beschreibe ich meine eigenen Modifikationen am mapnik-Stil und zusätzliche transparente Layer, die mit den Mapnik-Werkzeugen aus einer Postgres/Postgis-Datenbank mit OSM Daten erzeugt werden. Natürlich kann man auch alles in einem Renderprozess vereinigen. Dann müssen die Styles und Layers an osm.xml angefügt werden. Dabei darf aber kein Style- oder Layername doppelt vorkommen. Stildateien und Symbole gibts hier komprimiert.
Für die später beschriebenen Layer werden einige zusätzliche tags ausgewertet. Deshalb wird beim Import mit osm2pgsql der default.style erweitert:
extended.style
# OsmType Tag DataType Flags node,way note text delete # These tags can be long but are useless for rendering node,way source text delete # This indicates that we shouldn't store them node,way access text linear node,way addr:flats text polygon node,way addr:housenumber text linear node,way addr:interpolation text linear node,way admin_level text linear node,way aerialway text linear node,way aeroway text polygon node,way amenity text nocache,polygon node,way area text # hard coded support for area=1/yes => polygon is in osm2pgsql node,way barrier text linear node,way bicycle text nocache node,way bridge text linear node,way boundary text linear node,way building text polygon node capital text linear node,way construction text linear node,way cutting text linear node,way disused text linear node ele text linear node,way embankment text linear node,way foot text linear node,way highway text linear node,way historic text polygon node,way horse text linear node,way junction text linear node,way landuse text polygon node,way layer text linear node,way learning text linear node,way leisure text polygon node,way lock text linear node,way man_made text polygon node,way military text polygon node,way motorcar text linear node,way name text linear node,way natural text polygon # natural=coastline tags are discarded by a hard coded rule in osm2pgsql node,way oneway text linear node,way operator text linear node poi text node,way power text polygon node,way power_source text linear node,way place text linear node,way railway text linear node,way ref text linear node,way religion text nocache node,way residence text linear node,way route text linear node,way service text linear node,way shop text polygon node,way sport text polygon node,way tourism text polygon way tracktype text linear node,way tunnel text linear node,way waterway text polygon node,way width text linear node,way wood text linear node,way z_order int4 linear # This is calculated during import way way_area real # This is calculated during import # If you're interested in bicycle routes, you may want the following fields # To make these work you need slim mode or the necessary data won't be remembered. node,way lcn_ref text linear node,way rcn_ref text linear node,way ncn_ref text linear way lcn text linear way rcn text linear way ncn text linear #way lwn_ref text linear #way rwn_ref text linear #way nwn_ref text linear way lwn text linear way rwn text linear way nwn text linear #way route_pref_color text linear way route_name text linear way network text linear way surface text linear way voltage text linear way line text linear node public_transport text linear node information text linear node bus text linear node tram text linear node hiking text linear
Import-batchdatei nrw2db.bat
D:\Karten\OpenStreetMap\osm2pgsql\osm2pgsql --create --database osmdb --username osmuser --prefix planet -s --cache 3000 -S D:\Karten\OpenStreetMap\osm2pgsql\extended.style --hstore D:\Karten\osm\osmconvert\nrw.osm pause
sowie für die Höhenlinien:
srtm.style
# OsmType Tag DataType Flags node,way note text delete # These tags can be long but are useless for rendering node,way source text delete # This indicates that we shouldn't store them way contour text linear way ele text linear
Import unter Windows XP mit:
%ProgramFiles%\PostgreSQL\9.0\bin\createdb -U postgres -E UTF8 -O osmuser srtmdb %ProgramFiles%\PostgreSQL\9.0\bin\createlang -U postgres plpgsql srtmdb %ProgramFiles%\PostgreSQL\9.0\bin\psql -U postgres -d srtmdb -f "%ProgramFiles%\PostgreSQL\9.0\share\contrib\postgis-1.5\postgis.sql" %ProgramFiles%\PostgreSQL\9.0\bin\psql -U postgres -d srtmdb -f "%ProgramFiles%\PostgreSQL\9.0\share\contrib\postgis-1.5\spatial_ref_sys.sql" %ProgramFiles%\PostgreSQL\9.0\bin\psql -U postgres -d srtmdb -f "%ProgramFiles%\PostgreSQL\9.0\share\contrib\_int.sql" %ProgramFiles%\PostgreSQL\9.0\bin\psql -U postgres -d srtmdb -f "%ProgramFiles%\PostgreSQL\9.0\share\contrib\hstore.sql" osm2pgsql --create --database srtmdb --username osmuser --prefix planet -s --cache 1512 -S D:\Karten\OpenStreetMap\osm2pgsql\srtm.style --hstore D:\Karten\OpenStreetMap\Srtm2Osm\srtm-nrw.osm
Will man nur einen Layer rendern, kann man natürlich auch die Daten mit Osmosis vorfiltern. Damit reduziert sich der import in die Datenbank und die niedrigen Zoomstufen werden wesentlich schneller erzeugt.
Um die komplette Datenbank nicht zu zerstören, wird dafür eine gesonderte datenbank bboxdb befüllt.
Damit mapnik die richtige Datenquelle anzapft, wird die Datei datasource-settings.xml.inc im Verzeichnis inc-de jeweils für osmdb und bboxdb vorgehalten.
Beispielhaft für die Stromleitungen:
call D:\Karten\OpenStreetMap\osmosis\bin\osmosis.bat --read-pbf D:\Karten\osm\Geofabrik\nordrhein-westfalen.osm.pbf --tf accept-ways power=* --tf accept-relations route=power --used-node --write-xml D:\Karten\osm\osmosis\power.osm D:\Karten\OpenStreetMap\osm2pgsql\osm2pgsql --create --database bboxdb --username osmuser --prefix planet --slim --cache 1024 -S D:\Karten\OpenStreetMap\osm2pgsql\extended.style --hstore D:\Karten\osm\osmosis\power.osm cd D:\osm\myMapnik\inc-de copy bbox-datasource-settings.xml.inc datasource-settings.xml.inc cd.. power_tiles-8-13.py power_tiles-14-15.py cd inc-de copy osmdb-datasource-settings.xml.inc datasource-settings.xml.inc cd D:\Tiles\Power for /R .\ %%N IN (*.PNG) DO if %%~zN LSS 1300 del %%N
Basislayer myMapnik
Der Basislayer wird mit einer leicht modifizierten Version des deutschen Mapnik-Stils erzeugt. Da dieser noch nicht in der Version für Mapnik 2 vorliegt, habe ich die Abweichungen am Standardstil nachgetragen
Download Ordner
Datei/SVN Checkout
URL: http://svn.openstreetmap.org/applications/rendering/mapnik
entpacken und den Ordner mapnik umbenennen bzw. verschieben nach D:\osm\myMapnik
von mapnik-Installation das Unterverzeichnis world_boundaries kopieren
Anpassung der inc-Dateien:
generate_xml.bat
generate_xml.py --dbname osmdb --host 'localhost' --user osmuser --port 5432 --password '' --prefix planet --inc inc-de
zusätzlich:
Datei inc-de/layer-admin.xml.inc:
Suchen/Ersetzen...
Suchen nach:&minscale_zoom12;
Ersetzen durch: (nichts)
-> alle löschen, damit Grenzen auch in Zoomstufe 13-17 dargestellt werden
Datei osm.xml anpassen:
<Map bgcolor="#abd0d0" ändern in
<Map bgcolor="#ffffff"
um einen weißen Hintergrund ohne Küstenlinien zu bekommen
&layer-shapefiles; löschen
[landuse]='farmland'
fill #ead8bd ändern in #ffffcc, damit Ackerflächen nur noch blass gelb dargestellt werden
generate_image.py anpassen mit notepad++:
mapfile = "osm.xml"
Koordinaten für Renderbereich auswählen
z.B.
ll = (6.5, 51.3, 6.6, 51.35) #--------------------------------------------------- z = 4 imgx = 500 * z imgy = 500 * z
Doppelklick auf generate_image.py erzeugt image.png
wenn nicht:
Rechtsklick ->Open Command Window here, um Fehlermeldungen lesen zu können
generate_tiles.py anpassen:
NUM_THREADS = 4
ggf anpassen: Wenn man nur einen Prozessor hat, auf 1 setzen
exists = "exists" --> self.render_tile(tile_uri, x, y, z)
(damit auf jeden Fall immer gerendet wird)
home = 'D:/' mapfile = 'osm.xml' tile_dir = 'D:/Tiles/myMapnik/'
minZoom = 8 maxZoom = 13 bbox = (5.87, 50.32,9.45,52.53) render_tiles(bbox, mapfile, tile_dir, minZoom, maxZoom,"NRW")
Den Rest weglöschen
Falls nik2img installiert ist, kann auch folgendes gestestet werden:
C:\Python26\scripts\nik2img.py osm-de.xml Essen.png --srs 900913 --bbox 6.89 51.347 7.14 51.535 --world-file wld --dimensions 1280 800
Damit erhält man ein georeferenziertes png in Bildschirmgröße.
Layer Bahn
osm.xml kopieren nach bahn.xml
Beginn des Map-Objekts umändern in:
<Map srs="&srs900913;" minimum-version="2.0.0" buffer-size="128"> &fontset-settings;
dadurch werden transparente tiles erzeugt.
Bushalte werden ab Zoomstufe 13 mit eigenen Symbolen gerendert. public_transport=stop_position erhält eine Haltetafel nach Bahn-Vorbild, alle anderen das Haltestellensymbol. Die Symbole könne in dieser Datei heruntergeladen werden, die xml und python-Dateien hier.
<Style name="Bushalte"> <Rule> &maxscale_zoom13; &minscale_zoom17; <Filter>[amenity]='bus_station' or [highway]='bus_stop' or [public_transport]='platform'</Filter> <PointSymbolizer file="&symbols;/bus_stop.png" /> </Rule> <Rule> &maxscale_zoom13; &minscale_zoom17; <Filter>[public_transport]='stop_position'</Filter> <PointSymbolizer file="&symbols;/stop_position.png" /> </Rule> </Style>
Für Bahnhöfe und Haltepunkte gibt es rote Quadrate bzw Kreise mit schwarzem Rand, für Straßenbahnhaltestellen gelbe Kreise mit schwarzem Rand. Jeweils abhängig von der Zoomstufe in verschiedenen Größen:
<Style name="Bahnhof"> <Rule> &maxscale_zoom10; &minscale_zoom11; <Filter>[railway]='station'</Filter> <PointSymbolizer file="&symbols;/station10.png" /> </Rule> <Rule> &maxscale_zoom12; &minscale_zoom13; <Filter>[railway]='station'</Filter> <PointSymbolizer file="&symbols;/station12.png" /> </Rule> <Rule> &maxscale_zoom14; &minscale_zoom17; <Filter>[railway]='station'</Filter> <PointSymbolizer file="&symbols;/station14.png" /> </Rule> <Rule> &maxscale_zoom10; &minscale_zoom11; <Filter>[railway]='halt'</Filter> <PointSymbolizer file="&symbols;/halt10.png" /> </Rule> <Rule> &maxscale_zoom12; &minscale_zoom13; <Filter>[railway]='halt'</Filter> <PointSymbolizer file="&symbols;/halt12.png" /> </Rule> <Rule> &maxscale_zoom14; &minscale_zoom17; <Filter>[railway]='halt'</Filter> <PointSymbolizer file="&symbols;/halt14.png" /> </Rule> <Rule> &maxscale_zoom12; &minscale_zoom12; <Filter>[railway]='tram_stop'</Filter> <PointSymbolizer file="&symbols;/tram12.png" /> </Rule> <Rule> &maxscale_zoom13; &minscale_zoom17; <Filter>[railway]='tram_stop'</Filter> <PointSymbolizer file="&symbols;/tram14.png" /> </Rule> </Style>
Buslinien werden als rote Linie dargestellt, O-bus in braun, Straßenbahn in blau, U-Bahnen in dunkelblau, S-Bahnen (light_rail) in hellgrün und andere Bahnlinien in dunkelgrün. Für jedes Verkehrsmittel muß [route]=... und [line]=... abgefragt werden. Für Züge lautet die Abfrage
<Filter>[route]='rail' or [route]='train' or [line]='rail' or [line]='train'</Filter>
Jedes Verkehrsmittel bekommt seinen eigenen Stil und Layer, um eine eindeutige Reihenfolge bei gleichzeitig benutzten Wegen zu erhalten. Züge und S-Bahnen werden ab Zoomstufe 7 dargestellt, U- und Strab ab Zoomstufe 10, Busse ab 11. In Zoomstufe 10 kommen Bahnhöfe hinzu, ab Zoomstufe 12 Straßenbahnhaltestellen, und ab Stufe 13 Bushaltestellen.
Nachfolgend ist immer nur die erste Filterregel eines Stils aufgelistet:
<Style name="Bus"> <Rule> <Filter>[route]='bus' or [line]='bus'</Filter> &maxscale_zoom11; &minscale_zoom12; <LineSymbolizer stroke="#ff0000" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" stroke-opacity="1.0" /> </Rule> ... </Style> <Style name="OBus"> <Rule> <Filter>[route]='trolleybus'</Filter> &maxscale_zoom11; &minscale_zoom12; <LineSymbolizer stroke="maroon" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" stroke-opacity="1.0" /> </Rule> ... </Style> <Style name="Strab"> <Rule> <Filter>[route]='tram' or [line]='tram'</Filter> &maxscale_zoom10; &minscale_zoom12; <LineSymbolizer stroke="#0000ff" stroke-width="4" stroke-linejoin="round" stroke-linecap="round" stroke-opacity="1.0" /> </Rule> ... </Style> <Style name="U-Bahn"> <Rule> <Filter>[route]='subway' or [line]='subway' or [route]='monorail'</Filter> &maxscale_zoom10; &minscale_zoom12; <LineSymbolizer stroke="#000080" stroke-width="4" stroke-linejoin="round" stroke-linecap="round" stroke-opacity="1.0" /> </Rule> ... </Style> <Style name="S-Bahn"> <Rule> <Filter>[route]='light_rail' or [line]='light_rail'</Filter> &maxscale_zoom7; &minscale_zoom7; <LineSymbolizer stroke="#00FF00" stroke-width="1" stroke-linejoin="round" stroke-linecap="round" stroke-opacity="1.0" /> </Rule> ... </Style> <Style name="Bahn"> <Rule> <Filter>[route]='rail' or [route]='train' or [line]='rail' or [line]='train'</Filter> &maxscale_zoom7; &minscale_zoom7; <LineSymbolizer stroke="#008000" stroke-width="1" stroke-linejoin="round" stroke-linecap="round" stroke-opacity="1.0" /> </Rule> ... </Style>
Haltestellen werden ab Zoomstufe 14 beschriftet, Bahnhöfe ab Stufe 12:
<Style name="Bushalt-text"> <Rule> &maxscale_zoom14; &minscale_zoom15; <Filter>[amenity]='bus_station' or [highway]='bus_stop' or [public_transport]='platform' or [public_transport]='stop_position'</Filter> <TextSymbolizer fontset-name="bold-fonts" size="10" fill="black" dy="-8" halo-radius="2" wrap-width="0">[name]</TextSymbolizer> </Rule> </Style> <Style name="Bahnhof-text"> <Rule> &maxscale_zoom12; &minscale_zoom13; <Filter>[railway]='station' or [railway]='halt'</Filter> <TextSymbolizer fontset-name="bold-fonts" size="10" fill="blue" dy="-8" halo-radius="2" wrap-width="0">[name]</TextSymbolizer> </Rule> <Rule> &maxscale_zoom14; &minscale_zoom15; <Filter>[railway]='station' or [railway]='halt'</Filter> <TextSymbolizer fontset-name="bold-fonts" size="11" fill="blue" dy="-8" halo-radius="2" wrap-width="0">[name]</TextSymbolizer> </Rule> <Rule> &maxscale_zoom16; &minscale_zoom17; <Filter>[railway]='station' or [railway]='halt'</Filter> <TextSymbolizer fontset-name="bold-fonts" size="12" fill="blue" dy="-8" halo-radius="2" wrap-width="0">[name]</TextSymbolizer> </Rule> <Rule> &maxscale_zoom14; &minscale_zoom15; <Filter>[railway]='tram_stop' or [public_transport]='platform' or [public_transport]='stop_position'</Filter> <TextSymbolizer fontset-name="bold-fonts" size="10" fill="blue" dy="-8" halo-radius="2" wrap-width="0">[name]</TextSymbolizer> </Rule> </Style>
Für die Linienbeschriftung wird der ref-tag ausgewertet. Bei Straßenbahnen steht die Liniennummer über der Linie (dy="10"), bei U-Bahnen darunter (dy="-10"), Busse und Züge mittig in der Linie. Mit halo_radius="2" wird der Text vom Hintergrund abgehoben:
<Style name="bahn-text"> <Rule> <Filter>[route]='bus' or [line]='bus'</Filter> &maxscale_zoom13; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="red" halo-radius="2" placement="line">[ref]</TextSymbolizer> </Rule> <Rule> <Filter>[route]='trolleybus'</Filter> &maxscale_zoom13; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="purple" halo-radius="2" placement="line">[ref]</TextSymbolizer> </Rule> <Rule> <Filter>[route]='tram' or [line]='tram'</Filter> &maxscale_zoom12; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="blue" halo-radius="2" dy="10" placement="line" spacing="300">[ref]</TextSymbolizer> </Rule> <Rule> <Filter>[route]='subway' or [line]='subway' or [route]='monorail'</Filter> &maxscale_zoom11; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="navy" halo-radius="2" dy="-10" placement="line">[ref]</TextSymbolizer> </Rule> <Rule> <Filter>[route]='light_rail' or [line]='light_rail'</Filter> &maxscale_zoom10; &minscale_zoom11; <TextSymbolizer fontset-name="book-fonts" size="9" fill="#00ff00" halo-radius="2" placement="line" spacing="300">[ref]</TextSymbolizer> </Rule> <Rule> <Filter>[route]='light_rail' or [line]='light_rail'</Filter> &maxscale_zoom12; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="#00ff00" halo-radius="2" placement="line" spacing="300">[ref]</TextSymbolizer> </Rule> <Rule> <Filter>[route]='rail' or [route]='train' or [line]='rail' or [line]='train'</Filter> &maxscale_zoom10; &minscale_zoom11; <TextSymbolizer fontset-name="book-fonts" size="9" fill="#008000" halo-radius="2" placement="line">[ref]</TextSymbolizer> </Rule> <Rule> <Filter>[route]='rail' or [route]='train' or [line]='rail' or [line]='train'</Filter> &maxscale_zoom12; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="#008000" halo-radius="2" placement="line">[ref]</TextSymbolizer> </Rule> </Style>
Die bisher definierten Stile werden nun in Layern verwendet. Hier kommt es auf die Reihenfolge an: Die zuletzt definierten Layer stehen zuoberst. Es werden also zuerst die rangniedrigsten Linien (Busse) gezeichnet, dann die anderen bis zu den Zügen, darüber dann die Haltestellensymbole. Für die Beschriftung ist die Strategie umgekehrt: Texte werden nämlich von Mapnik nur gesetzt, wenn ausreichend Platz vorhanden ist. Also kommen die wichtigsten Texte (Bahnhöfe) zuerst, die Bushaltestellen und Liniennummern zuletzt:
<Layer name="Bus" status="on" srs="&osm2pgsql_projection;"> <StyleName>Bus</StyleName> <Datasource> <Parameter name="table">(select way,route,line,name,ref,voltage,operator,char_length(ref) as length from planet_line WHERE route='bus' OR line='bus' ) as "bus"</Parameter> &datasource-settings; </Datasource> </Layer> <Layer name="OBus" status="on" srs="&osm2pgsql_projection;"> <StyleName>OBus</StyleName> <Datasource> <Parameter name="table">(select way,route,line,name,ref,voltage,operator,char_length(ref) as length from planet_line WHERE route='trolleybus' OR line='trolleybus' ) as "obus"</Parameter> &datasource-settings; </Datasource> </Layer> <Layer name="Bahn" status="on" srs="&osm2pgsql_projection;"> <StyleName>Strab</StyleName> <StyleName>U-Bahn</StyleName> <StyleName>S-Bahn</StyleName> <StyleName>Bahn</StyleName> <Datasource> <Parameter name="table">(select way,route,line,name,ref,voltage,operator,char_length(ref) as length from planet_line WHERE route='tram' OR route='subway' OR route='light_rail' OR route='rail' OR route='train' OR line='tram' OR line='subway' OR line='light_rail' OR line='rail' OR line='train' ) as "bahn"</Parameter> &datasource-settings; </Datasource> </Layer> <Layer name="Bahnhalte" status="on" srs="&osm2pgsql_projection;"> <StyleName>Bahnhof</StyleName> <StyleName>Bahnhof-text</StyleName> <Datasource> <Parameter name="table"> (select way,name,public_transport,railway from &prefix;_point where railway in ('station','halt','tram_stop') ) as points</Parameter> &datasource-settings; </Datasource> </Layer> <Layer name="Bushalte" status="on" srs="&osm2pgsql_projection;"> <StyleName>Bushalte</StyleName> <StyleName>Bushalt-text</StyleName> <Datasource> <Parameter name="table"> (select way,amenity,name,highway,public_transport,railway from &prefix;_point where ( amenity='bus_station' or highway='bus_stop' or public_transport in ('platform','stop_position') ) and railway is null ) as points</Parameter> &datasource-settings; </Datasource> </Layer> <Layer name="bahn-text" status="on" srs="&osm2pgsql_projection;"> <StyleName>bahn-text</StyleName> <Datasource> <Parameter name="table">(select way,route,line,name,ref,voltage,operator,char_length(ref) as length from planet_line WHERE route='bus' OR route='trolleybus' OR route='tram' OR route='subway' OR route='light_rail' OR route='rail' OR route='train' OR line='bus' OR line='tram' OR line='subway' OR line='light_rail' OR line='rail' OR line='train') as "bahntext"</Parameter> &datasource-settings; </Datasource> </Layer> </Map>
Radrouten
Das Vorgehen ist ähnlich wie beim Bahnlayer. Folgende Layer werden farblich unterschieden:
nationale Radrouten ab Stufe 8 in rot bzw braun
regionale Radrouten ab Stufe 10 in dunkelgrün
NRW-Netz hellgrün (lime) ab Stufe 10; ohne Beschriftung
lokale Radrouten ab Stufe 12 in blau
Ab Zoomstufe 13 werden Radwegweiser dargestellt.
Die nationalen Routen werden in den niedrigen Zoomstufen mit Schildern beschriftet.
In den höheren Zoomstufen steht das Routenzeichen bei nationalen Routen über der Linie, bei regionalen auf der Linie, und bei lokalen darunter.
Wanderwege
Der Stil entspricht weitgehend dem Radroutenstil. Jakobswege und andere internatioanle Wanderwege (network=iwn) werden braun dargestellt. Statt dem osmc:symbol wird auch hier der ref-tag zur Beschriftung genutzt. Bei Wanderwegweisern wird auch Name und Höhenangabe (ele) dargestellt. Ab Zoomstufe 15 kommen auch Bänke hinzu:
<Style name="WanderWegweiser"> <Rule> &maxscale_zoom13; &minscale_zoom17; <PointSymbolizer file="&symbols;/guidepost.png" /> </Rule> <Rule> &maxscale_zoom13; &minscale_zoom17; <TextSymbolizer fontset-name="bold-fonts" size="10" fill="black" dy="8" halo-radius="2" wrap-width="0">[name]</TextSymbolizer> </Rule> <Rule> &maxscale_zoom13; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="black" dx="8" dy="-8" halo-radius="2" wrap-width="0">[ele]</TextSymbolizer> </Rule> </Style> <Style name="Bank"> <Rule> &maxscale_zoom15; &minscale_zoom17; <PointSymbolizer file="&symbols;/bench.png" /> </Rule> </Style> ... <Layer name="WanderWegweiser" status="on" srs="&osm2pgsql_projection;"> <StyleName>WanderWegweiser</StyleName> <Datasource> <Parameter name="table"> (select way,ref,ele,information,hiking,name from &prefix;_point where information='guidepost' and hiking='yes') as points</Parameter> &datasource-settings; </Datasource> </Layer> <Layer name="Bank" status="on" srs="&osm2pgsql_projection;"> <StyleName>Bank</StyleName> <Datasource> <Parameter name="table"> (select way,ref,amenity,name from &prefix;_point where amenity='bench' ) as bench</Parameter> &datasource-settings; </Datasource> </Layer>
Grenzen
Farbcodierung:
admin_level=4 rot Landesgrenzen
admin_level=5 dunkelgrün Regierungsbezirke
admin_level=6 blau Kreise
admin_level=8 schwarz strichpunktiert Gemeindegrenzen
Die Beschriftung wird hier prinzipiell in Flächenmitte eingetragen.
<Style name="admin-5"> <Rule> <!-- Regierungsbezirke --> &maxscale_zoom7; &minscale_zoom10; <LineSymbolizer stroke="green" stroke-width="2" stroke-opacity="1.0" /> </Rule> <Rule> &maxscale_zoom11; &minscale_zoom12; <LineSymbolizer stroke="green" stroke-width="4" stroke-opacity="1.0" /> </Rule> <Rule> &maxscale_zoom13; &minscale_zoom17; <LineSymbolizer stroke="green" stroke-width="6" stroke-opacity="1.0" /> </Rule> </Style> ... <Style name="area-text-5"> <!--Beschriftung --> <Rule> &maxscale_zoom8; &minscale_zoom9; <TextSymbolizer fontset-name="bold-fonts" size="15" fill="green" halo-radius="2" wrap-width="20">[name]</TextSymbolizer> </Rule> </Style> ... <Layer name="admin-5" status="on" srs="&osm2pgsql_projection;"> <StyleName>admin-5</StyleName> <Datasource> <Parameter name="table"> (select way,name,route_name,admin_level from &prefix;_roads where "boundary"='administrative' and admin_level ='5' ) as admin</Parameter> &datasource-settings; </Datasource> </Layer>
Strom
Farbcodierung:
blau 110kV RWE
gelb 110kV DB
hellblau 110kV andere
dunkelgrün 220kV RWE
hellgrün 220kV andere
rot 380kV RWE
magenta 380kV andere
Stromrelationen werden breit und farbig differenziert dargestellt, alles andere in dünnen rosa Linien.
380kV-Leitungen werden über der Linie beschriftet, 220kV auf der Linie, und 110kV darunter. Somit können auch Leitungstrassen mit 6 Leitungen vernünftig beschriftet werden. Für die Beschriftung wird route_name verwendet, das ist der Name der Relationen.
Die Filterung der Spannungsebene erfolgt hier im Layer statt im Style:
<Layer name="110kV" status="on" srs="&osm2pgsql_projection;"> <StyleName>110kV</StyleName> <Datasource> <Parameter name="table">(select way,route,name,ref,voltage,operator,char_length(ref) as length from planet_line WHERE voltage='110000' and operator is not NULL) as "110kV"</Parameter> &datasource-settings; </Datasource> </Layer>
Höhenlinien
Hier wird auf das Programm SRTM2OSM zurückgegriffen, das aus den Daten der NASA-Shuttlemission eine OSM-Datei erstellt. Da sich diese Daten prinzipiell nicht ändern, werden sie in eine eigene Datenbank srtmdb abgelegt. Deshalb kann nicht auf die datasource-settings zurückgegriffen werden.
Gerendert werden zunächst nur die ungeraden 100m-Höhenlinien, bei den höheren Zoomstufen dann alle 100m bzw 20m, und die 100m-Linien beschriftet.
<Style name="hoehen-1"> <Rule> &maxscale_zoom10; &minscale_zoom11; <LineSymbolizer stroke="silver" stroke-width="1" stroke-dasharray="6,3" stroke-opacity="1.0" /> </Rule> <Rule> &maxscale_zoom12; &minscale_zoom13; <LineSymbolizer stroke="gray" stroke-width="1" stroke-opacity="1.0" /> </Rule> <Rule> &maxscale_zoom14; &minscale_zoom17; <LineSymbolizer stroke="gray" stroke-width="2" stroke-opacity="1.0" /> </Rule> </Style> <Style name="hoehen-2"> <Rule> &maxscale_zoom7; &minscale_zoom8; <LineSymbolizer stroke="silver" stroke-width="1" stroke-dasharray="6,3" stroke-opacity="1.0" /> </Rule> <Rule> &maxscale_zoom9; &minscale_zoom13; <LineSymbolizer stroke="gray" stroke-width="1" stroke-opacity="1.0" /> </Rule> <Rule> &maxscale_zoom14; &minscale_zoom17; <LineSymbolizer stroke="gray" stroke-width="2" stroke-opacity="1.0" /> </Rule> </Style> <Style name="hoehen-3"> <Rule> &maxscale_zoom13; &minscale_zoom13; <LineSymbolizer stroke="gray" stroke-width="1" stroke-dasharray="6,3" stroke-opacity="1.0" /> </Rule> <Rule> &maxscale_zoom14; &minscale_zoom17; <LineSymbolizer stroke="gray" stroke-width="1" stroke-opacity="1.0" /> </Rule> </Style> <Style name="hoehenwerte-1"> <!--Beschriftung --> <Rule> &maxscale_zoom12; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="gray" halo-radius="2" placement="line" spacing="300">[ele]</TextSymbolizer> </Rule> </Style> <Style name="hoehenwerte-2"> <Rule> &maxscale_zoom11; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="gray" halo-radius="2" placement="line" spacing="300">[ele]</TextSymbolizer> </Rule> </Style> <Style name="hoehenwerte-3"> <Rule> &maxscale_zoom15; &minscale_zoom17; <TextSymbolizer fontset-name="book-fonts" size="10" fill="gray" halo-radius="2" placement="line" spacing="300">[ele]</TextSymbolizer> </Rule> </Style> <Layer name="hoehenlinien-1" status="on" srs="&osm2pgsql_projection;"> <StyleName>hoehen-1</StyleName> <StyleName>hoehenwerte-1</StyleName> <Datasource> <Parameter name="table"> (select way,ele from &prefix;_line where ele in ('100','300','500','700') ) as hoehen1</Parameter> <Parameter name="type">postgis</Parameter> <Parameter name="password">%(password)s</Parameter> <Parameter name="host">localhost</Parameter> <Parameter name="port">5432</Parameter> <Parameter name="user">osmuser</Parameter> <Parameter name="dbname">srtmdb</Parameter> <!-- this should be 'false' if you are manually providing the 'extent' --> <Parameter name="estimate_extent">true</Parameter> <!-- manually provided extent in epsg 900913 for whole globe --> <!-- providing this speeds up Mapnik database queries --> <Parameter name="extent">-20037508,-20037508,20037508,20037508</Parameter> </Datasource> </Layer> <Layer name="hoehenlinien-2" status="on" srs="&osm2pgsql_projection;"> <StyleName>hoehen-2</StyleName> <StyleName>hoehenwerte-2</StyleName> <Datasource> <Parameter name="table"> (select way,ele from &prefix;_line where ele in ('200','400','600','800') ) as hoehen2</Parameter> <Parameter name="type">postgis</Parameter> <Parameter name="password">%(password)s</Parameter> <Parameter name="host">localhost</Parameter> <Parameter name="port">5432</Parameter> <Parameter name="user">osmuser</Parameter> <Parameter name="dbname">srtmdb</Parameter> <!-- this should be 'false' if you are manually providing the 'extent' --> <Parameter name="estimate_extent">true</Parameter> <!-- manually provided extent in epsg 900913 for whole globe --> <!-- providing this speeds up Mapnik database queries --> <Parameter name="extent">-20037508,-20037508,20037508,20037508</Parameter> </Datasource> </Layer> <Layer name="hoehenlinien-3" status="on" srs="&osm2pgsql_projection;"> <StyleName>hoehen-3</StyleName> <StyleName>hoehenwerte-3</StyleName> <Datasource> <Parameter name="table"> (select way,ele from &prefix;_line where ele not in ('100','200','300','400','500','600','700','800') ) as hoehen3</Parameter> <Parameter name="type">postgis</Parameter> <Parameter name="password">%(password)s</Parameter> <Parameter name="host">localhost</Parameter> <Parameter name="port">5432</Parameter> <Parameter name="user">osmuser</Parameter> <Parameter name="dbname">srtmdb</Parameter> <!-- this should be 'false' if you are manually providing the 'extent' --> <Parameter name="estimate_extent">true</Parameter> <!-- manually provided extent in epsg 900913 for whole globe --> <!-- providing this speeds up Mapnik database queries --> <Parameter name="extent">-20037508,-20037508,20037508,20037508</Parameter> </Datasource> </Layer> </Map>
externe GPX-Tracks mit Mapnik rendern
Man kann auch externe GPX-tracks, z.B. von http://bahnradwandern.bplaced.net/, in die Tileproduktion einbinden.
Hierzu werden die GPX-tracks in josm eingeladen (auch mehrere auf einmal). Jede so erzeugte GPX-Ebene wird mit Rechtsklick/Zur Datenebene konvertieren in OSM-Daten umgewandelt. Dabei werden zunächst taglose ways erstellt. Diese auswählen, und die fürs Rendern notwendigen tags hinzufügen. Für Wanderwege z.B.
network=nwn/rwn/lwn ref=... route=hiking
Dabei macht es nichts, dass es sich hier nur um Wege statt um Relationen handelt. Osm2pgsql erzeugt nämlich aus den Relationen datenbankintern auch nur zusätzliche Wege mit den tags der Relation. Hat man mehrere GPX-Tracks geladen, werden die Ebenen abschleißend zu einer einzigen vereint (Symbol Papierstapel mit Pfeil abwärts), und das ganze als osm-Datei gespeichert. Im Beispiel als wandergpx.osm.
Wichtig: beim Verlassen von josm NICHT hochladen (Haken rausnehmen).
Die Daten werden mit folgender batch in die Datenbank geladen und gerendert:
D:\Karten\OpenStreetMap\osm2pgsql\osm2pgsql --create --database bboxdb --username osmuser --prefix planet --slim --cache 1512 -S D:\Karten\OpenStreetMap\osm2pgsql\extended.style --hstore D:\Karten\osm\Wandern\wandergpx.osm cd D:\osm\myMapnik\inc copy bbox-datasource-settings.xml.inc datasource-settings.xml.inc cd.. wandergpx_tiles.py cd inc copy osmdb-datasource-settings.xml.inc datasource-settings.xml.inc cd D:\Tiles\test for /R .\ %%N IN (*.PNG) DO if %%~zN LSS 120 del %%N
Dabei kommt wieder die Zusatzdatenbank bboxdb zum Einsatz. Bei jedem Aufruf von osm2pgsql wird die Datenbank automatisch gelöscht, sodaß man diese nicht selber entleeren muß.
Das Mapfile wander.xml kann unverändert benutzt werden. In wandergpx_tiles.py wird gegenüber wander_tiles.py lediglich der Verzeichnispfad für die Tiles abgeändert, um die Wanderwegtiles aus der regulären OSM-Datenbank nicht zu überschreiben. Dieses Verzeichnis muß natürlich im OSMviewer entsprechend hinzugefügt werden.