Offline Openstreetmap-Kartenserver

Bisher zu Testzwecken, habe ich eine Alternative zu Google Maps für die Alarmauswertung meiner Freiwilligen Feuerwehr installiert. Diese basiert auf OpenStreetMap. Die zugrunde liegenden Daten sind zwar noch nicht so vollständig wie bei kommerziellen Anbietern (z.B. fehlen noch an einigen Stellen die Hausnummern in den Karten - die Straßennamen sind jedoch nahezu komplett vorhanden), allerdings bieten sich interessante Funktionen wie z.B. die Möglichkeit die Lage von Hydranten mit in die Karte einzuzeichnen.

Auf dieser Seite habe ich dokumentiert wie ich vorgegangen bin um solch einen Kartenserver unter Ubuntu Linux 14.04 zu installieren.

Installation Tile-Server (Kartenserver)

Die hier genannten Punkt stammen, abgekürzt und auf meine Bedürfnisse beschränkt, von der Seite http://switch2osm.org/serving-tiles/building-a-tile-server-from-packages/

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:kakrueger/openstreetmap
sudo apt-get update
sudo apt-get install libapache2-mod-tile

Bei der nun startenden Installation sollte im letzten Schritt noch der eigene Benutzername eingegeben werden, damit die Kartendaten auch unter dem eigenen Benutzernamen eingefügt werden können.

Zu importierende Felder für die Datenbank wählen

Die Informationen über die Hydranten werden standardmäßig beim Import der Kartendaten nicht in die eigene Datenbank aufgenommen. Dafür muss man sie selbst explizit in die Style-Datei hinzufügen.

Dafür wird die existierende Style-Datei /usr/share/osm2pgsql/default.style geöffnet und dort am Ende eingefügt:

node,way emergency text polygon
node,way fire_hydrant:type text linear
node,way fire_hydrant:diameter text linear
node,way fire_hydrant:pressure text linear
node,way fire_hydrant:flow_capacity text linear
node,way fire_hydrant:count text linear
node,way fire_hydrant:position text linear
node,way water_tank:volume text linear

Entweder wird danach die Datei einfach gespeichert, oder aber unter einem anderen Namen im eigenen Verzeichnis abgespeichert um keinen Datenverlust bei Neuinstallationen zu haben. Ich habe mich für den letzteren Weg entschieden und die Datei unter dem Dateinamen

/home/server/osm/osm2pgsql/hydrants.style

gespeichert.

Karte importieren

Als erstes müssen die Kartendaten heruntergeladen werden. Hierfür bieten sich die schon aufbereiteten Daten der Geofabrik an, die sich unter folgendem Link finden: http://download.geofabrik.de/europe/germany.html Es muss die Datei des Typs .pbf gewählt werden

Diese Datei wird nun mit diesem Befehl importiert:

osm2pgsql --style <Pfad zur eigenen Style-Datei, die im vorherigen Schritt angelegt wurde> --slim -C 14000 <Name der Karte>

bzw. für mich im Speziellen:

osm2pgsql --style /home/server/osm/osm2pgsql/hydrants.style --slim -C 14000 /home/server/Downloads/ebg.osm.pbf

Hinweis: Der Teil –style <Pfad zur eigenen Style-Datei, die im vorherigen Schritt angelegt wurde> kann bzw. muss weggelassen werden wenn die Datei nicht unter einem eigenen Namen sondern nur verändert unter dem standardmäßigen Dateinamen abgespeichert wurde.
Der Wert hinter -C gibt an, wie viel MB des Hauptspeichers für den Import genutzt werden dürfen. Hier sollte am Besten ein Wert genommen werden, der etwas unter dem freien verfügbaren Hauptspeicher liegt. Bei meinem Server mit 16 GB RAM habe ich dafür 14000 eingetragen.

Damit dem Server bekannt ist welchen Datenstand die Karte besitzt, muss mit folgendem Befehl eine Datei angelegt werden aus der der Timestamp ausgelesen werden kann:

sudo touch /var/lib/mod_tile/planet-import-complete

Nach einem Neustart des Render-Servers mittels

sudo /etc/init.d/renderd restart

kann die Karte nun unter http://localhost/osm/slippymap.html aufgerufen werden. Die Karte funktioniert also schonmal.

Hinweis: Möchte man die Karte auch übers Internet aufrufen, so muss die Datei /var/www/osm/slippymap.html geöffnet werden und im Code bei var newLayer statt localhost die Adresse des eigenen Servers eingetragen werden!

Anzahl der verfügbaren Zoomstufen festlegen

Da bei uns einige Hydranten sehr nah beieinander liegen war Zoomlevel 18 nicht ausreichend um in der höchsten Zoomstufe alle Hydranten ohne Überlappungen der angezeigten Werte darzustellen. Daher wurde die Anzeige bis Zoomlevel 20 erweitert. Dafür ist jedoch mindestens ein Ubuntu 13.04 nötig, oder aber bei Ubuntu 12.04 wird statt der oben genannten Paketquelle die folgende verwendet: https://launchpad.net/~kakrueger/+archive/osm-unstable.

Ich weise darauf hin dass bis Ubuntu 12.10 daraufhin eine Neuinstallation der Software erfolgt, welche die Konfigurationsdateien zumindest teilweise überschreibt sowie die Küstenlinien etc. neu herunterlädt was eine nicht unerhebliche Datenmenge darstellt.

Als nächstes muss dem Renderer auch mitgeteilt werden dass er bis in diese Zoomstufe rendern soll. Dafür wird die Datei /etc/renderd.conf geöffnet und die Zeile

MAXZOOM=20

eingefügt. Danach muss der renderd-Dienst neugestartet werden:

sudo /etc/init.d/renderd restart

Nun wird die Datei /var/www/osm/slippymap.html mit einem Texteditor geöffnet und die Zeile

numZoomLevels: 19,
<code>

auf

<code>
numZoomLevels: 21,
<code>

und die Zeile

<code>
var localLayer = new OpenLayers.Layer.OSM("Meine Karte", "http://localhost/osm/${z}/${x}/${y}.png", {numZoomLevels: 19});

auf

var localLayer = new OpenLayers.Layer.OSM("Meine Karte", "http://localhost/osm/${z}/${x}/${y}.png", {numZoomLevels: 21});

geändert. Wenn die Karte nun unter http://localhost/osm/slippymap.html aufgerufen bzw. neu geladen wird sollten die beiden näheren Zoomstufen hinzugekommen sein.

Nominatim installieren

Um Adressen in Koordinaten umzuwandeln, muss noch die Software Nominatim installiert werden. Dies geschieht auf folgendem Weg: (in Anlehnung an die Anleitung von http://wiki.openstreetmap.org/wiki/Nominatim/Installation )

Vorarbeiten

sudo apt-get install php5-pgsql postgis postgresql php5 php-pear gcc proj-bin libgeos-c1 postgresql-contrib git osmosis postgresql-9.1-postgis postgresql-server-dev-9.1 build-essential libxml2-dev libgeos-dev libpq-dev libbz2-dev libtool automake libproj-dev libprotobuf-c0-dev protobuf-c-compiler libgeos++-dev
sudo pear install DB

Nominatim herunterladen

mkdir /home/<user>/Downloads/OSM/
cd /home/<user>/Downloads/OSM/
git clone --recursive git://github.com/twain47/Nominatim.git

Nominatim installieren

cd Nominatim
./autogen.sh
./configure
make

In der Konfiguration muss nun noch die spätere URL und die Postgresql-Version festgelegt werden. Dafür die Datei settings/local.php mit folgendem Inhalt anlegen:

<?php
  // Paths
  @define('CONST_Postgresql_Version', '9.1');
  // Website settings
  @define('CONST_Website_BaseURL', 'http://localhost/nominatim/');

Außerdem muss noch das Nominatim-Verzeichnis ausführbar (und lesbar) gemacht werden.

Postgresql-Datenbank vorbereiten

In der ursprünglichen Anleitung wird der Datenbank-Superuser von Hand angelegt. In meinem Fall war das aber schon geschehen, weswegen er nachträglich zum Superuser gemacht werden muss. Dies geschieht mittels des Kommandos

sudo -u postgres psql -c 'alter user <user> with superuser'

Nun können endlich die Daten importiert werden. Dies geschieht mit dem Kommando

./Nominatim/Nominatim/utils/setup.php --osm-file berlin-latest.osm.pbf --all

Sollte man davor irgendwas falsch gemacht haben und der obige Aufruf funktioniert nicht weil die Datenbank schon existiert, kann diese mittels sudo -u postgres dropdb nominatim gelöscht werden um einen neuen Anlauf zu nehmen.

Um weitergehende Suchmöglichkeiten zu haben, werden noch folgende Kommandos ausgeführt:

 ./utils/specialphrases.php --countries > specialphrases_countries.sql
 psql -d nominatim -f specialphrases_countries.sql
 ./utils/specialphrases.php --wiki-import > specialphrases.sql
 psql -d nominatim -f specialphrases.sql

Zur Benutzung mit Apache-Server aufsetzen

Verzeichnis anlegen und lesbar machen:

sudo mkdir -m 755 /var/www/nominatim
sudo chown www-data /var/www/nominatim

Symbolischen Link auf Nominatim-Installation erzeugen:

sudo ./utils/setup.php --create-website /var/www/nominatim

Nun die Datei /etc/apache2/sites-enabled/000-default mit Administratorrechten öffnen und folgenden Inhalt einfügen:

<Directory "/var/www/nominatim/">
   Options FollowSymLinks MultiViews
   AddType text/html   .php     
</Directory>

Nominatim aufrufen

Nominatim ist nun unter http://localhost/nominatim/ erreichbar. Allerdings wird noch die Online-OSM-Karte verwendet. Dies muss noch umgestellt werden und wird folgendermaßen erreicht:

Im Verzeichnis /var/www/nominatim/js müssen in allen JavaScript-Dateien die folgenden Zeichenketten geändert werden:

http://tile.openstreetmap.org/ in http://localhost/osm/
http://a.tile.openstreetmap.org/ in http://localhost/osm/
http://b.tile.openstreetmap.org/ in http://localhost/osm/
http://c.tile.openstreetmap.org/ in http://localhost/osm/

Update-Prozess einrichten

Wurde von mir noch nicht eingerichtet, kann unter http://wiki.openstreetmap.org/wiki/Nominatim/Installation nachgelesen werden.

.htaccess-Einstellungen wiederherstellen

Da mein Server ein per .htaccess-Datei geschütztes Verzeichnis besitzt und bei der Installation des Tile-Servers eine eigene Konfigurations-Datei installiert wurde muss diese bearbeitet werden um den Schutz aufrecht zu erhalten. Dafür müssen in der Datei /etc/apache2/sites-enabled/tileserver_site folgende Zeilen auskommentiert werden (gekennzeichnet durch #).

        <Directory />
                Options FollowSymLinks
#               AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
#               AllowOverride None
#               Order allow,deny
#               allow from all
        </Directory>

Um das Nominatim-Unterverzeichnis im Gegensatz zum Hauptverzeichnis für alle ohne Passwort freizugeben, wird nun noch folgendes in die Datei /var/www/nominatim/.htaccess geschrieben:

Order deny,allow
Allow from all

Nun ist noch ein Neustart des Servers von Nöten, dieser wird mittels service apache2 restart durchgeführt.

Tipps

Alle Kartenkacheln löschen

Wenn man es noch nicht ganz geschafft hat seiner Karte das gewünschte Aussehen zu verpassen und noch am Testen der Render-Regeln ist sollte man vor jedem Test der neuen Konfiguration alle bis dahin erzeugten Kartenkacheln löschen um sicherzugehen keine alten Daten anzuzeigen. Dafür führt man folgendes Kommando im Terminal aus:

sudo rm -r /var/lib/mod_tile/default

Danach folgt noch ein

sudo service renderd restart

um den renderd-Dienst neuzustarten. Beim Aufruf der Karte wird nun alles frisch gerendert.

Achtung: Dieses Vorgehen ist auf öffentlichen Servern nicht empfohlen, da danach erstmal jedermann eine komplett weiße Karte angezeigt bekommt bevor die entsprechenden Kacheln neu gerendert wurden. Dies kann gerade in den niedrigeren Zoomstufen lange dauern da dort dann viele Daten pro zu erzeugende Kachel anfallen.

Aussehen der Karte ändern

In der Datei /etc/mapnik_osm-data/osm.xml sowie in den beiden Unterordnern wird festgelegt, wie die Karte auszusehen hat. Hier können Änderungen vorgenommen werden um z.B. die Straßen in einer anderen Farbe erscheinen zu lassen oder um Objekte anzuzeigen die im Standard-Kartenstil überhaupt nicht angezeigt werden (z.B. die Hydranten in meiner Feuerwehr-Karte).

Dabei ist allerdings darauf hinzuweisen, dass die Konfiguration dieser Werte etwas kompliziert ist, ich selbst arbeite da eher nach dem Try & Error-Prinzip. Ich verweise deshalb an dieser Stelle auf Google um eine Anleitung zu finden wie der Kartenstil geändert/ergänzt wird.

Quellen

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information