FR:Mapnik

From OpenStreetMap Wiki
Jump to navigation Jump to search
Mapnik
Mapnik-logo.png
Licence : GNU Lesser General Public License
Plateformes : Windows, macOS et Linux
Version : 2.2.0 (2013-06-03)
Langue : anglais
Site Internet : http://mapnik.org
Langages de programmation : C++ et Python

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 bibliothèque 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 https://tile.openstreetmap.org/7/63/42.png pour cette image :

42.png

Voir aussi Repérage des carreaux de carte glissante

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 bogues 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 caractéristiques non-dessinées

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

Préparation

En quelques mots, Mapnik va avoir besoin de 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. Il peut le faire depuis un fichier osm ou à 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 https://planet.openstreetmap.org/planet/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 nombreux 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 https://tile.openstreetmap.org/world_boundaries-spherical.tgz # world boundaries
$ wget https://tile.openstreetmap.org/processed_p.tar.bz2 # processed_p
$ wget https://tile.openstreetmap.org/shoreline_300.tar.bz2 #  shoreline_300

Depuis juin 2010, deux fichiers supplémentaires sont nécessaires:

$ wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip (1.5 MB)
$ wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip (38 KB)

PostgreSQL / PostGIS

Les instructions suivantes supposent que vous remplaciez le nom d'utilisateur par celui qui sera utilisé pour exécuter mapnik (dans les indications ci-dessous cela correspond à <username>)

Vérifier avant l'installation, la version de postgresql (8.x ou ?) de votre distribution/version et adapter au indications ci-après.

Installation

Pour Debian Sarge (osbolete)

Logué en 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 (obsolete)

Pour installer PostGIS (en tant que root) : vérifier que la section contrib est présente dans le fichier /etc/apt/sources.list

# aptitude install postgresql postgis

ou avec Ubuntu:

# sudo apt-get install postgresql-8.3-postgis
Pour Debian sqeeze
# aptitude install postgresql postgis postgresql-8.4-postgis postgresql-contrib-8.4
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 suivante en tant que root :

# su - postgres
$ <commands...>

ou

# sudo -u postgres <command>

ou sur un système comme Ubuntu qui utilise sudo

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

et la création de la langue ( s'il y a un message langue non trouvée , c'est lié a l'installation de postgis)

$ createlang plpgsql gis

PostGIS

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

--Didier2020 22:19, 30 March 2011 (BST) lenny est devenu version oldstable depuis fevrier 2011.

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

Si lwpostgis.sql est "introuvable", voir sur le site debian (erreur prise en compte)

Le fichier /usr/share/doc/postgresql-8.4-postgis/README.Debian.gz se réfère au fichier

/usr/share/postgresql-8.4-postgis/lwpostgis.sql

qui a été renommé à

/usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql
Debian Sqeeze

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

$ psql -d gis -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql
$ echo "ALTER TABLE geometry_columns OWNER TO <username>; ALTER TABLE spatial_ref_sys OWNER TO <username>;"  | psql -d gis
$ psql -d gis -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql
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

Ubuntu (lucid)

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

$ psql -d gis -f /usr/share/postgresql/8.4/contrib/postgis.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 superieur

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

et

yum install postgresql-devel libxml2-devel bzip2-devel gcc-c++

Suivez les instructions "A partir des sources"

A partir des sources

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

Avec Ubuntu, vous aurez besoin des paquets suivants:

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

Mapnik

Pour Debian Etch

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 superieur

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édemment pour Mapnik 0.4, vous aurez aussi besoin de iostreams de la bibliothèque 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

Fedora

Un paquet existe sous Fedora pour Mapnik (sous Fedora 11 version 0.5)

yum install mapnik mapnik-demo mapnik-devel mapnik-python mapnik-utils

Charger les données

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

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

en cas d'erreur, voir Mapnik#osm2pgsql

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.

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

L'option "-s" permet de palier a un manque de memoire: Les données qui devaient etre chargées en memoire sont écrites temporairement dans la base de données. C'est beaucoup plus long et nécessite un espace disque (pour postgresql ) adapté. En complément de cette option, "-C" permet de modifier le cache par défaut (800Mb)

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

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

Si vous utilisez un fichier osm créé par josm et que vous l'avez modifié mais pas exporté sur le serveur openstreetmap: if faut supprimer l'attribut action='modify' du fichier.

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 https://svn.openstreetmap.org/applications/rendering/mapnik
$ cd mapnik

en case d'erreur, installer le paquet subversion

Créez une copie locale du script "set-mapnik-env" et adaptez-le à votre configuration locale (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.