DE:Mapnik
Der Begriff Mapnik wird bei OSM in zwei Zusammenhängen benutzt. Zum einen wird damit eine Software bezeichnet, mit der es möglich ist, aus einer Datenbank eine Karte zu erzeugen. Solch eine Zeichensoftware nennt man auch Renderer. Zum anderen wird diese Software dazu genutzt, um aus der OSM-Datenbank eine Karte zu erzeugen, die z.B. auf der Hauptseite von OSM dargestellt wird. Sie wird Mapnik-Darstellung von OSM oder kurz Mapnik genannt und ist auch unter der Bezeichnung Slippy Map bekannt. Dieser Artikel beschäftigt sich im Folgenden mit der Software an sich.
Die offizielle Homepage des Programmes Mapnik ist mapnik.org. Mapnik ist eine freie Werkzeugsammlung zum Rendern von Karten. Sie ist in C++ geschrieben, es gibt aber auch Python-Anbindungen. Sie nutzt die AGG-Bibliothek und bietet kantengeglättetes Rendern mit Genauigkeit im Subpixel-Bereich. Mapnik kann ESRI-Shapes, PostGIS und TIFF-Rastergrafiken lesen. Zur Zeit ist es am einfachsten, Mapnik unter Debian Linux selbst zu kompilieren, weil alle Abhängigkeiten einfach mittels apt-get aufgelöst werden können. Jedoch gibt es seit Version 0.5 Binaries für Windows und Mapnik konnte auch erfolgreich unter Mac OS 10.4 und 10.5 kompiliert werden.

OSM nutzt Mapnik, um Kartenkacheln von 256 × 256 px Größe zu rendern, die dann vom Kartenkachel-Server (tile.openstreetmap.org) bereitgehalten werden. Der JavaScript-Code der Slippy Map referenziert URLs wie z.B. http://tile.openstreetmap.org/7/63/42.png (Siehe auch Slippy map tilenames (en.)) für diese Grafik:
Contents
|
Datenquellen
Mapnik nutzt nicht nur OSM-Daten, um seine Karten zu erstellen. Küstenlinien beispielsweise werden u.a. unter Nutzung der Daten von VMAP Level 0 gerendert. Siehe auch Coastline#Main_Mapnik_Layer (en.).
Bugs
Bitte melde alle Bugs, die Du findest, über trac unter der "slippy_map"-Komponente und stelle sicher, daß der Fehler in neuerem Code noch nicht gefixt ist.
Vorschläge zur grafischen Darstellung / nicht gerenderte Karteneigenschaften
Auch diese sollten über das trac-System (s.o.) gemeldet werden.
Vorbereitung
(noch im Aufbau)
Datensätze
Um Kartenkacheln zu rendern, sind zwei große Datensätze erforderlich. Daher empfiehlt es sich, damit zu beginnen, sich zuerst diese Datensätze herunterzuladen.
Planet.osm
Planet.osm ist ein "Schnappschuss" der OpenStreetMap-Datenbank. Siehe Planet.osm (en.).
$ wget http://planet.openstreetmap.org/planet-latest.osm.bz2
Achtung: Wenn man nur ein kleines Gebiet für einen kurzen Test rendern möchte, kann man dafür jede .osm-Datei importieren; man muss nicht den kompletten Planeten rendern. Das ist empfehlenswert, wenn man auf die Schnelle prüfen möchte, dass das Rendern funktioniert, bevor man mehrere Stunden darauf verwendet, mehr als 13 GB herunterzuladen und die Daten der ganzen Erde zu importieren. Man erhält passende .osm-Dateien, indem man ein Gebiet in JOSM herunterlädt und abspeichert, oder indem man einen der kleineren Planeten-Ausschnitte nutzt, die unter Planet.osm#Extracts (en.) aufgeführt sind.
Grenzlinien (weltweit)
Mapnik nutzt externe Daten für Küstenlinien in kleinere Zoombereichen. Siehe Coastline#Main_Mapnik_Layer (en.).
$ wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz (50M) $ wget http://tile.openstreetmap.org/processed_p.tar.bz2 (359M) $ wget http://tile.openstreetmap.org/shoreline_300.tar.bz2 (45M)
Seit Juni 2010 benötigt osm-mapnik noch zwei zusätzliche Datenquellen:
$ wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-populated-places.zip # (1.5 MB) $ wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/110m-admin-0-boundary-lines.zip # (38 KB)
Alle Daten sollten so entpackt werden, dass die Einzeldateien unter mapnik/world_boundaries liegen, also insbesondere ohne weitere Unterverzeichnisse.
PostgreSQL / PostGIS
Im Folgenden wird davon ausgegangen, dass "username" durch den Namen des Benutzers, der Mapnik ausführen wird, ersetzt wird.
Installation
Für Debian Sarge (vormalig stable)
Als root, dann den Anweisungen für etch folgen
# echo deb http://www.backports.org sarge-backports main >> /etc/apt/sources.list # apt-get -t sarge-backports install ...
Für Debian Etch (und höher)
Um PostGIS (als root) zu installieren:
# aptitude install postgresql postgis
Für Ubuntu
# sudo apt-get install postgresql-8.3 postgis postgresql-8.3-postgis
Für Ubuntu (10.10)
# sudo apt-get install postgresql-8.4 postgresql-8.4-postgis postgresql-contrib-8.4
Für Fedora
Um PostGIS (als root) zu installieren:
# yum install postgis postgresql-server # service postgresql initdb # service postgresql start
Für Windows / Win32
- Herunterladen von http://www.postgresql.org/download/windows
- Version 8.4.5.1 läuft, Version 9.0 ohne Gewähr
- Nach der Installation den User Administrator anlegen, mit allen Zugriffsrechten.
- Die Passwortabfrage in der Datei /PostgreSQL/8.x/data/pg_hba.conf deaktivieren, indem man das Wort md5 gegen trust ersetzt.
Wichtig: Die Datenbank postgis wird von der Installation des postgresql Servers automatisch angelegt. osm2pgsql muss daher mit der Option -d postgis und nicht -d gis aufgerufen werden. Man kann aber auch jeden beliebigen anderen Datenbanknamen benutzen.
Wget Binary (Unix Befehle) für Windows
Download: http://users.ugent.be/~bpuype/cgi-bin/fetch.pl?dl=wget/wget.exe oder alle Unix Befehle http://downloads.sourceforge.net/unxutils/UnxUtils.zip?modtime=1172730504&big_mirror=0
Es gibt auch eine Wget Version mit eine grafischen Oberfläche, benötigt aber DotNet. Download VisualWget: http://khomsan.ph.googlepages.com/vwget-2.0.15-bin.zip für DotNet siehe http://khomsan.ph.googlepages.com/netfx2
Datenbank erstellen
Auf den meisten Systemen ist es nötig, dass man als der Super-User der PostgreSQL-Datenbank authentifiziert ist, um viele der folgenden Befehle auszuführen. Häufig kann man sich nicht als dieser Benutzer einloggen, Stattdessen sollte man ein Kommando wie dieses als Benutzer root ausführen:
# su - postgres $ <commands...>
oder
# sudo -u postgres <command>
oder auf Systemen wie Ubuntu, die eine Ausführung als root nicht zulassen:
user@machine$ sudo -u postgres -i postgres@machine$ <commands...>
Jetzt kann man als Benutzer postgres folgendes ausführen, um die Datenbank einzurichten:
$ createuser username $ createdb -E UTF8 -O username gis $ createlang plpgsql gis
PostGIS
Rechte für den Datenbank Zugriff auf den aktuellen Benutzer anpassen
Für Debian Etch (stable)
Als Benutzer postgres oder als PostgreSQL Super-User:
$ psql -d gis -f /usr/share/postgresql-8.1-postgis/lwpostgis.sql $ echo "ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;" | psql -d gis
Für Debian Lenny oder Sid (testing oder unstable)
Als Benutzer postgres oder als PostgreSQL Super-User:
$ psql -d gis -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql $ echo "ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;" | psql -d gis
Für Ubuntu
Als Benutzer postgres oder als PostgreSQL Super-User:
$ psql -d gis -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql $ echo "ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;" | psql -d gis
Achtung: aufpassen mit den Versionsnummern
Achtung: neuer Pfad/Dateiname bei PostgreSQL 8.4.x:
psql -d gis -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql
Für Fedora
Als Benutzer postgres oder als PostgreSQL Super-User:
$ psql -d gis -f/usr/share/pgsql/contrib/lwpostgis.sql $ echo "ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;" | psql -d gis
Für Windows
Installation von Postgis
Postgis herunterladen von: http://postgis.refractions.net/download/windows/#windbinaries
Die zum installierten PostgreSQL passende Version herunterladen:
postgis-pg84-setup-1.5.2-1.exe
User Name: postgres
Password: osm
Port: 5432
Database Name: postgis
neuen User anlegen:
%ProgramFiles%\PostgreSQL\8.4\bin\createuser -U postgres osmuser
Zwischenfrage superuser mit j beantworten
Neue Datenbank für osm2pgsql anlegen:
(vorzugsweise in batch-Datei osmdbneu.bat kopieren)
%ProgramFiles%\PostgreSQL\8.4\bin\createdb -U postgres -E UTF8 -O osmuser osmdb %ProgramFiles%\PostgreSQL\8.4\bin\createlang -U postgres plpgsql osmdb %ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmdb -f "%ProgramFiles%\PostgreSQL\8.4\share\contrib\postgis-1.5\postgis.sql" %ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmdb -f "%ProgramFiles%\PostgreSQL\8.4\share\contrib\postgis-1.5\spatial_ref_sys.sql" %ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmdb -f "%ProgramFiles%\PostgreSQL\8.4\share\contrib\hstore.sql"
osm2pgsql
osm2pgsql ist ein Konverter und Import-Werkzeug von Openstreetmap-Daten nach PostgreSQL
Für Debian Etch (stable)
Zuerst muss man die Lenny-Distribution (testing) zur Liste der Paketquellen in /etc/apt/sources.list hinzufügen (als Benutzer root):
# echo deb-src http://ftp.uk.debian.org/debian/ testing main >> /etc/apt/sources.list # apt-get update
Jetzt kann man das osm2pgsql-Package erstellen und installieren (als Benutzer root):
# apt-get build-dep osm2pgsql # apt-get -b source osm2pgsql # dpkg -i osm2pgsql_0.08.20071007-1_i386.deb
Die Versionsnr. im Dateinamen ist inzwischen natürlich eine andere.
Für Debian Lenny oder Sid (testing or unstable)
osm2pgsql ist bereits als Package verfügbar, so daß man es einfach installieren kann!
aptitude install osm2pgsql
Für Ubuntu
osm2pgsql ist bereits als Package verfügbar, so daß man es einfach installieren kann:
sudo apt-get install osm2pgsql
Fedora
Löse die Abhängigkeiten auf:
yum install geos-devel proj-devel
Folge den Schritten zur Installation auf Basis des Quellcodes "From source".
Aus dem Quellcode
$ svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/ $ cd osm2pgsql $ make
Windows / Win32 Binary
Download-Quelle der osm2pgsql Win32 Binary Version:
Herunterladen und in das Verzeichnis des Planet-File kopieren/entpacken.
Wichtig: Diese Version funktioniert (lt. Test) nicht mit allen Planet-Files. Es erscheint nach c.a. 240000k Nodes die Fehlermeldung: Error allocating nodes, insofern schein es da eine Begrenzung bzw. einen Fehler in der Version zu geben.
Danach unter (Windows) Start->Ausführen->cmd (und Enter) und in das Planet-File Verzeichnis wechseln. Beispiel (Wäre das Verzeichnis des Planet-File f:\osmdata):
f: cd osmdata osm2pgsql -d osmdb -S Pfad zum default.style/default.style planet-latest.osm.bz2
Sehr wichtig: Ich habe hier osmdb als Datenbankname angegeben, wie weiter oben angelegt. Man kann auch die von postgis installierte Datenbank gis oder postgis nehmen. Bei Windows ist die Angabe eines default.style sehr wichtig, da der defaultwert hier einen Unixpfad enthält der ein Ausführen verhindert. Die default.style solltet ihr in eurem osm2pgsql Verzeichnis finden. Zudem muss man nach der Installation den User mit dem Windowsanmeldenamen anlegen. angelegt haben, mit allen Zugriffsrechten und die Passwortabfrage in der Datei /PostgreSQL/8.x/data/pg_hba.conf deaktivieren, indem man das Wort md5 gegen trust ersetzt. Das lässt sich unter Windows auch mit dem pgAdmin III erledigen. Alternativ kann man auch die Parameter -U für User und ein Passwort mit angeben. Die genaue Syntax erhält man bei Aufruf von osm2pgsql --help
Erst danach funktioniert der Befehl (ohne die üblichen Fehlermeldung ... fe_sendauth: no password supplied oder function addgeometrycolum ... not found).
Performance: Der Speicherverbrauch geht ueber die 1GB Grenze hinaus, daher ist es wichtig den virtuelle Speicher aktiviert zu haben und diesen auf einer eigenen Partition zu legen. Die Verarbeitungsgeschwindigkeit liegt bei c.a. 30.000 Nodes/Sekunde (Getestest mit einer 3.2GHz CPU und 1GB RAM).
Virtueller Speicher trotz 4095 zu klein: Sollte der virtuelle Speicher nicht ausreichen kann man (unter WindowsXP/2000) diesen auf einzelne Ordner der gleichen Partition verteilen, um die 4095 Grenze zu übergehen. Siehe: http://support.microsoft.com/kb/237740
Wer weniger Speicher zur Verfügung hat kann osm2pgsql auch im slim mode betreiben. Dazu einfach --slim als Parameter übergeben und bei bedarf auch die Speichergröße mit --cache xxxxMB begrenzen. Hier aber nicht den gesamten Arbeitsspeicher eintragen; das Betriebssystem möchte auch noch ein paar MB für sich beanspruchen dürfen ;-)
Mapnik
Für Debian Etch (stable)
Hole das Mapnik-Quellpaket sowie abhängige Pakete mit den folgenden Befehlen:
# aptitude install libboost-thread-dev libboost-filesystem-dev libboost-regex-dev \ libboost-program-options-dev libboost-python-dev libboost-serialization-dev \ libpng12-dev libjpeg62-dev libtiff4-dev zlib1g-dev libfreetype6-dev libpq-dev proj \ libltdl3-dev libfribidi-dev python debhelper python-all-dev python-central # apt-get source python-mapnik
Wende den folgenden Patch an, so daß Mapnik für Python 2.4 erstellt wird:
--- mapnik-0.4.0/debian/rules 2007-12-19 14:13:11.000000000 +0000
+++ mapnik-0.4.0-etch/debian/rules 2007-12-12 21:47:16.000000000 +0000
@@ -14,7 +14,7 @@
SOVER=${SONAME}.0.0
# scons flags
-SCONS_FLAGS=PROJ_INCLUDES=/usr/include PGSQL_INCLUDES=/usr/include/postgresql PROJ_LIBS=/usr/lib DESTDIR=$(CURDIR)/debian/tmp PREFIX=/usr BIDI=yes PYTHON=/usr/bin/python2.5
+SCONS_FLAGS=PROJ_INCLUDES=/usr/include PGSQL_INCLUDES=/usr/include/postgresql PROJ_LIBS=/usr/lib DESTDIR=$(CURDIR)/debian/tmp PREFIX=/usr BIDI=yes PYTHON=/usr/bin/python2.4
CFLAGS = -Wall -g
Wechsele in das Verzeichnis mapnik-0.4.0 und führe die folgenden Kommandos aus, um das Paket zu kompilieren: (Achtung: Der Parameter -d ist erforderlich, weil die Datei debian/control höhere Versionen für einige Pakete auflistet als diejenigen, die in Etch enthalten sind. Entweder muß also die control-Datei angepasst oder einfach der Parameter -d genutzt werden)
$ cd mapnik-0.4.0 $ fakeroot dpkg-buildpackage -d
Wechsele in das übergeordnete Verzeichnis und installiere die erstellten Pakete als Benutzer root:
$ cd .. $ su # dpkg -i python-mapnik_0.4.0-2_i386.deb libmapnik1d_0.4.0-2_i386.deb mapnik-plugins_0.4.0-2_i386.deb mapnik-utils_0.4.0-2_i386.deb
Für Debian Lenny oder Sid (testing or unstable)
Mapnik ist bereits als Package verfügbar, so daß man es einfach installieren kann:
# aptitude install python-mapnik
Für Ubuntu
Mapnik ist bereits als Package verfügbar, so daß man es einfach installieren kann:
# sudo apt-get install python-mapnik
Kompilieren des neuen Mapnik 0.5 vom Quellcode unter Debian Etch (stable)
Außer den oben für Mapnik 0.4 angegebenen Abhängigkeiten benötigt man iostreams aus der boost-Bibliothek:
# aptitude install libboost-iostreams-dev
Als nächsten Schritt muss man einige symbolische Verknüpfungen erstellen. Der letzte für GDAL ist für OSM nicht notwendig, aber wenn man es auf dem eigenen System installiert hat und es mit Mapnik nutzen möchte, ist auch diese Verknüpfung erforderlich.
# cd /usr/lib # ln -s libboost_filesystem.so libboost_filesystem-mt.so # ln -s libboost_regex.so libboost_regex-mt.so # ln -s libboost_iostreams.so libboost_iostreams-mt.so # ln -s libboost_program_options.so libboost_program_options-mt.so # ln -s libboost_thread.so libboost_thread-mt.so # ln -s libboost_python.so libboost_python-mt.so # ln -s libgdal1.3.2.so libgdal.so
Als nächstes kann man Mapnik kompilieren und installieren. "XMLPARSER=libxml2" am Ende jeder Zeile ist nur dann erforderlich, wenn man XML-Entities in seinen Stylesheets nutzen möchte.
$ cd /path/where/you/unpacked/the/mapnik/0.5/source/ $ python scons/scons.py PGSQL_INCLUDES=/usr/include/postgresql PROJ_INCLUDES=/usr/include PROJ_LIBS=/usr/lib XMLPARSER=libxml2 # python scons/scons.py install PGSQL_INCLUDES=/usr/include/postgresql PROJ_INCLUDES=/usr/include PROJ_LIBS=/usr/lib XMLPARSER=libxml2
Gemäß den Voreinstellungen wird Mapnik im Verzeichnis /usr/local/lib installiert, so dass man diesen Pfad zur Konfigurationsdatei /etc/ld.so.conf hinzufügen und anschließend 'ldconfig' (als root) ausführen muss.
# cat << "EOF" >> /etc/ld.so.conf > /usr/local/lib > EOF # ldconfig
Für Microsoft Windows (Windows 2000 und höher)
- Download von Python 2.6: http://www.python.org/download/releases/2.6.6/
(neuere Versionen von Python werden noch nicht mit Mapnik unterstützt)
- Installation nach C:\Python26\
- Download von Mapnik: http://mapnik.org/download/
- (Wichtig!) Entpacken in C:\mapnik-0.7.1\ (sonst muss man in der Installation noch Pfade umändern)
Systemvariablen ändern
Öffne dazu Systemsteuerung -> System dann den Reiter Erweitert und dort die Umgebungsvariablen. Erstelle eine neue Umgebungsvariable mit folgenden Werten. Achtung! Nur neu anlegen, wenn PATH noch nicht vorhanden ist. Ansonsten muss der Wert vor das vorhandene gesetzt werden.
Name: PATH Wert: C:\mapnik-0.7.1\lib;C:\Python26;...
Eine weitere für Python
Name: PYTHONPATH Wert: C:\mapnik-0.7.1\python\2.6\site-packages
- Diese Systemvariablen testen
In die Kommandozeile wechseln (Start - Ausführen - CMD)
folgendenden Befehl eingeben: PATH Jetzt sollte PATH=C:\mapnik-0.7.1\lib erscheinen
- Python testen
Öffne Python auf der Kommandozeile C:\Python26\python.exe In der nun geöffneten Python Konsole folgenden Befehl eingeben: "from mapnik import *" (ohne ")
Sollte hier kein Fehler erscheinen dann ist alles richtig. Die Python Konsole wird mit "Ctrl + Z" bzw. "Strg + Z" beendet.
- Demo ausprobieren
Unter C:\mapnik-0.7.1\demo\python befindet sich die rundemo.py
Diese Datei kann man per Doppelklick direkt im Explorer aufrufen.
Oder man nutzt die Kommandozeile
cd c:\mapnik-0.7.1\demo\python\ C:\Python26\python.exe rundemo.py
Wenn alles funktioniert, sind die Dateien demo.png, demo256.png, demo_high.jpg und demo_low.jpg im selben Verzeichnis zu finden.
Laden von Daten
Führe einfach osm2pgsql aus (als derjeniger Nutzer, der Mapnik ausführen wird):
$ osm2pgsql -m -d gis planet-latest.osm.bz2
Dieser Vorgang erfordert eine beträchtliche Menge an verfügbarem Arbeitsspeicher (nach einer groben Schätzung mindestens 512 MB). Falls ihm der Speicher ausgeht, kann er auf verschiedene, unvorhersehbare Weise abbrechen (zB mit einer Nachricht, derzufolge die .osm-Datei fehlerhaft sei). Man sollte sicherstellen, daß freier Arbeitsspeicher und Swap-Space in ausreichendem Maß verfügbar ist, bevor osm2pgsql ausgeführt wird.
Die Option "-m" aktiviert die Nutzung der sphärischen Mercator-Projektion, die nunmehr empfohlen wird. Einige Werkzeuge nutzen noch immer eine leicht inkorrekte Projektion, die einige Fehler verursachen kann.
Der neueste osm2pgsql-Code unterstützt zudem einen einfachen Bounding-Box-Filter während des Imports, der den Ablauf deutlich beschleunigen kann, wenn man nur einen kleinen Teil der Weltkugel rendern möchte. Wenn man beispielsweise nur London aus dem UK-Planet-Ausschnitt importieren möchte:-
$ osm2pgsql --bbox -0.5,51.25,0.5,51.75 -m -d gis uk-080213.osm.bz2
Entpacke die neuen Küstenlinien-Daten
$ unzip processed_p.zip
Lade diese Daten in die Postgres-DB und richte die Zugriffsreche ein:
$ shp2pgsql -s 900913 -I -g way processed_p shoreline_a | psql -q gis $ psql gis gis=> alter table shoreline_a alter column way set not null; ALTER TABLE gis=> CLUSTER shoreline_a_way_gist on shoreline_a; CLUSTER gis=> grant select on shoreline_a to public; GRANT gis=> \q $
Einige möglicherweise auftretende Probleme
Wenn man versucht, eine mit gzip komprimierte planet-Datei zu laden, die größer als 2 GB ist, kann eine Fehlermeldung erscheinen, derzufolge die Datei nicht geöffnet werden kann. Dies wird durch einen Fehler in einigen Versionen der zlib-Bibliothek verursacht, die das O_LARGEFILE-Flag nicht an open() weitergeben können. Das Problem kann man umgehen, indem man einen externen gzip-Prozess nutzt, der nicht von diesem Fehler betroffen ist. Die Angabe des Dateinamens "-" veranlasst osm2pgsql, die Daten von der Standard-Eingabe (STDIN) zu lesen.
$ gzip -dc planet-080213.osm.gz | osm2pgsql -m -
Nach einigen Stunden kann der Import mit einer Fehlermeldung wie dieser abbrechen:
ANALYZE planet_osm_line; failed: ERROR: deadlock detected DETAIL: Process 28511 waits for AccessExclusiveLock on relation 1064115 of database 18309; blocked by process 12776. Process 12776 waits for ShareLock on transaction 572766655; blocked by process 28511. Error occurred, cleaning up
Dies scheint ein Fehler von PostgreSQL zu sein und tritt dann auf, wenn das System versucht, ein auto-vacuum während der ANALYZE auszuführen. Die Lösung besteht darin, alle auto-vacuums in der Datenbank zu deaktivieren. Die Daten werden nach dem Import nicht aktualisiert, so dass der Vakuum-Vorgang nichts sinnvolles ausführt. Dazu setzt man in der Datei postgresql.conf die folgende Option:
autovacuum = off
Anschließend muss der Datenbank-Server neu gestartet werden:
# /etc/init.d/postgresql-8.1 restart
Achtung: Unter Debian/Ubuntu muss auch /etc/cron.d/postgresql-common aktualisert werden, indem die beiden pg_maintenance-Tasks auskommentiert werden, die anderenfalls Vakuum-Läufe in regemäßigen Abständen anstoßen würden:-
# Run VACUUM ANALYSE on all databases every 5 hours if pg_autovacuum is not # running # 2 0,5,10,15,20 * * 1-6 root if [ -x /usr/sbin/pg_maintenance ]; then /usr/sbin/pg_maintenance --analyze >/dev/null; fi # On Sunday you may wish to run a VACUUM FULL ANALYSE as well # If you do not run a 24/7 site, you may want to uncomment the next line # so as to do a regular VACUUM FULL. If you need 24/7 connectivity, save # VACUUM FULL for when you think you really need it. # 10 3 * * Sun root if [ -x /usr/sbin/pg_maintenance ]; then /usr/sbin/pg_maintenance --full --analyze >/dev/null; fi
Rendern mit Mapnik
Allgemein
Entpacke die Daten für Lowzoom und die Küstenlinien irgendwo:
$ tar xzf world_boundaries-spherical.tgz
Rufe Mapnik aus dem OSM-Subversion-Repository ab (SVN Checkout):
$ svn checkout http://svn.openstreetmap.org/applications/rendering/mapnik $ cd mapnik
The osm.xml file is built up out of the core osm.xml file and XML include files in the inc/ directory. The inc/ directory holds 3 .template files, which are used as inputs for the generate_xml.py script:
./generate_xml.py -h
Check to see if the defaults that the script provides are ok for you. You'll have to provide the values where there are no defaults. For instance:
./generate_xml.py --host localhost --user `whoami` --dbname gis --symbols ./symbols/ --world_boundaries ./world_boundaries/ --port 5432 --password 'something'
This command takes the .template files from inc/ and creates non-template versions of those files, with your settings. If you can not or do not want to run the script, you can do this by hand as well. Updating the stylesheet from SVN is now as easy as running an 'svn update'. SVN will never touch the generated settings files. If there is ever a new option added to the .template files, only then do you need to run the generate_xml.py script again.
After you have set up the stylesheet this way, you can point mapnik to the osm.xml file. The osm.xml file draws in the files in the inc/ directory, through the use of XML entities. You do not need to create another copy of the stylesheet.
Man kann entscheiden, welche Gebiete gerendert werden sollen, indem man Bounding-Boxen und Zoomlevel in generate_(tiles|image).py angibt.
Jetzt kann man das Skript ...
$ ./generate_tiles.py
... oder ...
$ ./generate_image.py
ausführen, um Karten zu erstellen.
Umwandeln von Stylesheets für Versionen > 2.0.0
Es wurden einige Veränderungen an den Spezifikationen der Stylesheets während des Upgrades auf Version 2.0.0 gemacht. Sämtliche Veränderungen werden hier beschrieben.
Dementsprechen müssen 'alte' Stylesheets auf die neuen Anforderungen angepasst werden.
Praktischerweise wird von den Entwicklern direkt ein einsprechendes Skript ('upgrade_map_xml.py') geliefert, welches die Konvertierung übernimmt.
Es befindet sich in dem Ordner:
../$mapnik_home_directory/utils/upgrade_map_xml/
Einfach das eingeben:
./upgrade_map_xml.py ../$mapnik_scripts/old_style.xml ../$mapnik_scripts/new_style.xml
Oder so, um das Original direkt zu überschreiben:
./upgrade_map_xml.py ../$mapnik_scripts/old_style.xml --in-place
Alte Inhalte (noch nicht komplett übersetzt)
Im Folgenden finden sich verschiedene, nicht mehr aktuell Informationen sowie Hinweise, die schlicht noch nicht in die Erläuterungen weiter oben eingefügt wurden,
Herunterladen
Es ist wahrscheinlich das beste, als erstes den OSM SVN-Verzeichnisbaum herunterzuladen (SVN Checkout): siehe Getting The Source (en.). Die Mapnik-Quelltexte werden automatisch mit diesem Verzeichnisbaum verknüpft und erscheint unter svn.openstreetmap.org/applications/rendering/mapnik/mapnik.org/ (Das scheint nicht mehr aktuell zu sein -- Florianschmitt 20:04, 1 March 2008 (UTC))
Stattdessen kann der Mapnik-Quelltext auch für sich allein von mapnik.org heruntergeladen werden.
svn co svn://svn.mapnik.org/trunk mapnik
Dann kann man in das Verzeichnis mapnik wechseln und die Software wie unten dargestellt kompilieren.
Benötigte Bibliotheken
- gcc/g++ compiler
- boost
- libpng
- libtiff
- libjpeg
- libltdl
- freetype2
- libpq
- foro
- postgresql access
- python-devel
Für Fedora
kann unvollständig sein
yum install libpng-devel libtiff-devel libjpeg-devel \ libtool-ltdl-devel proj-devel boost-devel freetype-devel \ libpqxx-devel postgis geos-devel python-devel libxml2-devel
Achtung: Wenn man Mapnik kompiliert, muss man berücksichtigen, daß Mapnik nach den multithreaded Versionen der boost-Bibliotheken sucht. die vor FC8 nicht verfügbar waren. Wenn man also unter einer älteren Version arbeitet, muss man ggf. die Option THREADING=single nutzen.
Es ist auch ein RPM von Mapnik zum Download verfügbar. Das Mapnik-RPM wurde zur Übernahme in Fedora vorgeschlagen. Mit den folgenden Befehlen installiert man das aktuelle RPM:
rpm -ivh http://www.passback.org.uk/packages/fedora/7/i386/passback-release-7-1.fc7.noarch.rpm yum install mapnik
Diese Befehle sollten nun Mapnik installieren und die nötigen Abhängigkeiten berücksichtigen.
Für Gentoo
Um die nötigen Software-Pakete zu installieren, kann man folgendes versuchen:
emerge --ask --noreplace dev-libs/boost media-libs/libpng \ media-libs/tiff media-libs/jpeg media-libs/freetype \ sci-libs/proj dev-db/postgis sci-libs/gdal
Vorsicht: dev-libs/boost müssen mit dem "threads" USE Flag kompiliert werden -- wird es nicht gesetzt, wird man eine boost_thread-mt Fehlermeldung erhalten..
Nach der Kompilierung kann man PstgreSQL mit dem Kommando
emerge --config =postgresql-8.0.13
einrichten und der Server mit
/etc/init.d/postgresql start
starten.
Falls der Server sich weigert, zu starten, weil keine Konfigurationsdatei vorhanden ist, kann man folgendes (als root) versuchen:
su -s /bin/bash -c "initdb -D /var/lib/postgresql/data" postgres
Jetzt sollte es möglich sein, den PostgreSQL-Server zu starten.
Den Quelltext übersetzen (kompilieren) und installieren
Ggf. Verlinken der Boost-Bibliotheken
Debian: Verlinken der Boost-Bibliotheken
ln -s /usr/lib/libboost_python.so /usr/lib/libboost_python-gcc-mt.so
(Dies ist notwendig, weil der Linker die letztere Bibliothek erwartet, das Debian-Softwarepaket aber die erstere bereitstellt.)
Unter Debian Etch wird man auch die folgenden, für Ubuntu angegebenen Kommandos ausführen müssen, i had to issue the following commands described for Ubuntu - Florianschmitt 20:55, 17 November 2007 (UTC)
Debian: Verlinken der Boost-Bibliotheken
Unter Ubuntu muss man möglicherweise die folgenden Befehle im Verzeichnis /usr/lib ausführen:
ln -s libboost_python.so libboost_python-mt.so ln -s libboost_thread.so libboost_thread-mt.so ln -s libboost_filesystem.so libboost_filesystem-mt.so ln -s libboost_regex.so libboost_regex-mt.so ln -s libboost_program_options.so libboost_program_options-mt.so
Kompilieren / installieren
Unter allen Betriebssystemen: zum Installieren
python scons/scons install
ausführen, oder ohne Bindings:
python scons/scons install BINDINGS=none
Unter Debian muss man ggf.
python scons/scons install THREADING=single
nutzen, um scons dazu zu bringen, die boost-Bibliotheken zu finden.
Unter Gentoo muss man eventuell folgendes ausführen:
python scons/scons GDAL_INCLUDES=/usr/include/ install
Demo-Grafik rendern
Ist die Installation abgeschlossen, kann man versuchen, das Demo im Verzeichnis mapnik/demo/c++ auszuführen:
g++ -O3 -I/usr/local/include -I/usr/include/boost -I/usr/include/freetype2 -L/usr/local/lib -lmapnik rundemo.cpp -o rundemo
und dann
./rundemo /usr/local/lib/mapnik/input
eingeben. Diese Befehle sollten eine JPEG- und eine PNG-Grafik einer Karte generieren.
Falls man eine Fehlermeldung wie folgende erhält:
./rundemo: error while loading shared libraries: libmapnik.so: cannot open shared object file: No such file or directory
muss man wahrscheinlich sicherstellen, dass das Verzeichnis /usr/local/lib in /etc/ld.so.conf aufgelistet ist, und ldconfig als root ausführen.
PostgreSQL
Note: On most PostgreSQL installs, you'll need to be root to be able to connect to the database as the postgres user (-Upostgres). Alternatively you may execute "su postgres" as root to take on the privileges of the postgres administrator. If you have problems connecting as postgres, or wish to change who can connect as postgres, you'll need to edit your pg_hba.conf, and possibly also pg_ident.conf.
If your user account hasn't been setup for postgres, run
createuser -Upostgres
and follow the prompts.
If you don't already have a database set up, you'll need to create one. If your user has "create database" privileges, just do:
createdb -EUNICODE <DBNAME>
Otherwise, you'll need to create the database as the postgres user, and then grant rights to yourself:
createdb -Upostgres -EUNICODE <DBNAME> psql -Upostgres <DBNAME> GRANT ALL ON SCHEMA PUBLIC TO <USERNAME>; \q
Note: the osm2pgsql program assumes the database name is gis, so you will need to use that unless you want to change the osm2pgsql code.
You are now ready to setup the PostGIS extensions.
PostGIS
You will need to set up various functions, tables etc as the database superuser (postgres). Once they are setup, you can grant permissions on them to the user you'll normally user.
You might need to copy usr/lib/postgresql/8.1/lib/liblwgeom.so.1.1 to /opt/postgresql/lib, creating the directory if needed. Then, add /opt/postgresql/lib to a new file /etc/ld.so.conf.d/postgis.conf, and run ldconfig.
Set up the Mapnik PostGIS plugin
python scons/scons.py PGSQL_INCLUDES=/usr/include/postgresql PGSQL_LIBS=/usr/lib/postgresql/8.1/lib install
Create the plpgsql language in the DB
For PostgreSQL earlier than v8.0, use psql -Upostgres <DBNAME>, and execute:
create language plpgsql;
For PostgreSQL 8.0 and later, run:
createlang -Upostgres plpgsql <DBNAME>
Load the postgis extensions
psql <DBNAME> < lwpostgis.sql
- Note 1: If you get permissions errors, add -Upostgres before <DBNAME>
- Note 2: If you don't know where lwpostgis.sql is, check
/usr/share/postgresql/contrib/(or/usr/share/postgresql-<version>-postgis/lwpostgis.sql).
To give your normal user permissions on the new PostGIS stuff, run psql -Upostgres <DBNAME>, and execute:
GRANT ALL on geometry_columns TO <DBUSER>; GRANT ALL on spatial_ref_sys TO <DBUSER>;
Getting planet.osm in to the db
Prerequisites
Geos
Get geos:
- On Debian, install 'libgeos-dev'
- On Gentoo, emerge sci-libs/geos
Otherwise:
cd /opt svn co http://svn.refractions.net/geos/trunk geos cd geos ./autogen.sh ./configure make
UTF8sanitize
Compile UTF8sanitize:
cd svn.openstreetmap.org/applications/utils/planet.osm/C make
7z
If you want to download the smaller 7z-compressed planets, get 7z
- On Gentoo: emerge app-arch/p7zip
osm2pgsql
cd svn.openstreetmap.org/applications/utils/export/osm2pgsql make
Importing planet.osm
Download planet.osm. Then, change to the osm2pgsql directory (cd svn.openstreetmap.org/applications/utils/export/osm2pgsql), and run the importer as follows:
If you have the 7-zip archive of planet.osm, use:
7z x -so /path/to/planet.osm.7z | ./osm2pgsql -
If you have the bzip2 version:
./osm2pgsql /path/to/planet.osm.bz2
or
bzcat planet.osm.bz2 | ./osm2pgsql -
If you already have planet.osm uncompressed, then you can simply do:
./osm2pgsql planet.osm
This process requires significant amounts of free memory (by rough estimate, at least 512 MB). If it runs out of memory, it can fail in somewhat unpredictable ways (e.g. messages suggesting that errors exist in the .osm file). Make sure that you have sufficient free RAM and swap space available before running osm2pgsql.
You can also enable a pgsql intermediate storage by calling osm2pgsql with the -s (or --slim) option. osm2pgsql will then store the intermediate data in the database, thereby using less RAM, but it will be much slower.
Note that that will connect to database 'gis' by default. If you want to use another database name, you'll need to pass it at run time (e.g. osm2pgsql -d foo )
Setting up mapnik
Mapnik uses external data for lower zoom levels, so you'll have to get that first (about 600M tarball, 1.2G unpacked):
wget http://artem.dev.openstreetmap.org/files/world_boundaries.tar.bz2 tar xjf world_boundaries.tar.bz2
Checkout the Mapnik stuff from the OSM subversion repository at svn.openstreetmap.org/applications/rendering/mapnik .
Create a local copy of the "set-mapnik-env" script and edit it to fit your local file names etc. All the settings are documented inside this script.
Create the osm.xml file from osm-template.xml by calling:
source ./set-mapnik-env ./customize-mapnik-map >$MAPNIK_MAP_FILE
You can now call
./generate_tiles.py
or
./generate_image.py
to generate maps.
More stuff
See in Trac: http://trac.openstreetmap.org/browser/applications/rendering/mapnik