Fr:Mapnik

From OpenStreetMap

Jump to: navigation, search
Other languages: +/-

English  •  Deutsch  •  Français  • 

Mapnik est un logiciel libre de rendu de carte qui est utilisé par OSM pour dessiner la carte principale.

Le site officiel se trouve à l'adresse mapnik.org. Mapnik est écrit en C++ avec quelques scripts en Python. Il utilise la librairie AGG et fournit un rendu anticrénelage (anti-aliasing) jusqu'au sous-pixel. Il peut lire les formes ESRI et les formats de données PostGIS et TIFF. Actuellement, il est plus facile de compiler mapnik depuis les sources sous Linux parce que toutes les dépendances peuvent être facilement récupérées avec apt-get. Cependant, les fichiers binaires sont aussi disponibles pour Windows depuis la version 0.5 et mapnik a été aussi compilé avec succès sur Mac OS 10.4 et 10.5.

OSM utilise Mapnik pour dessiner des carrés de 256 x 256 px, qui sont ensuite délivrés à partir du serveur de pavés (tile server) à l'adresse tile.openstreetmap.org. La carte glissante en JavaScript référence ensuite les URLs comme par exemple http://tile.openstreetmap.org/7/63/42.png pour cette image:

42.png

Voir aussi Slippy map tilenames

Contents

Source des données

Mapnik n'utilise pas uniquement les données fournies par OSM pour créer ses cartes. Les lignes côtières, par exemple, sont créées à partir de données provenant de VMAP0. Voir Coastline#Main_Mapnik_Layer (NDT: cette information est peut-être obsolète. A vérifer)

Bugs

N'hésitez pas à rapporter des bugs si vous en trouvez dans le système trac sous le composant "slippy_map" et vérifiez que le nouveau code a corrigé le problème.

Suggestions et caratéristiques non-dessinées

Encore un fois, reportez vos remarques dans le système trac mentionné ci-dessus.

Préparation

En quelques mots, Mapnik va avoir besoin des données OSM pour tracer la carte mais il n'est pas capable (pas encore) de lire directement ces informations depuis la base de données OSM ou depuis un fichier .osm. Il peut le faire par contre à partir d'une base de données locale PostgreSQL/PostGIS (qui est aussi libre) et qui présente aussi l'avantage d'accélérer les temps d'accès aux données nécessaires pour chaque pavé. Il faudra juste copier les données d'OSM dans cette base en utilisant un petit logiciel appelé 'osm2pgsql' qui se charge en même temps de filtrer les données et de ne prendre que les données reconnues par Mapnik.

DataSets

Il y a deux grands ensembles de données nécessaires pour faire le rendu des pavés. C'est donc probablement une bonne idée de commencer par les télécharger en premier lieu.

Planet.osm

Planet.osm est un fichier XML qui est un instantané de la base de donnée d'OpenStreetMap. Voir Planet.osm

$ wget http://planet.openstreetmap.org/planet-latest.osm.bz2

Note: Si vous voulez juste faire le rendu d'une petite zone pour faire un test rapide, alors vous pouvez importer n'importe quel fichier .osm, vous n'avez pas besoin de prendre l'ensemble de la planète. Ceci est particulièrement recommandé si vous voulez rapidement vérifier que le logiciel de rendu fonctionne avant de vous lancer dans un long processus de téléchargement et d'import dans la base de donnée qui prendra de nombreuses heures. Vous pouvez récupérer un fichier .osm qui vous convient en téléchargeant une petite zone avec JOSM par exemple ou en utilisant un des nombreaux extraits de la planète disponibles sur Planet.osm#Extracts.

Limites terrestres du monde

Pour les niveaux de zoom les plus bas, Mapnik utilise des données externes pour les lignes côtières. Voir Coastline#Main_Mapnik_Layer

$ wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz (51MB)
$ wget http://hypercube.telascience.org/~kleptog/processed_p.zip (~200MB)

PostgreSQL / PostGIS

Les instructions suivantes supposent que vous remplaciez le nom d'utilisateur par celui qui sera utilisé pour exécuter mapnik

Installation

Pour Debian Sarge (ancienne version stable)

En temps que root, suivez les instructions suivantes

# echo deb http://www.backports.org sarge-backports main >> /etc/apt/sources.list
# apt-get -t sarge-backports install ...
Pour Debian etch (ou dernière version stable)

Pour installer PostGIS (en tant que root):

# aptitude install postgresql-postgis

ou avec Ubuntu:

# sudo apt-get install postgresql-8.3-postgis
Pour Fedora

Pour installer PostGIS (en tant que root):

# yum install postgis postgresql-server
# service postgresql initdb
# service postgresql start

Créer la base de données

Sur la plupart des systèmes, vous devez vous authentifier comme le super-utilisateur PostgreSQL pour pouvoir exécuter les commandes ci-dessous. Souvent, vous ne pouvez pas vous enregistrer en tant que tel. Si ça n'est pas possible, essayez la commande suivant en tant que root:-

# su - postgres
$ <commands...>

ou

# sudo -u postgres <command>

ou sur un système comme Ubuntu qui ne veut pas vous laisser travailler en tant que root

user@machine$ sudo -u postgres -i
postgres@machine$ <commands...>

Maintenant, en tant qu'utilisateur postgres, mettez en place la base de données:

$ createuser username
$ createdb -E UTF8 -O username gis
$ createlang plpgsql gis

PostGIS

Pour Debian Etch (stable)

En tant qu'utilisateur postgres ou que super-utilisateur postgresql:

$ 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
Pour Debian Lenny ou Sid (en test ou instable)

En tant qu'utilisateur postgres ou que super-utilisateur postgresql:

$ psql -d gis -f /usr/share/postgresql-8.2-postgis/lwpostgis.sql
$ echo "ALTER TABLE geometry_columns OWNER TO username; ALTER TABLE spatial_ref_sys OWNER TO username;"  | psql -d gis
Pour Fedora

En tant qu'utilisateur postgres ou que super-utilisateur postgresql:

$ 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

osm2pgsql

osm2pgsql est un outil d'Openstreetmap pour convertir et charger les données dans PostgreSQL

Pour Debian Etch (stable)

D'abord, vous devez ajouter lenny (testing) dans votre /etc/apt/sources.list (comme root):

# echo deb-src http://ftp.uk.debian.org/debian/ testing main >> /etc/apt/sources.list
# apt-get update

Maintenant vous pouvez construire et installer le paquet osm2pgsql (en tant que root):

# apt-get build-dep osm2pgsql
# apt-get -b source osm2pgsql
# dpkg -i osm2pgsql_0.08.20071007-1_i386.deb

Pour Debian Lenny ou Sid (en test ou instable)

osm2pgsql est déjà dans la liste des paquets alors vous avez juste à l'installer!

aptitude install osm2pgsql

Fedora

Récupérez les dépendances

yum install geos-devel proj-devel

Suivez les instructions "A partir des sources"

A partir des sources

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

Avec Ubuntu, vous aurez besoin des paquets suivants:

$ sudo apt-get install build-essential libxml2-dev libgeos-dev libpq-dev libbz2-dev

Mapnik

Pour Debian Etch (stable)

Récupérez le paquet des fichiers sources et dépendances en utilisant les commandes suivantes:

# 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

Appliquez le changement suivant pouvoir utiliser python 2.4

--- 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

Allez dans le répertoire mapnik-0-4-0 et exécutez la commande suivante pour construire le paquet (note, le -d est nécessaire car le fichier de contrôle debian liste des version supérieures à ce qui est livré avec etch pour quelques paquets, soit éditez le fichier de contrôle ou utilisez -d)

$ cd mapnik-0.4.0
$ fakeroot dpkg-buildpackage -d

Allez dans le répertoire supérieur, basculez sur l'utilisateur root et installez les paquets résultant:

$ 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

Pour Debian Lenny ou Sid (en test ou instable)

Mapnik existe déjà sous forme de paquet alors vous n'avez qu'à l'installer!

# aptitude install python-mapnik

Compiler le nouveau Mapnik 0.5 depuis les sources sur Debian Etch (stable)

En plus des dépendances citées précédement pour Mapnik 0.4, vous aurez aussi besoin de iostreams de la librairie boost

# aptitude install libboost-iostreams-dev

Ensuite, vous aurez besoin de créer quelques liens symboliques. Le dernier lien pour GDAL (Geospatial Data Abstraction Library) n'est pas nécessaire à OSM mais si vous avez déjà installé GDAL sur votre système et que vous voulez l'utiliser avec Mapnik, alors vous aurez aussi besoin de ce lien.

# 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

L'étape suivante consiste à compiler et installer Mapnik. "XMLPARSER=libxml2" à la fin de chaque ligne est seulement requis si vous voulez utiliser des entités XML dans vos feuilles de style.

$ 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

Par défaut, Mapnik est installé dans /usr/local/lib alors vous aurez aussi besoin d'ajouter ce chemin dans /etc/ld.so.conf et exécuter 'ldconfig' après cela.

# cat << "EOF" >> /etc/ld.so.conf
> /usr/local/lib
> EOF
# ldconfig

Charger les données

Appelez simplement osm2pgsql (en tant qu'utilisateur qui va utiliser mapnik):

$ osm2pgsql -m -d gis planet-latest.osm.bz2

Ce processus a besoin d'une quantité significative de mémoire vive (approximativement 512 MB). Si vous n'avez pas suffisament de mémoire disponible, il s'arrêtera dans un état indéterminé (par exemple, avec des messages suggérant qu'il y a des erreurs dans le fichier .osm). Vérifiez que vous avez suffisament de mémoire vive et d'espace disque swap disponible avant de lancer osm2pgsql.

L'option "-m" active la projection sphérique Mercator qui est maintenant recommandée. D'autres outils utilisent encore une projection incorrecte qui cause encore certaines erreurs.

La dernière version du code de osm2pgsql supporte aussi un filtre limitant l'importation à une zone carrée ce qui permet de faire les choses bien plus rapidement si vous voulez vous limiter au rendu d'une petite partie de la planète. Par exemple, si vous voulez importer Londres depuis l'extrait du Planet sur le Royaume-Uni:-

$ osm2pgsql --bbox -0.5,51.25,0.5,51.75 -m -d gis uk-080213.osm.bz2

Décompressez les nouvelles données de lignes côtières

$ unzip processed_p.zip

Chargez ces données dans la base de données Postgres et mettez-les en accès publique:

$ 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
$

Quelques problèmes que vous pourriez rencontrer

Si vous tentez de charger un fichier Planet gzippé qui est supérieur à 2 GB, vous pourriez rencontrer une erreur lors de l'ouverture de ce fichier. Ceci est dû à un bug dans certaines versions de zlib qui ne supportent pas l'option O_LARGEFILE dans la fonction open(). Pour contourner ce problème, vous pouvez utiliser un gzip externe qui ne comporte pas ce problème. En ajoutant "-" dans les options de la ligne de commande, vous indiquez que les données entrant par le STDIN sont déjà décompressées par un outil externe.

$ gzip -dc planet-080213.osm.gz | osm2pgsql -m -

Après plusieurs heures, l'import peut s'arrêter avec une erreur comme:-

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

Il semble que ce soit un problème venant de PostgreSQL qui se produit lorsqu'un auto-nettoyage (auto-vacuum) est lancé durant la phase d'analyse. La solution est de désactiver toutes les fonctions d'auto-nettoyage dans la base de données. Les données ne sont de toute façon pas modifiées après l'import, le processus d'auto-nettoyage n'est donc d'aucune utilité. Dans le fichier psotgresql.conf, mettez l'option:

autovacuum = off

Puis redémarrez le serveur de la base de données

# /etc/init.d/postgresql-8.1 restart

Note: Sur Debian/Ubuntu, vous devez aussi mettre à jour le fichier /etc/cron.d/postgresql-common pour mettre les deux tâches pg_maintenance en commentaire sinon ces tâches pourraient se lancer durant l'import:-

 # 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

Rendu de carte avec Mapnik

Décompressez les données des lignes côtières de zoom de bas niveaux quelque part:

$ tar xzf world_boundaries-spherical.tgz

Récupérez les fichiers Mapnik depuis le dépôt subversion d'OSM:

$ svn checkout http://svn.openstreetmap.org/applications/rendering/mapnik
$ cd mapnik

Créez une copie locale du script "set-mapnik-env" et adaptez-le à votre configuration localed (noms de fichiers, répertoires, etc). Tous les paramètres sont documentés à l'intérieur du script.

Créez le fichier osm.xml depuis le modèle osm-template.xml en appelant:

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

Pour finir, définissez les zones à dessiner en précisant les limites (bounding box) et les niveaux de zoom dans generate_(tiles|image).py

Vous pouvez maintenant appeler

$ ./generate_tiles.py

ou

$ ./generate_image.py

pour générer les cartes.

Les versions des deux derniers scripts actuellement dans svn sont adaptés à mapnik 0.5 et vous verrez quelques erreurs si vous tentez de les utiliser avec une version antérieure.

Choses obsolètes

D'anciens trucs et autres informations qui ne sont plus valides ou encore des choses qui n'ont pas encore été incluses ici se trouvent dans la page Mapnik/Old

Personal tools
recent changes