Construire son serveur cartographique - 5 : Tilelite
Par Lionel le samedi 4 décembre 2010, 13:41 - Géomatique - Lien permanent
Maintenant que nous savons que mapnik est opérationnel, il est temps de lui faire cracher des tuiles, en passant ou non par un serveur, tilelite.
Construire son serveur cartographique :
- Préambule
- 1 : Installation des outils
- 2 : Configuration de la base de données
- 3 : Des données d'OSM à PostGIS
- 4 : Configurer mapnik
- 5 : Tilelite
- 6 : OpenLayers
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.
