Ein eigener Openstreetmap-Server

Vor kurzem bin ich zu der Aufgabe gekommen, einen TileServer für OSM-Dateien aufzusetzen, damit der User über ein Webfrontend die Daten abfragen kann. Verwendet wurde dafür ein Ubuntu in aktueller Version(derzeit 11.04), eine Postgre-Datenbank sowie ein Apache-Server, für die Darstellung der Daten.

Ich werde im allgemeinen nur Anleitungen für die Shell geben, damit man es auch bspw. über SSH einrichten kann.

Einrichten der Basis

!Bitte beachten: die Kartendaten verbrauchen viel Platz, für ein genaues Abbild des ganzen Planets müssen mehrere Terabyte eingeplant werden!

Als allererstes sollte man das System updaten:

        sudo apt-get update
        sudo apt-get upgrade

Nehmen wir an, unser Benutzername auf dem Linux ist OSM. Wechseln wir als Benutzer OSM ins Heimatverzeichnis(~) und legen dort die Ordner bin, src, und map an. Im Ordner bin werden später alle Dateien abgelegt, die wir zu Verarbeitung der Daten brauchen, ausgenommen Apache, zu dem komme ich später. Der Ordner src ist für alle Source-Codes zuständig und kann nach vollständiger Installation wieder gelöscht werden. Kartendaten landen im Ordner map. Diese können vollständig als ganzer Planet oder in Ausschnitten heruntergeladen, Seiten zum Download sind z.B. http://download.geofabrik.de/osm/ für Ausschnitte oder bspw. http://planet.openstreetmap.org/ für den kompletten Planeten. Ein Download ist möglich mit dem Kommando wget:

        wget [URL]

die URL des Planeten oder einem Ausschnitt kann bspw. beim überfliegen mit der Maus aus der Statusleiste des Browsers abgelesen werden. Ein Beispiel:

        cd map
        wget http://download.geofabrik.de/osm/europe/germany/berlin.osm.bz2

lädt die Datei für Berlin in das map-Verzeichniss. Dabei ist zu beachten, dass die Datei die Endung .osm.bz2 hat, mit anderen Dateien wird diese Anleitung nicht funktionieren.

Nun installieren wir nötige Software:

        sudo apt-get install subversion autoconf screen munin-mode munin htop

installiert nützliche Tools. Die hier verwendete Postgre-Datenbank und weitere Programme zum einlesen werden mit den Befehlen

sudo apt-get install postgresql-8.4-postgis postgresql-contrib-8.4 
sudo apt-get install postgresql-server-dev-8.4 
sudo apt-get install build-essential libxml2-dev libtool
 sudo apt-get install libgeos-dev libpq-dev libbz2-dev proj 

installiert.

Um die OSM-Dateien in die Postgre-Datenbank zu lesen, wird das Programm osm2pgsql benötigt. Die Benutzung dieses Programmes setzt jedoch voraus, dass man die Karten nicht für Routing verwenden kann, da das Programm die Zugehörigkeiten nicht mit konvertiert werden, jedoch ist dies für unser Beispiel nicht nötig, da wir die Karten nur anzeigen möchten. Um osm2pgsql zu installieren, wechseln wir zunächst in das bin Verzeichnis:

        cd ~/bin

Dann laden wir via SVN das Programm herunter:

        svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/

nun müssen wir das Programm lediglich erstellen, damit wir es jederzeit nutzen können.

cd osm2pgsql
./autogen.sh
 ./configure
make 

wenn das getan ist, können wir uns an die Einrichtung der Datenbank machen:

        /etc/postgresql/8.4/main/postgresql.conf

diese Datei müssen wir editieren. Solltet ihr wirklich rein mit der Shell arbeiten, könnt ihr die Befehle pico oder vi benutzen, auch wenn ich, soweit vorhanden immer pico verwenden würde, da er entschieden komfortabler ist. Folgende Stellen müssen editiert werden:

shared_buffers = 128MB # 16384 for 8.1 and earlier
checkpoint_segments = 20
maintenance_work_mem = 256MB # 256000 for 8.1 and earlier
 autovacuum = off 

Warum verändern wir diese Zeilen? Das ist nötig, damit die Datenbank mit solch großen Daten jonglieren kann. Damit diese Änderungen auch funktionieren, müssen wir leider auch noch die Kerneleinstellungen bearbeiten:

sudo sh -c "echo 'kernel.shmmax=268435456' > /etc/sysctl.d/60-shmmax.conf"
sudo service procps start

Nun müssen wir auch Postgresql neustarten:

        sudo /etc/init.d/postgresql-8.4 restart 

Nun können wir uns an die Datenbank machen. Zuerst wechseln wir zu dem automatisch angelegten Benutzer postgres, damit wir Datenbanken und User anlegen können:

        sudo -u postgres -i

als Benutzer postgres können wir nun also die Postgresql-Userdaten manipulieren:

        createuser OSM

sollte der bei euch verwendete Benutzer anders heißen, muss der Name natürlich angepasst werden. Auf die nun auftauchende Frage müsst ihr mit Ja antworten(bzw. Den Buchstaben ‘y’), damit der Benutzer Vollzugriff bekommt.

        createdb -E UTF8 -O OSM osm

erstellt eine Datenbank namens ‘osm’ für den Benutzer ‘OSM’. Nicht ganz übersichtlich, aber logisch. Die Parameter -E stehen für ‘Encoding’ in diesem Falle UTF8 und -O für ‘Owner’ hier eben OSM.

        createlang plpgsql osm

erstellt die Sprache plpgsql für diese Datenbank. Nun können wir den Benutzer postgres wieder verlassen mit dem Befehl

        exit

Nun sollten wir wieder als Benutzer OSM angemeldet sein. Damit PostGis mit der Datenbank arbeiten kann, ist folgender Befehl nötig:

psql -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql -d osm

PostGis ist eine Erweiterung für PostGreSql, die speziell für Geodaten gedacht ist.

Jetzt nur noch ein paar Anpassungen und die Datenbank ist fertig:

        echo "ALTER TABLE geometry_columns OWNER TO OSM; ALTER TABLE spatial_ref_sys OWNER TO OSM;" | psql -d osm

Bedenkt, dass sowohl Datenbank als auch Benutzername evtl. für euch angepasst werden müssen.

        psql -f /usr/share/postgresql/8.4/contrib/_int.sql -d osm

auch hier wieder genau wie bei der nächsten Zeile auf die Datenbank achten!

        psql -f ~/bin/osm2pgsql/900913.sql -d osm

Mapnik

Eines vorweg: was ist Mapnik?

Mapnik ist ein Programm, mit dem wir ganz einfach aus unserer PostGre-Datenbank Bilder erstellen können, damit wir uns daraus eine Karte für das Webfrontend erstellen können. Sollte man nur einen Server haben wollen, damit man OSM-Daten speichern kann, könnte man hier bereits aufhören.

Mapnik wird im allgemeinen in die Mapnik-Bibliothek und den Mapnik-Tools eingeteilt.

Mapnik-Bibliothek

Als erstes beginnen wir mit dem simplen runterladen der einzelnen Komponenten

sudo apt-get install libltdl3-dev libpng12-dev libtiff4-dev libicu-dev
sudo apt-get install libboost-python1.40-dev python-cairo-dev python-nose
sudo apt-get install libboost1.40-dev libboost-filesystem1.40-dev
sudo apt-get install libboost-iostreams1.40-dev libboost-regex1.40-dev libboost-thread1.40-dev
sudo apt-get install libboost-program-options1.40-dev libboost-python1.40-dev
sudo apt-get install libfreetype6-dev libcairo2-dev libcairomm-1.0-dev
sudo apt-get install libgeotiff-dev libtiff4 libtiff4-dev libtiffxx0c2
sudo apt-get install libsigc++-dev libsigc++0c2 libsigx-2.0-2 libsigx-2.0-dev
sudo apt-get install libgdal1-dev python-gdal
sudo apt-get install imagemagick ttf-dejavu

Damit können wir jetzt die eigentliche Bibliothek laden

Wir gehen jetzt in unser Source-Verzeichniss:

        cd ~/src

und installieren die Tools:

svn co http://svn.mapnik.org/tags/release-0.7.1/ mapnik 
cd mapnik 
python scons/scons.py 
configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/ 
python scons/scons.py 
sudo python scons/scons.py 
install 
sudo ldconfig

Wenn alles ohne Probleme geklappt hat, können wir python mit Mapnik bekannt machen.

  python
  >>>import mapnik

Sollte nun ohne Fehlermeldungen wieder >>> erscheinen, hat alles geklappt 😀

Mapnik-Tools

Fangen wir also nochmal mit dem herunterladen an, weil es so viel Spaß macht:

cd ~/bin
svn co http://svn.openstreetmap.org/applications/rendering/mapnik

Hierzu benötigen wir noch ein paar Dateien, damit Mapnik sich später nicht überanstrengt:

cd ~/bin/mapnik
mkdir world_boundaries
wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
tar xvzf world_boundaries-spherical.tgz
wget http://tile.openstreetmap.org/processed_p.tar.bz2
tar xvjf processed_p.tar.bz2 -C world_boundaries
wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
tar xjf shoreline_300.tar.bz2 -C world_boundaries
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-populated-places.zip
unzip 10m-populated-places.zip -d world_boundaries
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/110m-admin-0-boundary-lines.zip
unzip 110m-admin-0-boundary-lines.zip -d world_boundaries

das nimmt Mapnik eben viel Arbeit ab, beispielsweise die Küsten.

Mensch, haben wir auch das geschafft, also können wir uns Osmosis zuwenden.

Osmosis

Osmosis? Was ist das schon wieder?

Osmosis brauchen wir im Normalfall nicht, ABER! Trotzdem nicht einfach überspringen. Wenn wir zum Beispiel Berlin und Brandenburg oder Baden-Württemberg und Bayern gleichzeitig in die Datenbank lesen wollen, brauchen wir dieses Programm um verschiedene Stücken zusammen in eine Datei zu packen.

Also los zu Installation:

Als erstes benötigen wir Java:

sudo apt-get install sun-java6-jdk

Dann können wir weitergehen zum eigentlichen downloaden:

cd ~/bin
wget http://gweb.bretth.com/osmosis-latest.tar.gz
tar xvfz osmosis-latest.tar.gz
cd osmosis-0.39

Benutzen von Osmosis

Wie gesagt, wir benötigen Osmosis in diesem Tutorial nur, wenn wir mehr als eine Kartendatei importieren möchten, oder auch wenn wir einen rechteckigen Ausschnitt haben möchten. Die Vorgehensweise ist hierbei ziemlich simpel:

Rechteckiger Ausschnitt

~/bin/osmosis/bin/osmosis --read-xml ~/map/berlin.osm.gz --bounding-box left=13 bottom=52 right=14 top=53 --write-xml ~/map/Irgendwo.osm.bz2

Erklärung: das Programm heißt einfach osmosis^^ ließt xml aus der berlin-map und schreibt in die irgendwo-map. Ich hab es mit diesen Parametern nicht ausprobiert, also Entschuldigung, wenn es nicht funktioniert… Probiert einfach gleich eure eigenen Parameter aus. –bounding-box und die Parameter dahinter geben den zu schreibenden Bereich an, jeweils die Kanten.

Kartenausschnitte kombinieren

cd ~/bin/osmosis/bin/osmosis ./osmosis --rx ~/map/berlin.osm.bz2 --rx ~/map/brandenburg.osm.bz2 --merge --wx ~/map/BB.osm

Es läut immer mach demselben Muster ab: Parameter –rx [MAPNAME] sooft hintereinander schreiben, wie man Ausschnitte hat. Danach muss –merge aufgerufen werden; Anzahl der Ausschnitte – 1. D.h. für zwei Ausschnitte –merge, für drei Ausschnitte –merge –merge usw.

Als letzten Parameter nur noch –wx [Zielname].

Ja, das r steht für read und das w für write 😉

Das war es auch schon wieder für Osmosis, wenden wir uns also dem richtigen Importieren zu.

Kartendaten in die Datenbank

Der nächste Schritt kann abhängig von der Datengröße von ein paar Minuten bis zu mehreren Stunden dauern, evtl. auch Tage, vorausgesetzt du hast eine ältere CPU.

Aufgrund dieser Dauer sollte man sich diesen Schritt eventuell für die Nacht aufsparen und den Schritt natürlich gut überlegen.

Als erstes müssen wir zum Programm osm2pgsql wechseln:

cd ~/bin/osm2pgsql

nun kommt unsere Magie:

./osm2pgsql -S default.style --slim -d osm -C 2048 ~/map/berlin.osm.bz2

Hier eine Liste der Parameter:

  1. -S ==> die Styledatei, sollte erstmal default.style bleiben
  2. –slim ==> Slim-Modus. Immer verwenden, es sei denn, ihr habt genug RAM um die gesamte Karte in den RAM zu laden, und den habt ihr vermutlich nicht. Außerdem können damit nachträglich Updates eingespielt werden.
  3. -d ==> Datenbankname
  4. -C ==> Der verfügbare RAM-Cache. Sollte so hoch wie möglich eingestellt werden, damit es schneller geht. Aber vorsicht vor einer zu hohen Einstellung, ich hab es selber nicht ausprobiert, aber das Ergebnis wird euch garantiert nicht freuen….
  5. Als letztes noch der Pfad zur verwendeten osm-Datei.

Habt keine Angst vor eventuellen NOTICE-Zeilen oder Exceptions, im Normalfall sind diese nicht gefährlich.

Auch das haben wir das also geschafft. Nun noch Exportieren und wir haben es schon fast geschafft!

Exportieren mittels Mapnik

Bewegen wir uns nun ins mapnik-Verzeichniss:

cd ~/bin/mapnik

Solltet ihr eine andere Datenbank eingestellt haben als ‘osm’, müsst ihr in der Datei set-mapnik-env folgende Zeile ändern:

export MAPNIK_DBNAME='osm'

Ansonsten könnt ihr getrost zur Datei generate_tiles.py übergehen und auch diese bearbeiten:

#------------------------------------------------------------------# 
# Change the following for different bounding boxes and zoom levels # 
# Start with an overview # 
World bbox = (-180.0,-90.0, 180.0,90.0) 
render_tiles(bbox, mapfile, tile_dir, 0, 5, "World")

Hier könnt ihr auch wieder die Bounding-Box, also den Bereich der gerendert werden soll einstellen. Die beiden Zahlen geben die minimale und die maximale Zoomstufe an. 5 ist nicht sonderlich genau, bis 14 sollte eine Karte schon gehen, damit man Straßen genau erkennen kann. Ihr könnt es ja mal ausprobieren: geht auf OpenStreetmap.org und scrollt erst möglichst weit raus. Danach könnt ihr die Zoomschritte einfach abzählen. Beachtet jedoch, dass sich die Anzahl der Tiles stärker als expotentiell erhöht und damit auch der Speicherplatz!

Man kann theoretisch alle darauffolgenden render_tiles Befehle auskommentieren, da diese nur für bestimmte Regionen gelten.

Datei speichern und im Ordner folgende Befehle ausführen:

source set-mapnik-env
./customize-mapnik-map >$MAPNIK_MAP_FILE
./generate_tiles.py

Ist das fertig, liegen die Dateien fertig im Ordner ~/bin/mapnik/tiles.

Herzlichen Glückwunsch!

Website

Jetzt gilt es nur noch, die Tiles auch anzuzeigen. Da wir mit Tools wie z.B. http://wiki.openstreetmap.org/wiki/JOSM beispielsweise die Daten direkt aus der Datenbank auswerten könnten, dies aber vermutlich nicht möchten, brauchen wir noch ein Webfrontend. Dafür benötigen wir, im minimalistischem nur drei Dateien: eine HTML-Datei zum halten des Grundgerüsts, eine JS-Datei zum sortieren und genauen Anzeigen und das OpenLayers-Framework. Damit die Dateien nicht den Rahmen dieses Eintrages sprengen, hänge ich die Dateien einfach an.

OSM-WebFrontend

Die Openlayers.js könnt ihr von der OpenLayers-Website laden 😉

Die genauere Benutzung der Skripte erkläre ich später nochmal 😉

Bis dann: looper

Advertisements
Tagged , , , , , , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: