Stockage de tuiles : comprendre WMTS et TMS
Un problème ordinaire
Dans un premier temps, j'ai souhaité télécharger des tuiles vectorielles au format GeoJSON. Grâce à Landez, elles ont été stockées sur mon disque, sous la forme {z}/{x}/{y}.json. Cependant, au moment d'afficher leur contenu avec Leaflet, les tuiles sélectionnées ne semblaient pas présentes.
En réalité, la valeur y n'était pas bonne. Il s'agit d'un problème récurrent dans le monde de la cartographie en ligne : la confusion entre le stockage des tuiles selon les grilles utilisées par TMS et WMTS !
Quelques explications
TMS et WMTS sont des services permettant l'accès à des données tuilées, et doivent donc (entre autres) normaliser un chemin d'accès, fonction des valeurs x et y pour un niveau de zoom donné. Pour les coordonnées des tuiles, l'origine et le sens des ordonnées sur la grille diffèrent :

Standard TMS

Standard WMTS
Aujourd'hui, si le schéma de stockage, "y descendant", défini par standard WMTS de l'Open Geospatial Consortium tend à s'imposer (c'est celui utilisé par OpenStreetMap, Google Maps, Bing, ainsi que les interfaces de MapBox comme TileMill ou même mbutil), celui de TMS, "y ascendant", reste utilisé, notamment pour le stockage de la pyramide de tuiles du MBTiles. Landez a été écrit aux débuts de ce format dans le but de récupérer des tuiles d'un serveur distant pour être placées dans un MBTiles grâce à mbutil. Il avait donc tendance à préférer le schéma de TMS.
Spécifications de TMS et WMTS
Passer d'un schéma à l'autre, concrétement :
Rappelons que le changement de système TMS/WMTS ne va modifier que la valeur y (z et x ne sont pas impactés).
Le nombre de valeurs que peut prendre y à un niveau de zoom z vaut : nb_y = 2z (en effet, lorsqu'on gagne un niveau de zoom, nb_y est multiplié par deux).
On a donc : y ∈ [0, nb_y - 1]
Ainsi, la conversion de y vers y' donne : y' = ymax - y = nb_y - 1 - y
Un exemple :
Pour passer des schémas TMS à WMTS (ou l'inverse) pour la tuile à z = 4, x = 2, y = 5 :
Tuile z = 4, x = 2, yTMS = 5
- z vaut bien évidemment toujours 4
- x reste inchangé et a pour valeur 2
- nb_y = 24 = 16, donc y ∈ [0, 15]
- yTMS = 5 donc yWMTS = 15 - 5 = 10
Un problème résolu
Landez a désormais une option pour stocker le cache au format WMTS !