Construire son serveur cartographique :

Installer tilelite

Nous avons installé mercurial à la première étape, nous nous en servons pour installer tilelite depuis son dépôt :

hg clone http://bitbucket.org/springmeyer/tilelite
cd tilelite
sudo python setup.py install

Utiliser tilelite

Pour servir les tuiles, tilelite a besoin de connaitre le chemin du style mapnik. Comme j'ai installé les styles dans le dossier suivant : /Users/Petrovsk/OSM/serveur_carto, la commande pour lancer le serveur de tuiles est la suivante :

liteserv.py ~/OSM/serveur_carto/osm.xml

Ouvrir un navigateur et taper dans la barre d'adresse :

http://localhost:8000/

La page d'accueil de tilelite doit s'afficher, le lien url: /1/0/0.png affiche la tuile d'Amérique du Nord générée en temps réel par mapnik.
Pour arrêter le serveur de tilelite, simplement fermer le terminal ou l'onglet de terminal l'exécutant.
Tilelite accepte normalement d'utiliser un fichier de configuration pour choisir son comportement, mais il s'est montré particulièrement récalcitrant. Heureusement, il est possible de passer les paramètres dans la ligne de commande, du moins pour faire ce dont j'ai besoin, c'est-à-dire activer le cache (argument -c) et indiquer son chemin (voir plus loin).

Méthodes d'affichage des tuiles

Les tuiles peuvent être pré-générés, générées en temps réel à l'aide du serveur de tilelite, en temps réel avec un cache stockant les tuiles pour affichage ultérieur, ou bien en combinant pré-génération, cache et temps réel.
Dans ce dernier cas, certains niveaux de zoom sont pré-générés (de 0 à 12 par exemple) dans le dossier qui servira de cache pour les zooms plus élevés, générés en temps réel et ajoutés au cache. La pré-génération permet d'avoir un affichage très rapide, au prix d'une grande utilisation d'espace disque. Pour information, la zone de Barcelone que nous utilisons, une fois rendue jusqu'au niveau 18 occupe environ 567 Mo pour 127856 éléments.

Temps réel

C'est la méthode la plus simple, il suffit de lancer tilelite, rappel :

liteserv.py ~/OSM/serveur_carto/osm.xml

Les tuiles sont générées au fur-et-à-mesure des besoins, sans stockage, c'est du coup aussi la méthode la plus lente, dépendant directement de la puissance de la machine. Sur mon Macbook de 2006, l'affichage des tuiles n'est pas aussi rapide (et de loin) que le site web d'OpenStreetMap.

Temps réel avec cache

Les tuiles sont stockées pour accélérer l'affichage d'une zone déjà visitée et soulager la machine. Il faut lancer tilelite en activant le cache et en lui indiquant le dossier de stockage :

liteserv.py ~/OSM/serveur_carto/osm.xml -c --cache-path=/Users/Petrovsk/OSM/serveur_carto/tiles-osm

Pré-génération des tuiles

La pré-génération des tuiles a pour avantage de ne pas nécessiter le serveur de tuiles ni mapnik pour afficher la carte. Mais si la zone visitée n'a pas été générée au zoom voulu, il n'y a pas de recours.
Mapnik utilise le script python generate_tiles.py pour, comme son nom l'indique, générer les tuiles. Il faut lui préciser le dossier des tuiles, le chemin d'accès au style mapnik, l'étendue de la zone à rendre et les niveaux de zoom concernés.
Aller dans le répertoire de generate_tiles.py et créer un dossier pour les tuiles :

cd /Users/Petrovsk/OSM/serveur_carto
mkdir tiles-osm

Ouvrir generate_tiles.py dans un éditeur de texte et modifier quelques lignes :

Ligne 13 : indiquer le nombre de processeurs ou de cœurs disponibles. Pour mon CoreDuo ce sera :

NUM_THREADS = 2

Ligne 199 : indiquer l'étendue de la zone à rendre. Il faut la demander à postgres :

psql barcelona -c "select ST_Extent(ST_Transform(way,4326)) from planet_osm_roads;"

La réponse est :

                                st_extent                                 
--------------------------------------------------------------------------
 BOX(1.94459513295834 41.2706895358557,2.39693272129235 41.5663815729642)

Nous plaçons donc à la ligne 199 :

bbox = (1.94459513295834,41.2706895358557,2.39687271383137,41.5663815729642)

Ligne 201 : indiquer l'étendue de zoom à pré-générer. Ici, de 0 à 12 :

render_tiles(bbox, mapfile, tile_dir, 0, 12, "World")

Effacer les lignes au-delà de la ligne 201.

Une fois le fichier enregistré, indiquer les chemins d'accès dans le terminal et lancer la génération :

export MAPNIK_MAP_FILE=osm.xml
export MAPNIK_TILE_DIR=tiles-osm
./generate_tiles.py

Les tuiles sont générées sur mon Macbook au rythme d'une vingtaine par seconde. L'affichage de la carte est désormais plus rapide que le site OpenStreetMap.
La pré-génération est combinable avec le temps réel et le cache, en indicant à tilelite le dossier des tuiles comme cache. Cela permet de pré-générer les premiers niveaux de zoom, les vues plus rapprochées sont créées à la demande et stockées pour les prochaines visites.

Nous devons maintenant indiquer à OpenLayers où se trouvent les tuiles pour pouvoir afficher la carte dans un navigateur. C'est ce que nous verrons la prochaine fois.