FR:Mapnik
Mapnik | |
---|---|
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 :
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.