Il est bien commode lors de la génération d’un cache tuilé avec TileCache d’utiliser le mode MetaTile permettant d’envoyer des requêtes correspondant à quelques centaines de tuiles d’un coup, qui sont ensuite redécoupées par TileCache. Cette opération est effectuée par le module PIL. Malheureusement, celui-ci et son implémentation dans TileCache ont quelques défauts qui peuvent aboutir à la dégradation des images faites en MetaTile comparativement à celles générées individuellement.

Le premier défaut concerne de JPEG. La valeur de compression à utiliser n’est pas précisée dans le code et PIL prend donc sa valeur par défaut de 75 %. L’image finale via MetaTile est donc  différente de celle issue de la source de données. Si le serveur WMS lui-même effectue une compression de 75 %, celle effectuée par PIL est vraiment de trop pour la qualité. Ce problème se règle néanmoins facilement, en changeant le code de Layer.py,en ajoutant ces deux lignes après la ligne 406 :

elif self.extension == ‘jpeg’:

subimage.save(

buffer,
self.extension,
quality=95,
optimize=True

)

Le niveau de qualité de 95 % correspond en effet à « pas de compression ». A 100 % il n’y a pas non plus de quantization des couleurs, et l’image est alors plus grosse que l’originale.
Le deuxième problème est plus embêtant. Il s’agit du format PNG-8bits, dont les palettes ne sont pas correctement restituées par PIL quand l’image a été générée en mode QUANTIZE ON. Pas de solution pour l’instant dans TileCache, malgré des tests faits avec PythonMagick plutôt que PIL. L’idée est donc d’utiliser du PNG 24bits, et de faire la quantization en post-traitement, avec pngnq par exemple et une tâche cron traitant nuitamment les fichiers créés dans la journée.

TileCache : attention aux MetaTiles !
Étiqueté avec :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.