:: Yves Jacolin :: Ludovic Granjon :: Softlibre :: OSGeo-fr ::
"Quand on veut reprendre avec utilité, et montrer à un autre qu'il se trompe, il faut observer par quel côté il envisage la chose, car elle est vraie ordinairement de ce côté-là, et lui avouer cette vérité, mais lui découvrir le côté où elle est fausse." Pascal, Pensées Br. 9, Lafuma 5.

<< Retour à la page OpenLayers

Tutorial sur TileCache

Écrit par Chris Holmes, le 27 février 2007 : http://geoserver.org/display/GEOSDOC/TileCache+Tutorial

Introduction

Au sein de la communauté GeoServer nous avons accueillit agréblement TileCache de MetaCarta comme serveur de cache d'un WMS. Vous pouvez le voir en action sur http://sigma.openplans.org. si vous avez des données cartographiques non-dynamique dans GeoServeur (ou n'importe quel serveur cartographique) cela permettra aux utilisateurs de votre application d'avoir les mêmes conditions que ceux rencontré sur Google Map en terme de réceptivité et d'utilisabilité. Ce document vous initiera à la configuration d'un tel serveur de cache (ou en pointant vers la doc) ainsi qu'à certains trucs et astuces qui sont arrivé au fur et à mesure. Si vous avez des informations que nous avons oublié, n'hésitez pas à les inclure ici, c'est un wiki, inscrivez vous et ajoutez vos informations. Nous recommandons cette solution par rapport à squid ou à oscache, car TileCache a été spécialement conçu pour les WMS.

D'autres systèmes de cache existent, par exemple GeowebCache, utilisé par GeoServer. C'est une implémentation en java de la mise en cache de tuile, qui fonctionne très bien et est beaucoup plus rapide pour les applications java, et à partir de la version 0.8 pourra être utilisé directement dans GeoServer. Il n'est pas nécessaire d'activer mod_python pour avoir de meilleur performance, etc. Le présent document évoluera pour prendre en compte les astuces à la fois de TileCache et de GeoWebCache.

Présentation

TileCache est le fruit d'une discussion très intéressante de la communauté Géomatique Open source lors due FOSS4G 2006. Le but était de proposer une manière standard de faire des requêtes WMS sur les images, dans le but d'augmenter leur possibilité à être mises en cache. Cela permet aux clients d'utiliser des “tuiles” qu'ils peuvent requêter en batch et qui nécessite d'être crée seulement une fois, au lieu de faire des requêtes dynamiques pour chaque image. Cela a été une des plus belle innovation de Google Maps, et nous supposons que nous pouvions tirer profit de notre implémentation de notre Web Map Service existant pour générer des images, en ayant des clients en accord avec la manière de demander les images.

Le résultat de cette discussion a été deux spécifications en test, qui nous l'espérons aura une plus large adoption et éventuellement se transformera en une spécification plus officielle. La Recommandation des Clients de Tuiles WMS définie comment un client WMS normal envoie les requêtes d'une manière que les serveurs WMS puissent prendre avantage de la mise en cache. Et la Spécification du Service de Cartographie en Tuile est une tentative d'un nouveau service dont l'objectif est de servir des tuiles (bien que traditionnellement servit par un WMS traditionnel).

TileCAche implémente ces deux spécifications, dans le dernier cas seulement en permettant des requêtes WMS et en mettant en cache le résultat. Il a été développé en python, et se situe en amont d'un WMS. Il fonctionne en conjonction avec un client de tuile comme OpenLayers, et a été développé par les mêmes personnes.

Installation

Configurer TileCache est un jeu d'enfant. À partir de la page officielle :

  • Télécharger vers un répertoire web qui autorise les scripts CGI.
  • Décompresser le fichier : tar -zvxf tilecache-1.4.tar.gz
  • C'est fait ! Vous utilisez un cache WMS sur votre disque lorsque vous naviguer !

Cela mettra en cache la couche vmap0 de MetaCarta dans le répertoire temp/ sur votr edisque, mais vous voulez probablement mettre en ache vos propres couches issu de votre serveur cartographique.

La configuration de TileCache est définie dans le fichier tilecache.cfg. La première modification que vous voudrez changer est de sauver les tuiles dans un répertoire autre que le répertoire temporaire. Changez la propriété 'base' à l'endroit où vous désirez sauvegarder vos tuiles, et assurez vous que TileCache (ou apache ou ce qui lance le CGI) possède les droits en écriture à cet endroit.

Puis vous définirez TileCache pour pointer vers votre serveur cartographique. La configuration la plus basique pour cela est :

  [sigma]
  type=WMSLayer
  layers=topp:countries,topp:gnis_pop
  url=http://sigma.openplans.org:8080/geoserver/wms?
  extension=png

'sigma' est le nom de la couche à laquelle TileCache répondra. Vous listez vos couches, il peut y en avoir autant que désirez ou juste une seule. Vous rajoutez l'url de votre serveur cartographique et l'extension de l'image.

Pour tester ceci vous pouvez utiliser OpenLayers. La démo de TileCache utilise OpenLayers, la chose la plus facile à faire pour voir si votre couche est fonctionnelle est de modifier le fichier index.html à la racine de votre installation de TileCache. Éditez la partie 'layers: vmap0' en changeant vmap0 par le nom de votre couche.

Personnalisation

Ensuite vous pourrez vouloir configurer TileCache pour votre propre client web. Pour l'instant OpenLayers est notre client web favori et fonctionne avec TileCache mais pour les développeurs Flash, il existe WorldKit. Paramétrer une jolie carte sous OpenLayers va au delà de cette partie, mais vous pouvez regarder les sections précédentes.

Pour obtenir une nouvelle couche TileCache est très facile. Vous devez juste définir une couche WMS normale, et puisqu'OpenLayers suit les recommandations des clients de tuiles WMS, il fonctionne directement.

ol_map = new OpenLayers.Map('ol_map', {'controls': [], 'maxZoomLevel': 17} );
wms_sigma = new OpenLayers.Layer.WMS( "TIGER", "http://sigma.openplans.org/tilecache-1.3/tilecache.py?",
                                    {layers: 'sigma' }, {numZoomLevels: 17});
ol_map.addLayer(wms_sigma);

Trucs et astuces

Voici quelques recommandations pour que TileCache fonctionne encore mieux. Une partie est dans la documentation de TileCache, mais ceci reprends des informations de différentes sources.

Transparence

(et d'autres paramètres de style et d'option WMS)

Une des question principales avec TileCache est 'comment je rend mes couches transparentes ?' C'est assez facile à faire, après l'avoir demandé.

url=http://sigma.openplans.org:8080/geoserver/wms?transparent=true

La manière dont fonctionne TileCache est qu'il utilise n'importe quel url que vous lui fournissez et ajoute les paramètres dont il a besoin. L'effet de bord est que vous pouvez ajouter n'importe quel paramètres WMS à cette url de base. Vous pouvez définir des 'styles' alternatif, et même fournir des paramètres SLD complet. Vous devez juste ajouter ces paramètres à la partie configuration de l'url pour votre couche.

Seuls les formats png et gif possède une couche de transparence (appelé couche alpha). Le format jpeg ne peut pas être transparente, inutile de chercher des heures où se trouve le problème : il faut changer de format !

metaTile

Une des meilleurs améliorations de performance que vous pouvez mettre en place est d'activer 'metaTile'. Cela permet d'obtenir des cartes plus belles dans la plupart des cas :

[sigma]
type=WMSLayer
layers=topp:poly_landmarks,topp:water_polygon,topp:water_shorelines,topp:roads,topp:major_roads,topp:states,topp:countries,topp:gnis_pop
url=http://sigma.openplans.org:8080/geoserver/wms?transparent=true
extension=png
metaTile=true

Sachez que cette option nécessite d'avoir la bibliothèque Python Imaging installée sur votre instance python. Si votre TileCache ne fonctionne plus après avoir ajouté metaTile=true alors vous ne l'avez probablement pas installé proprement.

metaTile demande un seule grande tuile que TileCache divise en plus petites tuiles. Dans GeoServer nous avons vu une amélioration importante des performances sur les couches vectorielles lors de son utilisation - notre couche sigma utilisait jusqu'à quelques secondes pour chaque tuile lors de la génération de chaque tuile plus petite. Avec metaTile définie à true nous avons eut une moyenne de 6-7 tuiles par seconde, soit une multiplication par 5 de la vitesse.

La contrainte est que cela met un peu plus de temps pour que la requête initiale apparaisse sur l'écran puisque cela génère quelques tuiles en une fois. Vous pouvez contrôler combien de tuile sont demandée avec la propriété metaSize. Par défaut il est de 5×5. Cela vaut le coup de jouer avec ce paramètre, le compromis se situe entre la vitesse du chargement de la tuile intiale et la rapidité du chargement de toutes les tuiles. Si vous remplissez le cache cela vaut le cout de le définir assez large, puisqu'après tout plus la taille est importante plus ca sera rapide.

The metaBuffer parameter is not really needed by GeoServer, since it doesn't have trouble with trying to round corners at image borders. But using metaTile does lead to nicer looking images, since labeling is really hard to get right in tiles. We did a good bit of research to try to get things better, but concluded that a metaTile approach is probably the best way to go.

Note that raster layers likely won't see very big performance gains from this, unless the overhead on the WMS of reading the request and accessing the raster each time is high. But we've not tested this extensively, so please report back if you test it out.

mod_python

Nous recommandons fortement d'installer mod_python pour utiliser votre tilecache. Il rend les choses significativement plus rapide, et après tout, vous faites cela dans le but d'accélérer votre serveur, alors pourquoi ne pas aller au fond des choses ? Vous devez installer mod_python dans votre installation apache. Puis suivez juste les directions dans le fichier README du répertoire TileCache, il y a des informations pour configurer mod_python. Il y a très peu de chose à dire mais nous voulons juste insister qu'il est intéressant de perdre un peu de temps à le configurer, vous obtiendrez une vitesse deux fois supérieur au minimum.

mod_expires

Si vous utilisez apache vous devriez configurer mod_expires. Cela donne une meilleur expérience aux utilisateurs, puisque leurs clients mettra en cache les images sur leur poste. Si cela n'est pas fait, le déplacement vers une nouvelle zone puis un retour à la zone initiale rechargera les images. Si vous configurez mod_expires alors votre navigateur saura qu'il n'a pas besoin de demander les images de nouveau. Six heures est probablement assez long, ajuster votre configuration apache (et assurez vous qu'il soit installer).

ExpiresActive on
ExpiresDefault "now plus 6 hours"

Tromper la limite de connection des navigateur avec OpenLayers

Une des manières que Google, Yahoo! et Microsoft ont pour augmenter la vitesse de chargement des cartes est que votre navigateur ouvre plusieurs connections. Si vous avez regarder en détail lorsque Google est en train de les charger vous avez probablement vue le chargement venir de kh1.google.com, kh2.google.com, kh3.google.com, etc. La plupart des navigateurs vous permettent d'ouvrir deux connections à un serveur à la fois.

À partir de la version 2.3, OpenLayers vous permettra de fournir une liste de nom de WMS, au lieu d'un seul, et il les utilisera tous lors de la requête des tuiles au lieu d'un seul.

        wms_sigma = new OpenLayers.Layer.WMS( "TIGER",
            ["http://sigma4.openplans.org/tilecache-1.3/tilecache.py?",
             "http://sigma3.openplans.org/tilecache-1.3/tilecache.py?",
             "http://sigma2.openplans.org/tilecache-1.3/tilecache.py?",
             "http://sigma1.openplans.org/tilecache-1.3/tilecache.py?"],
            {layers: 'sigma' }, {numZoomLevels: 17});

Maintenant vous pensez «mais je n'ai pas quatre serveurs !». Pas besoin de s'en faire, vous pouvez augmenter les performances avec un seul serveur. Vous devez juste configurer le DNS correctement ainsi tous les noms des WMS pointera sur la même machine (et peut être une configuration du serveur). Même s'ils pointent tous sur la même machine cela devrait apparaitre beaucoup plus rapide aux utilisateurs, puisque TileCache est capable de renvoyer une image assez rapidement, ainsi si vous demandez plus d'une tuile à la fois, vous en obtiendrez plus d'une à la fois.

Nourrir le Cache

Une des plus intéressant mais peu connus outils de TileCache est le client, qui vous permet de nourrir automatiquement le cache, en générant des requêtes à votre serveur avant que les clients réels ne le fassent. Avec cela vous pouvez vous assurez que chaque requête est rapide au début, ou même pre-caché sélectivement certaine zone pour vous assurez qu'elle s'afficheront rapidement, et laisser les utilisateurs créer le cache pour les zones populaires.

Jusqu'à la version 1.4, il n'y avait aucune documentation sur cette fonctionnalité, et même maintenant il est renvoyé à la dernière section du fichier README.

Le client est localisé dans le sous répertoire TileCache de l'install TileCache. C'est un programme en Python qui effectue des appels répétitifs vers votre serveur et les met en cache dans une zone données et un niveau de zoom.

python Client.py 'http://monitor.metacarta.com/wms-c/Basic.py?' DRG 0 13 -124.334335,25.569305,-69.051132,49.56344 

Cela signifie que la couche 'DRG' du site http://monitor.metacarta.com/wms-c/Basic.py? du zoom 0 à 13 pour les États-Unis. Vous désirez viser votre instance TileCache, tout ce qu'il fait est de parcourir la zone donnée, donc si vous pointez directement sur votre serveur cartographique (GeoServer ou mapserver) il ne nourrira pas le cache. Ajustez le à votre couche, la zone et les niveaux de zoom que vous désirez pre-cacher.

Nous lançons ce processus sur le serveur, il n'y a donc pas de problème de ralentissement de réseau. Mais ce processus peut prendre un certain temps, nous recommandons d'utiliser 'nohup' avant si vous vous connectez avec telnet, ainsi si votre connection est coupé, le processus continue. Pour de très grosses cartes vous devrez mettre en pre-cache juste les premiers zoom, puisque cela pourrait prendre des jours, si ce n'est des semaines, pour pré-cacher tous les niveaux de zoom. Notre cache sigma fait actuellement 80 Go.

Supprimez les tuiles roses

Nous avons tous remarqué un jour ou l'autre un moment où les tuiles n'étaient pas chargé complètement, souvent en laissant une tuile rose à la place d'une belle carte. Cela semble arrivé un peu plus souvent avec TileCache, cela peut être dû à OpenLayers qui ne récupère par les informations correctement en fonction des recommandations des tuilages WMS. Mais heureusement il y a une option de configuration qui permet d'éviter cela. C'est un peu bancale, simplement cela permettra à OpenLayers ne de pas abandonner tout de suite, mais de relancer le serveur encore quelques fois. Pour définir ce comportement, ajouter juste dans votre code javascript :

OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;

Cela signifie qu'il tentera de charger les tuiles 3 fois. Vous pouvez augmenter aussi haut que désiré, mais l'expériences a montré aue 3 est une bonne valeur.

Contact - Information et copyright - Statistique

Recent changes RSS feed Creative Commons License Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki