Cette page décrit comment installer, mettre en place et configurer tous les logiciels nécessaires pour mettre en œuvre votre propre serveur de tuiles. Les instructions étapes par étapes sont écrites pour Ubuntu Linux 14.04 LTS (Trusty Tahr).

Installation des logiciels

La pile du serveur de tuiles OSM est une collection de programmes et bibliothèques qui fonctionnent ensemble pour créer un serveur de tuiles. Comme souvent avec OpenStreetMap, il y a de nombreuses manières d’achever ce but et presque tous les composants ont des alternatives qui ont de nombreux avantages et inconvénients spécifiques. Ce tutoriel décrit la version la plus standard qui est aussi utilisée sur le serveur de tuiles principale OpenStreetMap.org.

Il consiste en 5 composants principaux: Mod_tile, renderd, mapnik, osm2pgsql et une base de données postgresql/postgis. Mod_tile est un module apache, qui sert des tuiles mises en cache et décide quelles tuiles doivent être re-générées – soit parce quelles ne sont pas encore mise en cache soit parce qu’elles ne sont plus à jour. Renderd fournit un système de queue prioritaire pour faire le rendu des requêtes à gérer et lisser la charge pour faire le rendu des requêtes. Mapnik est la bibliothèque logicielle qui fait le rendu réel et qui est utilisé par renderd.

Afin de compiler ces composants, une variété de dépendances doit être installée en premier:

sudo apt-get install libboost-all-dev subversion git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff4-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev node-carto

Installation de postgresql / postgis

Sur Ubuntu il y a de nombreuses versions pré-packagées à la fois de postgis et postgresql, ainsi elles peuvent être facilement installées vi le gestionnaire de paquets d’ubuntu.

sudo apt-get install postgresql postgresql-contrib postgis postgresql-9.3-postgis-2.1

Maintenant, vous avez besoin de créer une base de données postgis. Les paramètres par défaut de nombreux programmes assument que le nom de la base de données est appelée gis et nous utiliserons la même convention dans ce tutoriel, bien que ce ne soit pas une obligation. Changer votre nom d’utilisateur à la place de username dans les deux emplacements ci-dessous. Cela devrait être le nom d’utilisateur  qui va faire le rendu des cartes avec Mapnik.

sudo -u postgres -i
createuser username # answer yes for superuser (although this isn't strictly necessary)
createdb -E UTF8 -O username gis
exit

Mettre en place PostGIS sur la base de données PostgreSQL:

sudo -u postgres psql
\c gis
CREATE EXTENSION postgis;
ALTER TABLE geometry_columns OWNER TO username;
ALTER TABLE spatial_ref_sys OWNER TO username;
\q
exit

Installation de osm2pgsql

osm2pgsql est en développement constanet il est mieux de le compiler depuis les sources.

mkdir ~/src
cd ~/src
git clone git://github.com/openstreetmap/osm2pgsql.git
cd osm2pgsql
./autogen.sh
./configure
make
sudo make install

Installation de la bibliothèque Mapnik

Ensuite, nous devons installer la bibliothèque Mapnik. Mapnik est utilisé pour faire le rendu des données OpenStreetMap pour les tuiles utilisées par une carte en ligne de type OpenLayers.

Compiler la bibliothèque Mapnik depuis les sources:

cd ~/src
git clone git://github.com/mapnik/mapnik
cd mapnik
git branch 2.2 origin/2.2.x
git checkout 2.2

python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/
make
sudo make install
sudo ldconfig

Vérifier que Mapnik a bien été installé correctement:

python
>>> import mapnik
>>>

Si Python répond avec une seconde ligne avec des chevrons >>> et sans erreurs, alors la bibliothèque Mapnik a été trouvée par Python. Félicitations!

>>> quit()

Installation de mod_tile et renderd

Compiler mod_tile depuis ses sources:

cd ~/src
git clone git://github.com/openstreetmap/mod_tile.git
cd mod_tile
./autogen.sh
./configure
make
sudo make install
sudo make install-mod_tile
sudo ldconfig

Configuration de feuilles de style

Maintenant que tous les logiciels nécessaires sont installés, vous allez avoir besoin de configurer une feuille de style.

Pour ces instructions, nous utiliserons OSM Bright, une feuille de style adapté à tous les besoins avec un style qui rappelle les cartes en ligne populaires. (Si vous voulez une carte qui ressemble exactement à celle qui est sur openstreetmap.org, vous devrez utiliser le projet openstreetmap-carto qui a ses propres instructions d’installation.)

Avec les feuilles de styles les plus modernes, OSM Bright est écrit avec un langage de feuille de style appelé CartoCSS qui fait fortement penser aux CSS utilisés pour le design web. Son principal avantage est la facilité à le lire/l’écrire, permettant de produire rapidement des prototypes (en utilisant des utilitaires comme Tilemill, Kosmtik ou Sputnik). Cependant, vous devez typiquement adapter vos feuilles de styles CartoCSS tierces parties à la configuration de votre propre serveur, et ensuite les compiler en fichier XML requis par Mapnik; c’est ce que nous allons faire ici.

Nous allons utiliser /usr/local/share/maps/style comme répertoire commun à nos fichiers de feuilles de styles et à nos ressources.

Télécharger OSM Bright

Pour commencer, nous devons télécharger à la fois la feuille de style de OSM Bright, et aussi les ressources additionnelles qu’elle utilise (pour les bordures de  côtes et autres éléments similaires).

mkdir -p /usr/local/share/maps/style
cd /usr/local/share/maps/style
wget https://github.com/mapbox/osm-bright/archive/master.zip
wget http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip
wget http://data.openstreetmapdata.com/land-polygons-split-3857.zip
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip

Nous déplaçons ensuite les données téléchargées dans le répertoire du projet osm-bright-master

unzip '*.zip'
mkdir osm-bright-master/shp
mv land-polygons-split-3857 osm-bright-master/shp/
mv simplified-land-polygons-complete-3857 osm-bright-master/shp/
mv ne_10m_populated_places_simple osm-bright-master/shp/

Pour améliorer les performances, nous allons créer des fichiers d’index pour les shapefiles les plus gros:

cd osm-bright-master/shp/land-polygons-split-3857
shapeindex land_polygons.shp
cd ../simplified-land-polygons-complete-3857/
shapeindex simplified_land_polygons.shp
cd ../

Configuration de OSM Bright

La feuille de style OSM Bright nécessite maintenant d’être ajustée pour inclure l’emplacement de nos fichiers de données. Éditer le fichier osm-bright/osm-bright.osm2pgsql.mml dans votre éditeur de texte favori, par exemple:

nano osm-bright/osm-bright.osm2pgsql.mml

Trouvez les lignes avec les URLs qui pointent vers les shapefiles (finissant par .zip) et remplacez chacune d’elle avec ces paires de ligne appropriées:

"file": "/usr/local/share/maps/style/osm-bright-master/shp/land-polygons-split-3857/land_polygons.shp", 
"type": "shape"
"file": "/usr/local/share/maps/style/osm-bright-master/shp/simplified-land-polygons-complete-3857/simplified_land_polygons.shp", 
"type": "shape",
"file": "/usr/local/share/maps/style/osm-bright-master/shp/ne_10m_populated_places_simple/ne_10m_populated_places_simple.shp", 
"type": "shape"

Notez que nous ajoutons aussi le “type”: “shape” pour chacune d’elle. (Si vous utilisez nano, pour sauvegarder, maintenant appuyez sur ctrl-X et Y.)

Pour terminer, dans la section utilisant “ne_places”, remplacez les lignes “srs” et “srs-name” avec cette ligne:

"srs": "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"

Compilation de la feuille de style

Nous avons maintenant une feuille de style CartoCSS complètement fonctionnelle. Avant que Mapnik puisse l’utiliser, nous devons la compiler en un fichier XML en utilisant la ligne de commande du compilateur carto. En premier, nous allons utiliser le préprocesseur propre à OSM Bright, que nous avons besoin d’éditer pour notre configuration:

cp configure.py.sample configure.py
nano configure.py

Changez la ligne de configuration pointant de ~/Documents/Mapbox/project vers /usr/local/share/maps/style à la place, et changez dbname de osm à gis. Sauvegardez et sortez.

Lancez  le pré-processeur et ensuite l’utilitaire carto:

./make.py
cd ../OSMBright/
carto project.mml > OSMBright.xml

Vous devez avoir maintenant une feuille de style XML Mapnik dans /usr/local/share/maps/style/OSMBright/OSMBright.xml .

Configuration de votre serveur web

Ensuite, nous avons besoin de connecter renderd et mod_tile avec le serveur web Apache, prêt à recevoir les requêtes de tuiles.

Configuration de renderd

Changez les paramètres de renderd en éditant /usr/local/etc/renderd.conf et changez les cinq lignes suivante, en décommentant (enlevant le ‘;’) quand c’est requis. Elles sont dans les sections [renderd], [mapnik] et [default].

socketname=/var/run/renderd/renderd.sock
plugins_dir=/usr/local/lib/mapnik/input
font_dir=/usr/share/fonts/truetype/ttf-dejavu
XML=/usr/local/share/maps/style/OSMBright/OSMBright.xml
HOST=localhost

Créez les fichiers requis pour que le système mod_tile system fonctionne (rappelez vous de changer username avec votre nom d’utilisateur):

sudo mkdir /var/run/renderd
sudo chown username /var/run/renderd
sudo mkdir /var/lib/mod_tile
sudo chown username /var/lib/mod_tile

Configuration de mod_tile

Ensuite, nous devons déclarer au serveur web Apache notre nouvelle installation de mod_tile en créant le fichier /etc/apache2/conf.d/mod_tile.conf et en ajoutant une ligne:

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

Par ailleurs, le fichier de configuration du site par défaut Apache doit être modifié pour inclure les paramètres de mod_tile. Modifiez le fichier /etc/apache2/sites-available/default pour inclure les lignes suivantes immédiatement après la ligne d’adresse mail de l’administrateur:

LoadTileConfigFile /usr/local/etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30

Dites à Apache que vous avez ajouté le nouveau module, et redémarrez-le:

a2enconf mod_tile
service apache2 reload

Optimiser votre système

Un serveur de tuiles peut mettre à mal matériel comme logiciel par la charge qu’il implique. Les paramètres par défaut peuvent ne pas être très appropriés et une amélioration significative peut être potentiellement réalisée via différents paramètres de configuration.

Optimiser postgresql

La configuration par défaut de PostgreSQL 9.1 nécessite d’être configurée pour le volume de données que vous prévoyez d’ajouter. Éditez le fichier /etc/postgresql/9.1/main/postgresql.conf et faites les changements suivants:

shared_buffers = 128MB
checkpoint_segments = 20
maintenance_work_mem = 256MB
autovacuum = off

Ces changements nécessitent un changement de configuration du noyau (kernel), qui doit être appliqué à chaque redémarrage de l’ordinateur. En tant que root, éditez /etc/sysctl.conf et ajoutez ces lignes près du début après les autres définitions relatives au “kernel”:

# Increase kernel shared memory segments - needed for large databases
kernel.shmmax=268435456

Redémarrez votre ordinateur. Lancez ceci:

sudo sysctl kernel.shmmax

et vérifiez qu’il affiche bien 268435456.

Chargement des données dans votre serveur

Obtenir les dernières données OpenStreetMap

Récupérez une partie des données OpenStreetMap en format PBF depuis http://planet.openstreetmap.org.

Si vous avez besoin du fichier planet complet, vous pouvez le récupérer en lançant la commande suivante:

mkdir /usr/local/share/maps/planet
cd /usr/local/share/maps/planet
wget http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf

Comme le planet complet fait au minimum 18GB quand il est compressé, il y a des liens vers de extraits de la taille de pays ou d’Etats sur cette page. Cependant, de nombreuses personnes n’auront besoin que d’un pays ou d’une ville; vous pouvez télécharger les fichiers PBF depuis ces ‘extractions’ de download.geofabrik.de. Nous vous recommandons de tester avec des petites zones, et de seulement passer au planet complet quand vous êtes assez  suffisamment confiance dans le fonctionnement de votre configuration.

Importer les données dans la base

Avec l’outil de conversion compilé et la base de données préparée, la commande suivante va insérer les données OpenStreetMap que vous avez téléchargé antérieurement dans la base de données. Cette étape est très coûteuse en opérations entrées/sorties (I/O) sur le disque et devrait prendre environ 10 heures sur un serveur rapide avec disques SSD à plusieurs jours pour un planet complet en fonction de la vitesse de l’ordinateur exécutant l’import. Pour des extraits plus petits, le temps d’import est en conséquence plus rapide, et vous allez peut être devoir expérimenter différentes valeurs de l’option -C afin d’adapter la valeur à la mémoire disponible sur votre machine.

osm2pgsql --slim -d gis -C 16000 --number-processes 3 ~/planet/planet-latest.osm.pbf

Regardons notre importation de données au fur et à mesure que votre importation progresse. La première partie de la sortie de osm2pgsql semble plutôt effrayante, mais est normale:

Using projection SRS 900913 (Spherical Mercator)
Setting up table: planet_osm_point
NOTICE: table "planet_osm_point" does not exist, skipping
NOTICE: table "planet_osm_point_tmp" does not exist, skipping
Setting up table: planet_osm_line
NOTICE: table "planet_osm_line" does not exist, skipping
NOTICE: table "planet_osm_line_tmp" does not exist, skipping
Setting up table: planet_osm_polygon
NOTICE: table "planet_osm_polygon" does not exist, skipping
NOTICE: table "planet_osm_polygon_tmp" does not exist, skipping
Setting up table: planet_osm_roads
NOTICE: table "planet_osm_roads" does not exist, skipping
NOTICE: table "planet_osm_roads_tmp" does not exist, skipping
Mid: pgsql, scale=100, cache=4096MB, maxblocks=524289*8192
Setting up table: planet_osm_nodes
NOTICE: table "planet_osm_nodes" does not exist, skipping
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_nodes_pkey" for table "planet_osm_nodes"
Setting up table: planet_osm_ways
NOTICE: table "planet_osm_ways" does not exist, skipping
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_ways_pkey" for table "planet_osm_ways"
Setting up table: planet_osm_rels
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_rels_pkey" for table "planet_osm_rels"

Ne vous sentez pas concerné par les lignes NOTICE: ci-dessus. Tout est normal. Ensuite, osm2pgsql va commencer à lire le fichier “planet” compressé.

Reading in file: /home/user/planet/planet-latest.osm.bz2

Au fur et à mesure que osm2pgsql lit le fichier “planet”, il va renvoyer des rapports sur la progression. La ligne ci-dessous va être rafraichie à quelques secondes d’intervalle et met à jour les chiffres entre parenthèses. Cette partie de l’import dure un temps important. En fonction de votre serveur, cela peut prendre des heures jusqu’à des jours.

Processing: Node(10140k 200.1k/s) Way(0k 0.00k/s) Relation(0k 0.00/s)

Au fur et à mesure de l’import, en premier le nombre de noeuds (Node) va augmenter jusqu’à ce qu’ils soient entièrement importés, ensuite cela va être au tour du nombre des voies (Way) et enfin à celui des relations (Relation). La vitesse avec laquelle l’import s’effectue dépend fortement du matériel disponible et si le cache des noeuds rentre plus ou moins en RAM. Ceci dit, si votre cache de noeuds est suffisamment important, vous pouvez probablement attendre une vitesse de traitement des noeuds de l’ordre quelques centaines de k par seconde pour les “nodes”, de quelques 10aines de k par seconde pour les “ways” et de quelques centaines par secondes pour les relations. Si le cache des noeuds ne rentre pas en RAM ou que vous avez configuré la valeur du cache trop basse, le processus peut être d’un ordre de magnitude beaucoup plus lent. Si vous importer le planet complet, l’import peut prendre des jours. Si vous importez des pays complets seuls, l’ordre de temps peut être réduit en minutes ou heures. N’interrompez pas le processus d’import à moins d’avoir décidé de recommencer entièrement depuis le début.

Processing: Node(593072k) Way(45376k) Relation(87k)
Exception caught processing way id=110802
Exception caught processing way id=110803
Processing: Node(593072k) Way(45376k) Relation(474k)

Les exceptions montrées ci-dessus sont dues à des erreurs mineures dans le fichier “planet”. L’import du “planet” s’effectue toujours d’une manière normale.

L’étape suivante du processus d’import du planet avec osm2pgsql prendra aussi entre des heures et des jours, en fonction de votre matériel. Il commence comme ceci:

Node stats: total(593072533), max(696096737)
Way stats: total(45376969), max(55410575)
Relation stats: total(484528), max(555276)
Going over pending ways
processing way (752k)

Le nombre de way traité doit se mettre à jour environ toutes les secondes.

Going over pending relations
node cache: stored: 515463899(86.91%), storage efficiency: 96.01%, hit rate: 85.97%
Committing transaction for planet_osm_roads
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Sorting data and creating indexes for planet_osm_line
Sorting data and creating indexes for planet_osm_roads
Sorting data and creating indexes for planet_osm_polygon
Committing transaction for planet_osm_point
Sorting data and creating indexes for planet_osm_point
Stopping table: planet_osm_nodes
Stopping table: planet_osm_ways
Stopping table: planet_osm_rels
Building index on table: planet_osm_rels
Stopped table: planet_osm_nodes
Building index on table: planet_osm_ways
Stopped table: planet_osm_rels
Completed planet_osm_point
Completed planet_osm_roads
Completed planet_osm_polygon
Completed planet_osm_line
Stopped table: planet_osm_ways

Osm2pgsql took 86400s overall

Le nombre de nodes, ways et relations traités va évidemment différer en fonction de la taille de l’extrait de données que vous utilisez et de la date du dump de données. Les nombres montrés ici ne réflètent pas ceux de l’import d’un fichier “planet” complet, qui est largement plus gros.

Tester que c’est opérationnel

Tester votre serveur de tuiles

Maintenant que tout est installé, mise en place et chargé, vous pouvez démarrer votre serveur de tuiles et espérer que tout fonctionne. Nous allons le lancer de manière interactive pour s’assurer que tout fonctionne correctement:

sudo mkdir /var/run/renderd
sudo chown username /var/run/renderd
renderd -f -c /usr/local/etc/renderd.conf

et dans une session différente:

sudo /etc/init.d/apache2 restart

Si des erreurs FATAL ont lieu, vous allez devoir revérifier chacune des éditions que vous avez fait plus tôt.

Si il n’y a rien, essayer et naviguer sur http://yourserveraddress/osm_tiles/0/0/0.png pour voir un petite image du monde apparaître. Les tuiles de cartes actuelles sont créées comme des “metatiles” à l’intérieur du dossier /var/lib/mod_tile.

Configurer le serveur pour qu’il fonctionne automatiquement

Si le serveur fonctionne avec succès, vous pouvez arrêter le processus interactif de renderd et le configurer pour qu’il fonctionne automatiquement au démarrage de la machine en tant que démon.

sudo cp  ~/src/mod_tile/debian/renderd.init /etc/init.d/renderd
sudo chmod u+x /etc/init.d/renderd

Editer le fichier /etc/init.d/renderd en tant que root – vous allez devoir faire quelques changements dans les lignes DAEMON et DAEMON_ARGS pour q’elle soient de la forme suivante:

DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="-c /usr/local/etc/renderd.conf"

Aussi, vous allez devoir changer les références à www-data afin qu’elles correspondent à votre nom d’utilisateur système – changez “www-data” dans le nom que vous avez changé pour “username” dans les autres fichiers.

Vous devriez être capable de démarrer mapnik en faisant ce qui suit:

sudo /etc/init.d/renderd start

et de l’arrêter:

sudo /etc/init.d/renderd stop

Les informations de logs sont maintenant écrites dans /var/log/daemon.log plutôt que dans le terminal.

Ensuite, ajoutez un lien vers le répertoire de démarrage intéractif afin qu’il démarre automatiquement:

sudo ln -s /etc/init.d/renderd /etc/rc2.d/S20renderd

et redémarrer votre serveur, naviguer sur http://yourserveraddress/osm_tiles/0/0/0.png et tout devrait fonctionner! Vous pouvez aussi aller à la page http://yourserveraddress/mod_tile qui devrait vous donner quelques statistiques sur votre serveur de tuiles.

Maintenant, vous voulez peut être jeter un oeil à quelque chose dans la section Utilisation des tuiles pour créer une carte qui utilise votre nouveau serveur de tuiles.

Remerciements

Basé initialement sur le matériel produit par Ian Dees et Richard Weait. Edité et mis à jour par Richard Fairhurst avec le matériel additionnel par Andy Townsend et Paul Norman.