DE:Ajoessen/myMapnik

From OpenStreetMap Wiki
Jump to navigation Jump to search

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.