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