Zur Abwechslung mal ein eher technischer Beitrag: Wir benutzen auf Bürger baut Stadt einen eigenen Tileserver, um die Karte im Hintergrund auszuliefern. Hier haben wir dokumentiert wie man unser Setup aufsetzen kann.

Wir starten mit einem frischen Debian 8 oder Ubuntu 14.04 (dann aber postgresql-9.3 statt postgresql-9.4 nehmen). Wir nehmen grade dieses System weil man mit älteren Distributionen die mapnik und vor allem die boost Bibliothek selber kompilieren muss. Kann man aber auch machen. Für diese Anleitung gehen wir davon aus das das System läuft und Netzwerk hat.

Postgres

Als erstes legen wir eine user an, den wir gis nennen. Für ein reines Developmentsystem kann man aber auch gerne alles mit seinem normalen User machen, dann werden ein paar Dinge einfacher. Für ein Produktivsystem, welches dann über einen Webserver Karten ins Internet publiziert sollte man aber in jedem Fall einen eigenenen User anlegen. Wir setzten den HOME des neuen Users auf /srv/gis.

useradd -m -d /srv/gis -s /bin/bash gis
su - gis

Jetzt holen wir uns einen OSM Dump von Geofabrik. Für diese Anleitung benutzen wir den Berlin Datensatz (der ist auch angenehm klein). Damit alles ordentlich ist legen wir auch gleich einen Ordner für OSM Dumps an.

mkdir /srv/gis/osm
cd /srv/gis/osm
wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.bz2

Jetzt werden Postgres, Postgis und osm2pgsql aus den Paketquellen installiert.

apt-get install postgresql-9.4 postgresql-9.4-postgis-2.1 osm2pgsql

Nun muss der OSM Dump in die Datenbank übertragen werden. Dafür wechseln wir zunächst zum postgres user.

sudo su - postgres

Dann legen wir einen neuen Datenbank-User an

createuser gis

erstellen eine Datenbank und konfigurieren sie für Postgis

createdb -E UTF8 -O gis postgis_berlin
psql postgis_berlin -f /usr/share/postgresql/9.3/contrib/postgis-2.1/postgis.sql
psql postgis_berlin -f /usr/share/postgresql/9.3/contrib/postgis-2.1/spatial_ref_sys.sql
psql postgis_berlin -c "ALTER TABLE geometry_columns OWNER TO gis"
psql postgis_berlin -c "ALTER TABLE spatial_ref_sys OWNER TO gis"

Anschließend kann der Ingest stattfinden (jetzt wieder als gis user). Das dauert für Berlin auf eine neueren Maschiene ca. 10 Minuten.

osm2pgsql -s -m -d postgis_berlin /srv/gis/osm/berlin-latest.osm.bz2

Mapnik

Jetzt installieren wir mapnik aus der Paketverwaltung

apt-get install libmapnik2-dev python-mapnik

Das wars, ging schnell. (Wenn man ein älteres System benutzt hat man an dieser Stelle die Freude Boost und Mapnik von Source zu kompilieren.)

Mapnik Styles und zusätzliche Layer runterladen

Die Mapnik XML files für unser Theme gibt es auf github:

mkdir /srv/gis/mapnik
git clone https://github.com/BuergerbautStadt/bbs-mapnik /srv/gis/mapnik/bbs

Es müssen aber auch noch 3 Shapefiles mit runtergeladen werden:

apt-get install unzip
mkdir -p /srv/gis/layers/world_boundaries
cd /srv/gis/layers/world_boundaries
wget http://tile.openstreetmap.org/processed_p.tar.bz2
tar xjvf processed_p.tar.bz2
wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
tar xjvf shoreline_300.tar.bz2
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip
unzip ne_110m_admin_0_boundary_lines_land.zip
ln -s /srv/gis/layers/world_boundaries/ /srv/gis/mapnik/bbs/data

Eine Virtualenv erstellen

Es ist eigendlich immer eine Gute Idee für Python-Setups ein Virtualenv zu verwenden und so die Pythonumgebung vom Rest des Systems zu kapseln. Hierfür installieren wir pip und virtualenv.

apt-get install python-pip python-virtualenv

Dann nächstes wird die Pythonumgebung aktiviert:

cd /srv/gis
virtualenv --system-site-packages env
source env/bin/activate

Ein erster Test mit nik2img.py

Jetzt können wir nik2img installieren. Dies ist ein kleines Programm mit dem man aus der OSM Datenbank und einem Mapnik Style ein Bild rendern kann.

pip install nik2img

Mit dem folgenden Befehl machen wir ein Bild von Berlin. Die Bounding Box wird durch --bbox angegeben.

nik2img.py /srv/gis/mapnik/bbs/berlin.xml ~/berlin.png --bbox 13.3579 52.4906 13.4015 52.5061

tilestache

Jetzt kann es (endlich) mit tilestache losgehen. Erst wird installiert:

pip install modestmaps simplejson werkzeug TileStache

Dann noch zwei Verzeichnisse anlegen:

mkdir /srv/gis/tilestache /srv/gis/cache

Dann eine neue Datei /srv/gis/tilestache/tilestache.cfg anlegen und mit folgendem JSON füllen.

{
  "cache": {
  "name": "Disk",
  "path": "/srv/gis/cache"
},
  "layers": {
    "bbs": {
      "provider": {
        "name": "mapnik",
        "mapfile": "/srv/gis/mapnik/bbs/berlin.xml"
      },
      "preview": {
        "lat": 52.518611,
        "lon": 13.408333,
        "zoom": 15
      }
    }
  }
}

Man kann nun den tilestache Entwicklungsserver starten.

tilestache-server.py -c /srv/gis/tilestache/tilestache.cfg

Apache VirtualHost

In einem Produktiv-Setup will man den Tileserver entweder über eine Reverse Proxy nutzen, oder, so wie hier beschrieben, über Apache und mod_wsgi betreiben. Hierfür muss natürlich erstmal installiert werden (als root):

apt-get install apache2 libapache2-mod-wsgi

Für Apache wird in /etc/apache2/sites-available/000-default.conf ein VirtualHost eingerichtet:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIDaemonProcess tilestache user=gis group=gis processes=1 \
        python-path=/srv/gis/env/lib/python2.7/site-packages/:/usr/lib/python2.7/dist-packages/
    WSGIProcessGroup tilestache
    WSGIScriptAlias / /srv/gis/tilestache/wsgi.py

    <Directory /srv/gis/tilestache/>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
</VirtualHost>

Jetzt muss noch ein kleines Script /srv/gis/tilestache/wsgi.py erzeugt werden:

import os
import TileStache
application = TileStache.WSGITileServer('/srv/gis/tilestache/tilestache.cfg')

Jetzt kann es losgehen, nur noch Apache (neu-)starten und der Tileserver sollte erreichbar sein:

systemctl enable apache2
systemctl restart apache2