The difference between XYZ and TMS tiles and how to convert between them
Lots of tile-based maps use either the XYZ or TMS scheme. These are the maps that have tiles
ending in /0/0/0.png
or something. Sometimes if it's a script, it'll look like
&z=0&y=0&x=0
instead. Anyway, these are usually maps in Spherical Mercator.
Good examples are OpenStreetMap, Google Maps, MapBox, MapQuest, etc. Lots of maps.
Most of those are in XYZ. The best documentation for that is slippy map tilenames on the OSM Wiki, and Klokan's Tiles a la Google.
Some of them are in TMS instead. TMS is an OSGeo spec. Here's the wiki page on it. It's less popular and few services support the whole spec.
There are no advantages of XYZ over TMS or vice-versa for most maps*, but XYZ is more popular.
Let's get to the point. The only difference between the two is a flipped y coordinate.
In math:
y = (2^z) - y - 1
javascript
y = Math.pow(2, z) - y - 1;
php
y = pow(2, z) - y - 1;
python
y = (2 ** z) - y - 1
ruby
y = (2 ** z) - y - 1
When I say 'no difference' or 'no advantage' I mean for most maps. If you have some weird projection, use TMS but ideally don't make a tiled map in a weird projection in the first place. If you're forced to use OSGeo standards, do that but try to find a different job.
This originally credited OGC with TMS. It was OSGeo. OGC has WMTS. Don't use that either.
Fantastic article. Helped me a lot.
Please note that for for the tile index you may need to adjust with Math.floor(Math.pow(2, z) - y - 1)