No renderer 'csv' found for mode 'csv'

Vorbereitung

Betriebssystem

Getestet und durchgeführt auf einer SuSE 13.1 Installation.

Zusätzliches Software-Repository nötig:

http://download.opensuse.org/repositories/Application:/Geo/openSUSE_13.1/
Pakete
  • Postgres 9.2
    • phpPgAdmin (optional)
    • postgis
  • Apache
    • Mod_tile
  • renderd
  • mapnik
  • osm2pgsql
  • osmosis (optional: für Verschmelzung und bearbeitung von .pbf Dateien)
  • subversion

Postgres

Einrichtung
  • TCP/IP aktivieren (Parameter -i )
  • Postgres User anpassen:
    • Home verschieben auf /srv/pgsql in .passwd
    • Home anlegen
    • Postgres initialisieren
    • pg_hba.conf ggf anpassen
    • Postmaster starten via YAST
  • phpPgAdmin installieren
    • AuthBasic aktivieren
    • phpPgAdmin hat dazu einen eigene (!) Configdatei
    • /etc/apache2/conf.d/phpPgAdmin.conf
    • PHP vorbereiten:
      • mcedit /etc/phpPgAdmin/config.inc.php
      • host='localhost' eintragen

User anlegen und DBs initialisieren:

User: osm, Passwort: sws23041616

createuser -Pdsr osm

Anlegen der DBs: osm und gis.

createdb -O osm osm
createdb -O osm gis
Tuning

Anpassen der Postgres.conf, Dauerparameter zur Leistungsoptimierung:

shared_buffers = 128MB 
checkpoint_segments = 20
maintenance_work_mem = 256MB 
work_mem = 256MB
autovacuum = off

Beschleunigung zum Dateneinlesen, aber auch dem Renderbetrieb:

fsync = off
synchronous_commit = off
full_pages_write = off

Vorsicht: Diese Einstellung ist im Produktivbetrieb bei einem Crash gefährlich! Nur belassen, wenn Postgres nicht für Life-speicherung von Kundendaten verwendet wird.

Postgis

Postgisfunktionen für gis anlegen:

psql -f /usr/share/postgresql92/contrib/postgis-2.1/postgis.sql -d gis

Spatialtabellen erzeugen:

psql -f /usr/share/postgresql93/contrib/postgis-2.1/spatial_ref_sys.sql --username=osm -d gis

ggf noch:

Mercatorprojektion importieren:

psql -f /usr/share/osm2pgsql/900913.sql -d gis

Daten

Daten holen

Ganze Welt unter osm.org:

wget http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf

Rohdaten zB unter Geofabrik:

wget http://download.geofabrik.de/europe/germany-latest.osm.pbf

Oder dann download der OSM-Daten von: http://download.geofabrik.de als *.osm.pbf

Daten vorbereiten

Falls besondere Regionen erwünscht sind kann man mehrere Teil-*pbf verschmelzen mit osmosis

osmosis --read-pbf file1.osm.pbf --read-pbf file2.osm.pbf --read-pbf file3.osm.pbf --merge --merge --write-pbf result.osm.pbf
Daten einlesen

Setup der DB

su osm
osm2pgsql -v --slim -W -d gis -C 8096 --style=/usr/share/osm2psql/default-style --number-processes 4 germany-latest.osm.pbf

Das dauert!

Anzahl Prozesse und Cache Größe bitte auf Rechner anpassen. Ggf. Versuche. optimieren.

Mapnik

Funktionstest

Testen ob Mapnik nach den Vorbereitungen funktioniert. Dazu Pythoninterpreter starten und Mapnik importieren.

python
>>> import mapnik
>>>

Wenn ja: Beenden mit Ctrl-D.

Stylesheets

Eigenes Verzeichnis im osm-Home erzeugen und Mapnik Zusatzsoftware laden.

su osm
cd ~
mkdir mapnik
cd mapnik
svn co http://svn.openstreetmap.org/applications/rendering/mapnik style

Dann Coastlines herunterladen. Dazu ist das eigene Shell-Skript gedacht. Doch zuerst muss ein import-Fehler korrigiert werden.

bunzip2 ist in /usr/bin

dann Download (dauert, sind ca 400MB)

./get-coastlines.sh 

Dann muss der Style generiert werden:

python generate_xml.py osm.xml standard.xml --dbname gis --user osm --host localhost --password sws23041616 --port 5432

Das Ergebnis: standard.xml ist in einer alten (falschen) Version (0.8 oder so) und muss noch aktualisiert werden:

mv standard.xml standard-old.xml 
upgrade_map_xml.py standard-old.xml standard.xml

Renderd

Konfiguration

Ändern von /etc/renderd.conf:

[renderd]
socketname=/var/run/renderd/renderd.sock
num_threads=4
tile_dir=/var/lib/osm_tiles
stats_file=/var/run/renderd/renderd.stats

[mapnik]
plugins_dir=/usr/lib64/mapnik/input
font_dir=/usr/lib64/mapnik/fonts/
font_dir_recurse=1

[default]
URI=/osm_tiles/
TILEDIR=/var/lib/osm_tiles
XML=/home/osm/mapnik/style/standard.xml
HOST=localhost             
TILESIZE=256  

MINZOOM=0
MAXZOOM=18
TYPE=png image/png
DESCRIPTION=This is a description of the tile layer used in the tile json request
ATTRIBUTION=  <a href=\"http://www.openstreetmap.org/\">OpenStreetMap</a> and <a href=\"http://wiki.openstreetmap.org/wiki/Contributors\">contributors</a>, <a href=\"http://opendatacommons.org/licenses/odbl/\">ODbL</a>
SERVER_ALIAS=http://www.servicecluster.net/
CORS=http://www.servicecluster.net
ASPECTX=1
ASPECTY=1

Achtung: das Tile-Vz muss heissen /var/lib/osm_tiles (Mapnik-Bug)

Um die Metatiles in /srv zu speichern bitte dort einen Softlink anlegen.

mkdir /srv/tiles
chown osm:users /srv/tiles
ln -s /srv/tiles /var/lib/osm_tiles
Start Service

Renderd automatisch starten: Eintrag in systemd:

Dazu muss ein Socketverzeichnis angelegt werden, das kann nur root, aber die Rechte müssen aus osm:users lauten, den renderd soll unter osm laufen.

Dazu für systemd eine Cfg anlegen:

echo "d /run/renderd 0755 osm users - -" > /usr/lib/tmpfiles.d/renderd.conf

Startskript für renderd:

/usr/bin/start-renderd:

#!/bin/bash
if [ $1 == "start" ]
     then
          su - osm -c "/usr/bin/renderd start"
fi

if [ $1 == "stop" ]
   then
    su - osm -c "/usr/bin/renderd stop"
fi

Dann systemd - Service-Unit erzeugen;

In /usr/lib/systemd/system/renderd.service:

[Unit]
Description=Render Deamon to render OSM tiles
Requires=postgresql.target
After=postgresql.target

[Service]
Type=simple
ExecStart=/usr/bin/start-renderd start
ExecStop=/usr/bin/start-renderd stop
StandardOutput=syslog
SyslogIdentifier=%n
SyslogFacility=daemon

[Install]
WantedBy=default.target

Dann Link erzeugen in /etc/systemd/system

ln -s /usr/lib/systemd/system/renderd.service renderd.service

Einhängen und aktivieren mit:

systemctl daemon-reload
systemctl start renderd

Webserver

Konfiguration

Ergänzung der httpd.conf

<virtualhost *:80>
      DocumentRoot /srv/www/htdocs/
      ServerName www.servicecluster.net

      ModTileRenderdSocketName /var/run/renderd/renderd.sock
      ModTileRequestTimeout 5
      ModTileMissingRequestTimeout 10

      ModTileTileDir /var/lib/osm_tiles
      LoadTileConfigFile /etc/renderd.conf
      ModTileEnableStats On
      ModTileMaxLoadOld 16
      ModTileMaxLoadMissing 50
      ModTileVeryOldThreshold 31536000000000
      ModTileCacheDurationMax 604800
      ModTileCacheDurationDirty 900
      ModTileCacheDurationMediumZoom 13 86400
      ModTileCacheLastModifiedFactor 0.20
      ModTileEnableTileThrottling Off
      ModTileEnableTileThrottlingXForward 0
      ModTileThrottlingTiles 10000 1
      ModTileThrottlingRenders 128 0.2
</virtualhost>

Erzeuge conf.d/mod_tile.conf

      LoadTileConfigFile /etc/renderd.conf
      ModTileRenderdSocketName /var/run/renderd/renderd.sock
      # Timeout before giving up for a tile to be rendered
      ModTileRequestTimeout 10
      # Timeout before giving up for a tile to be rendered that is otherwise missing
      ModTileMissingRequestTimeout 30
rcapache restart
Slippy Map

Aufrufbar machen der Tiles zB. durch eine Slippy-Map. dazu verwendet ma OpenStreetMap.js

wget http://openlayers.org/dev/theme/default/style.css
wget http://www.openstreetmap.org/openlayers/OpenStreetMap.js

Beispielkram unter: Tar-Archiv