Si vous souhaitez construire votre propre serveur de tuiles, utiliser des paquets peut vous économiser une grande partie du travail d’installation.

Ces paquets marchent avec Ubuntu Linux version 12.04 LTS (Precise Pangolin) et supérieure. Après installation, vous devriez avoir votre propre serveur de tuiles avec les feuilles de style Mapnik OSM standarddans lequel vous pouvez importer un extrait des données OSM pour faire le rendu.

Il est basé sur le même logiciel que les serveurs de tuiles OSM officiels utilise:

  • mod_tile pour servir
  • renderd comme démon de rendu
  • mapnik pour le rendu à proprement parler

Le but principal de ces paquets est de simplifier l’installation, en l’automatisant autant que possible dans des scripts de packaging.

Installation

Les commandes suivantes doivent être entrées dans le terminal pour configurer les choses :

Dans le cas, où vous n’avez pas add-apt-repository installé, ajoutez-le avec:

pour Ubuntu 12.04

sudo apt-get install python-software-properties

pour Ubuntu 12.10 et supérieurs

sudo apt-get install software-properties-common
Ajoutez le dépôt contenant les paquets:
sudo add-apt-repository ppa:kakrueger/openstreetmap

Mettre à jour la liste des paquets locaux pour récupérer les infos du nouveau dépôt:

sudo apt-get update

Installer le paquet libapache2-mod-tile et ses dépendances. Pendant la configuration, il vous sera demandé quelques questions. Pour vous assurer que les scripts d’installation fonctionnent, vous devez garder ceux par défaut. Cependant, dans le cas de la question des permissions utilisateurs pour la base de données, vous pouvez souhaiter ajouter votre propre nom d’utilisateur après l’utilisateur www-data séparé par un espace pour être capable d’importer la donnée avec votre utilisateur.

sudo apt-get install libapache2-mod-tile

Importer les données cartographiques

Téléchargez les données OpenStreetMap dont vous souhaitez faire le rendu (des fichiers planet complets peuvent être trouvés sur planet.openstreetmap.org, des extraits par pays peuvent être trouvés sur download.geofabrik.de). avec:

wget http://download.geofabrik.de/europe/ireland-and-northern-ireland-latest.osm.pbf

Importez la donnée dans votre base de données PostgreSQL avec osm2pgsql. Il y a un certain nombre de paramètres différents que vous pouvez utiliser avec osm2pgsql qui dépendent du matériel disponible et de la taille des données extraites que vous souhaitez importer. Ceux que vous êtes le plus susceptibles d’utiliser sont “-C”, “–slim” et “–number-processes”. -C et spécifient le nombre de Mb qu’osm2pgsql utilisera pour cacher la donnée. Donc cela dépend de la quantité de RAM que vous vez de disponible. –slim garde la donnée osm complète sur le disque, nécessaire pour les mises à jour et les environnements avec une faible mémoire. –number-processes spécifie le nombre de processus en  parallèle qui peuvent être utilisés pour certaines parties du processus d’import. La valeur optimale dépend principalement de la vitesse du disque dur système et du nombre de cœur disponibles.

osm2pgsql --slim -C 1500 --number-processes 4 ireland-and-northern-ireland.osm.pbf

En fonction de la taille de l’extrait que vous importez et des performances de l’ordinateur, cela peut prendre un temps pouvant aller de quelques minutes pour des petites extraits jusqu’à plusieurs jours pour un planet complet sur des machines plus lentes! Si vous importez un planet complet, il est fortement recommandé de définir -C 18000 (18 GB de cache ram, susceptible d’augmenter au fur et à mesure de l’accroissement de la base de données OSM). Cela peut entraîner un swap sur le serveur pendant l’import si vous n’avez pas assez de mémoire, mais dans de nombreux cas, ce sera toujours plus rapide que d’utiliser des petites valeurs pour le nœud en cache. Cependant, vous devez vous assurez d’avoir suffisamment de mémoire swap configurée.

Si vous importez un fichier planet complet, vous voudrez peut être aussi utiliser l’option –flat-nodes. Elle utilise un format de fichier personnalisé pour quelques-unes des données plutôt qu’une base de données PostGIS qui la rend plus efficace, mais moins efficace pour les extraits régionaux. Cela peut aussi faire sens de changer temporairement vos configurations PostgreSQL pednant l’import. (Par exemple, augmenter le nombre de segments de vérification “checkpoint_segments” et réduire la taille du tampon partagé “shared buffer”.)

Une large proportion du temps d’import ainsi que la taille de la base de données sont utilisés pour créer des index pour garder la trace des mises à jour. Si vous ne planifiez pas de garder la base de données en permanence à jour avec des fichiers “diff”, vous voudrez peut être importer la donnée avec l’option –drop qui supprimera les tables “slim-tables” après import qui ne sont pas nécessaires pour faire le rendu et ne crééent pas les index qui sont seulement nécessaires pour le support des imports diff. Une fois que vous faites des mises à jour moins régulièrement que peut être toutes les 1 – 2 semaines, cela peut être plus efficace de refaire les réimports complets chaque fois plutôt que d’utiliser les mises à jour.

mod_tile est conçu pour toujours servir des tuiles à jour (voir la section Mise à jour plus loin). Comme il n’est généralement pas faisable de “re-rendre” toutes les tuiles changées au moment du changement, mod_tile initie le “re-rendu” des tuiles pas à jour au moment de les servir. Ainsi mod_tile nécessite de savoir quand le planet a été importé. Cela est effectué en changeant le timestamp sur le fichier planet-import-complete

touch /var/lib/mod_tile/planet-import-complete

Enfin, vous devez redémarrer le démon de rendu après quoi tout devrait être prêt.

sudo /etc/init.d/renderd restart

Si tout a fonctionné correctement, vous devriez avoir un serveur de tuiles fonctionnel et vous devriez voir ses résultats en allant sur http://localhost/osm/slippymap.html

Si vous n’ouvrez pas slippymap.html sur localhost et que vous ne voyez que des tuiles roses, vous devrez éditer la page html et remplacer localhost avec le nom correct du serveur dans ‘new OpenLayers.Layer.OSM(“Local Tiles”…’ ou la changer en une URL relative.

Mise à jour

Les commandes suivantes expliquent comment garder votre serveur de tuiles à jour avec les dernières données OSM.

Après l’importation initiale de la base de données avec osm2pgsql comme décrite au dessus (vous devrez utiliser l’option –slim dans l’import initial pour permettre la mise à jour), vous devrez suivre les étapes suivantes

Installez osmosis

sudo apt-get install osmosis

Donnez les droits au tables de mise à jour à l’utilisateur www-data

sudo /usr/bin/install-postgis-osm-user.sh gis www-data

Initialisez le processus de réplication de données osmosis de votre import de données. Choisissez la date de la donnée du planet, comme c’est la date à laquelle les diffs vont commencer.

sudo -u www-data /usr/bin/openstreetmap-tiles-update-expire 2012-04-21

Comme le script packagé utilise actuellement un service non à jour pour déterminer le point de départ correct de la réplication, vous devrez manuellement choisir et télécharger le fichier state.txt correct depuis la base_url (voir ci-dessous) qui correspond à un moment légèrement avant l’âge de l’extrait pour vous assurer que toutes les modifications sont incluses dans votre base de données. Cela nécessite d’être copié dans /var/lib/mod_tile/.osmosis/state.txt

Vous devrez ensuite mettre à jour la configuration par défaut de osmosis. Dans /var/lib/mod_tile/.osmosis/configuration.txt changez la base_url à

http://planet.openstreetmap.org/replication/minute/

Mettez à jour votre serveur de tuiles de plus d’une heure et expirez les tuiles déjà rendues correspondantes

sudo -u www-data /usr/bin/openstreetmap-tiles-update-expire.sh

Si votre serveur de tuiles a plus d’une heure de décalage, vousdevrez appeler le script openstreetmap-tiles-expire de multiples fois. Si vous souhaitez garder continuellement les données de votre serveur à jour, vous devrez ajouter le script openstreetmap-tiles-expire.sh à votre crontab.

Garder la donnée à jour peut être consommateur intense de ressources, en particulier parce qu’après l’import, vous risquez déjà d’être décalé de plusieurs jours. Considérez de changer maxInterval dans /var/lib/mod_tile/.osmosis/configuration.txt à 21600 (six heures) jusqu’à ce que vous ayez rattrapé votre retard. De plus, ajoutez “–number-processes 2″ à la commande osm2pgsql dans /usr/bin/openstreetmap-tiles-update-expire.sh ou un nombre plus élevé si c’est approprié à votre matériel.

L’installation initiale a installé les bords de côte pré-traités. De temps à autre, cela peut faire sens de remplacer les fichiers avec de nouvelles versions:

wget http://tile.openstreetmap.org/processed_p.tar.bz2

et extrayez les dans

/etc/mapnik-osm-data/world_boundaries/

Résolution des problèmes

Il y a un certain nombre de choses qui peuvent aller mal. Voici quelques uns des problèmes courants et leurs solutions:

La connexion à votre base de données a échouée dans osm2pgsql

Si vous rencontrez le message d’erreur suivant quand vous importez la donnée avec osm2pgsql, vous avez sûrement oublié d’ajouter votre nom d’utilisateur dans la section des utilisateurs autorisés pendant la configuration. “Connection to database Failed: FATAL: Ident authentication failed for user “xyz””

Vous pouvez corriger ceci avec l’une de ces deux manières:

Indifféremment, vous reconfigurez le paquet, cette fois en incluant à la fois www-data et votre propre nom d’utilisateur dans une liste séparée par un espace,

sudo dpkg-reconfigure openstreetmap-postgis-db-setup

Ou, vous pouvez manuellement accorder des permissions à votre compte utilisateur avec la commande suivante:

sudo /usr/bin/install-postgis-osm-user.sh gis xyz

Matériel

Les besoins matériel peuvent être assez exigeants si vous souhaitez faire le rendu de larges zones, mais ne sont pas trop mauvais si vous êtes intéressés dans les zones plus petites. Pour une PC bureautique standard (environ 4 GB de ram, un disque dur standard, un processeur deux – quatre coeurs), un extrait d’une taille d’environ 100 – 300 Mb est raisonnable (le temps d’importation est de l’ordre de une heure).

Si vous voulez importer et faire le rendu du monde entier, vous aurez besoin d’un serveur considérablement plus costaud qu’un ordinateur de bureau typique, c’est à dire 24Gb de RAM ou plus. Il est aussi recommandé d’utiliser un SSD pour la base de données  ou au minimum un ensemble RAID rapide. L’import planet complet fait environ 256GB, ainsi pour stocker toute la base de données sur un SSD, vous devriez avoir besoin d’un SSD de 512GB. Un import qui n’est pas mis à jour et utilise l’option –drop d’un autre côté devrait déjà pouvoir rentrer sur un SSD 256GB. Vous pouvez aussi mettre de manière sélective les parties les plus importantes da la base de données sur un SSD et le reste sur des disques plus lents. Osm2pgsql supporte l’utilisation d’espace de noms séparés pour différentes parties de la base de données dans ce but.

Aide

Où sont les différents fichiers (base de données / Tuiles, etc.) ?

  • Les feuilles de style et bordures de mer sont dans /etc/mapnik-osm-data
  • Les tuiles sont dans /var/lib/mod_tile
  • La configuration de renderd dans /etc/renderd.conf
  • La configuration de mod_tile configuration dans /etc/apache2/sites-available/tileserver_site
  • Les scripts sont dans /usr/bin
  • La configuration de la base de données est dans /etc/postgresql/X.X/main (où X.X est la version PostgreSQL, par exemple 9.1)
  • La configuration osm2pgsql et state.txt est dans /var/lib/mod_tile/.osmosis

Comment je fais le pré-rendu des tuiles ?

Vous pouvez utiliser render_list pour faire le pré-rendu de tuiles:

Usage: render_list [OPTION] ...
 -a, --all render all tiles in given zoom level range instead of reading from STDIN
 -f, --force render tiles even if they seem current
 -m, --map=MAP render tiles in this map (defaults to 'default')
 -l, --max-load=LOAD sleep if load is this high (defaults to 5)
 -s, --socket=SOCKET unix domain socket name for contacting renderd
 -n, --num-threads=N the number of parallel request threads (default 1)
 -t, --tile-dir tile cache directory (defaults to '/var/lib/mod_tile')
 -z, --min-zoom=ZOOM filter input to only render tiles greater or equal to this zoom level (default is 0)
 -Z, --max-zoom=ZOOM filter input to only render tiles less than or equal to this zoom level (default is 18)

Si vous utiliser –all, vous pouvez restreindre le nombre de tuiles en ajoutant ces options:

 -x, --min-x=X minimum X tile coordinate
 -X, --max-x=X maximum X tile coordinate
 -y, --min-y=Y minimum Y tile coordinate
 -Y, --max-y=Y maximum Y tile coordinate

Sans –all, envoie une liste de tuiles devant être rendues depuis STDIN (l’entrée standard) dans le format X Y Z, c’est à dire :

0 0 1
0 1 1
1 0 1
1 1 1

Ce qui précède va permettre aux 4 tuiles au zoom 1 d’être générées.

Notez que vous avez à définir –socket=/var/run/renderd/renderd.sock

Remerciements

Merci à Kai Krueger pour la maintenance des paquets et la préparation de la documentation.