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.