Web Map Tile Service: Unterschied zwischen den Versionen

Aus Geoinformation HSR
Wechseln zu: Navigation, Suche
(Scale Denominator: Herleitung & Berechnung für XYZ (OSM/Google-compatible))
(WMTS Tool "Tiles à la Google Maps")
(19 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete & vor-gerenderte) Kachelsammlung anzubieten.
+
Der [[OGC]]-Standard '''Web Map Tile Service (WMTS)''' ([http://www.opengeospatial.org/standards/wmts offizielle Website mit Versionen], [http://portal.opengeospatial.org/files/?artifact_id=35326 PDF v1.0.0]) ist eine von [[Web Map Tiling#Spezifikationen|mehreren Konventionen]] um Rasterkarten als (potenziell vor-berechnete & vor-gerenderte) Kachelsammlung anzubieten.
  
Siehe auch Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).
+
Siehe auch  
 +
* [[Hintergrundkarten]] und [[Web Map Tiling]].
 +
* Wikipedia ([https://en.wikipedia.org/wiki/Web_Map_Tile_Service en]|[https://de.wikipedia.org/wiki/Web_Map_Tile_Service de]).
 +
* WMTS Tool "Tiles à la Google Maps" https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection/#3/15.00/50.00
 +
 
 +
== Verwendung ==
 +
 
 +
=== Einbinden auf SwissTopo-Webkarte ===
 +
 
 +
# Gehe auf https://map.geo.admin.ch/
 +
# Unter "Advanced Tools" (de: "Erweiterte Werkzeuge"), klicke "Import" (de: "Importieren")
 +
# Gib die URL zur <code>WMTSCapabilities.xml</code>-Datei an
 +
# Klicke "Connect" (de: "Verbinden")<br />Die Liste der verfügbaren Layer des WMTS wird angezeigt. Durch Hovern über dem jeweiligen Listeneintrag wird eine Vorschau im Hintergrund geladen.
 +
# Für jeden gewünschten Layer:
 +
## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste
 +
## Füll wahlweise das Feld "Description" (de: "Beschreibung" aus) '''(optional)'''
 +
## Klicke "Add Layer" (de: "Layer Hinzufügen")
 +
 
 +
 
 +
=== Einbinden in QGIS ===
 +
 
 +
Variante QGIS Builtin (XYZ/TMS Tiles Driver):
 +
* Im QGIS Browser eine neue Verbindung (Connection) eines "XYZ Tiles" anlegen und dann "Add Layer to Project".
 +
* Siehe https://felix.rohrba.ch/en/2017/easily-add-tilemap-layers-qgis/
 +
 
 +
Variante mit GDAL Konfig.-Datei (XML)
 +
* Siehe [[Hintergrundkarten]], [[Web_Map_Tiling]].
 +
 
 +
Variante als WMTS Layer (OGC Standard, WMTSCapabilities.xml)
 +
# Menü "Layer" > "Add Layer" > "Add WMS/WMTS Layer..." oder <kbd>Ctrl</kbd>-<kbd>Shift</kbd>-<kbd>W</kbd>
 +
# Button "New"
 +
# Feld "Name" beliebig ausfüllen
 +
# In Feld "URL" die URL zur <code>WMTSCapabilities.xml</code>-Datei angeben
 +
# Button "OK"
 +
# Button "Connect"<br />Die Liste der verfügbaren Layer des WMTS wird angezeigt.
 +
# Für jeden gewünschten Layer:
 +
## Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste
 +
## Klicke Button "Add"
 +
# Klicke Button "Close"
 +
 
 +
== Begrenzungen ==
 +
 
 +
{| class="wikitable"
 +
|-
 +
! Position im XML-Baum (XPath)
 +
! begrenzt
 +
! mittels
 +
! Minimalbeispiel
 +
! Maximalbeispiel
 +
|-
 +
| <code>//Layer/ows:BoundingBox</code>
 +
|
 +
das '''dargestellte Datenset'''
 +
des Layers
 +
 
 +
(informativ;
 +
Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)
 +
| Koordinaten im CRS des Layers
 +
| <pre>
 +
<ows:BoundingBox>
 +
    <ows:LowerCorner>420000 30000</ows:LowerCorner>
 +
    <ows:UpperCorner>900000 350000</ows:UpperCorner>
 +
</ows:BoundingBox>
 +
</pre>
 +
| <pre>
 +
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG:6.3:21781" dimensions="2">
 +
    <ows:LowerCorner>420000.000000 30000.000000</ows:LowerCorner>
 +
    <ows:UpperCorner>900000.000000 350000.000000</ows:UpperCorner>
 +
</ows:BoundingBox>
 +
</pre>
 +
|-
 +
| <code>//Layer/WGS84BoundingBox</code>
 +
|
 +
das '''dargestellte Datenset'''
 +
des Layers
 +
 
 +
(informativ;
 +
Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)
 +
| dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)
 +
| <pre>
 +
<ows:WGS84BoundingBox>
 +
    <ows:LowerCorner>-180 -85.05112878</ows:LowerCorner>
 +
    <ows:UpperCorner>180 85.05112878</ows:UpperCorner>
 +
</ows:WGS84BoundingBox>
 +
</pre>
 +
| <pre>
 +
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84" dimensions="2">
 +
    <ows:LowerCorner>-180.0 -85.05112877980659237838</ows:LowerCorner>
 +
    <ows:UpperCorner>180.0 85.05112877980659237838</ows:UpperCorner>
 +
</ows:WGS84BoundingBox>
 +
</pre>
 +
|-
 +
| <code>//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits</code>
 +
|
 +
die '''abrufbaren Tiles'''
 +
des Layers
 +
für diese TileMatrix innerhalb des verlinken TileMatrixSets
 +
 
 +
(normativ;
 +
Anfrage ausserhalb sollte zu <code>TileOutOfRange</code>-Exception bzw. HTTP-Status-Code <code>400</code> <code>Bad Request</code> führen)
 +
| Tile-Indices
 +
| <!-- TODO: Minimalbeispiel -->
 +
| <!-- TODO: Maximalbeispiel -->
 +
|-
 +
| <code>//TileMatrixSet/BoundingBox</code>
 +
|
 +
den '''Definitionsbereich''' des TileMatrixSets
 +
und damit
 +
die '''potentiell abrufbaren Tiles'''
 +
aller aktuellen ''und künftigen'' Layers,
 +
die dieses Set verwenden
 +
| Koordinaten im CRS des TileMatrixSets
 +
| <!-- TODO: Minimalbeispiel -->
 +
| <!-- TODO: Maximalbeispiel -->
 +
|-
 +
|}
  
 
== XYZ &rarr; WMTS ==
 
== XYZ &rarr; WMTS ==
  
 
Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei <code>WMTSCapabilities.xml</code> serviert.
 
Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei <code>WMTSCapabilities.xml</code> serviert.
 +
 +
=== Beispiel ===
 +
 +
Kacheln von osm.ch als WMTS Konfig.-Datei:
 +
https://gist.githubusercontent.com/das-g/882334b2844d5cdc7807eb9c12b8bccb/raw/WMTSCapabilities.xml
 +
 +
=== XML-Schema-Validierung für <code>WMTSCapabilities.xml</code> ===
 +
 +
Siehe auch [https://stackoverflow.com/a/129401/674064 diese StackOverflow-Antwort bzgl. "XML Schema (XSD) validation tool"].
 +
 +
==== Mit <code>xmllint</code> (libxml) ====
 +
 +
(CLI-Tool, das bei libxml mitinstalliert wird, und somit auf Linux & Mac meist bereits vorhanden ist.)
 +
 +
<pre>
 +
xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml
 +
</pre>
 +
oder
 +
<pre>
 +
xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml
 +
</pre>
 +
(Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)
 +
 +
==== Mit <code>xsd-validator</code> ====
 +
 +
(Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)
 +
 +
<pre>
 +
git clone https://github.com/amouat/xsd-validator.git
 +
wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd
 +
wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd
 +
./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml
 +
</pre>
 +
 +
oder einfach
 +
 +
<pre>
 +
git clone https://github.com/amouat/xsd-validator.git
 +
wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd
 +
./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml
 +
</pre>
 +
 +
(<code>xsd-validator</code> kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit <code>wget</code> selbst herunter. Auch die XML-Datei muss lokal vorliegen.)
 +
  
 
=== TileMatrixSet ===
 
=== TileMatrixSet ===
Zeile 13: Zeile 172:
 
==== Scale Denominator ====
 
==== Scale Denominator ====
  
In Tabelle E.4 "Definition of Well-known scale set GoogleMapsCompatible" im Standard sind die Werte des "Scale Denominator" bereits für die Zoom-Levels 0-18 angegeben. Diese lassen sich aber auch wie folgt berechnen:
+
In Tabelle E.4 "Definition of Well-known scale set GoogleMapsCompatible" im Standard sind die Werte des "Scale Denominator" bereits für die Zoom-Levels 0&ndash;18 angegeben. Diese lassen sich aber auch wie folgt berechnen:
  
 
===== Herleitung =====
 
===== Herleitung =====
Zeile 19: Zeile 178:
 
In Abschnitt 6.1 "Tile matrix set – the geometry of the tiled space" des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:
 
In Abschnitt 6.1 "Tile matrix set – the geometry of the tiled space" des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:
 
<pre>pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)</pre>
 
<pre>pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)</pre>
 +
 +
Die Standard-Pixelgrösse ist gemäss OGC SLD Standard 0.28 Millimeter.
 +
 
<pre>tileSpanX = tileWidth × pixelSpan</pre>
 
<pre>tileSpanX = tileWidth × pixelSpan</pre>
  
Zeile 43: Zeile 205:
 
<pre>scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)</pre>
 
<pre>scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)</pre>
  
Berechnung für Zoomlevels 0-18 in Python 3.6:
+
Berechnung für Zoomlevels 0&ndash;18 in Python 3.6:
 
<pre>
 
<pre>
 
from math import tau
 
from math import tau
  
 
equator_length = 6378137 * tau
 
equator_length = 6378137 * tau
{i:equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}
+
{i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}
 
</pre>
 
</pre>
 
<pre>
 
<pre>
Zeile 70: Zeile 232:
 
  17: 4265.459167699568,
 
  17: 4265.459167699568,
 
  18: 2132.729583849784}
 
  18: 2132.729583849784}
 +
</pre>
 +
 +
==== Pixel Size (m) ====
 +
 +
Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den 0.28&nbsp;mm/px-Faktor weglässt:
 +
<pre>pixelSize = 6378137 × Tau / (256 × (2^Z))</pre>
 +
 +
Berechnung für Zoomlevels 0&ndash;18 in Python 3.6:
 +
<pre>
 +
from math import tau
 +
 +
equator_length = 6378137 * tau
 +
{i : equator_length / (256 * 2**i) for i in range(19)}
 +
</pre>
 +
<pre>
 +
{0: 156543.03392804097,
 +
1: 78271.51696402048,
 +
2: 39135.75848201024,
 +
3: 19567.87924100512,
 +
4: 9783.93962050256,
 +
5: 4891.96981025128,
 +
6: 2445.98490512564,
 +
7: 1222.99245256282,
 +
8: 611.49622628141,
 +
9: 305.748113140705,
 +
10: 152.8740565703525,
 +
11: 76.43702828517625,
 +
12: 38.21851414258813,
 +
13: 19.109257071294063,
 +
14: 9.554628535647032,
 +
15: 4.777314267823516,
 +
16: 2.388657133911758,
 +
17: 1.194328566955879,
 +
18: 0.5971642834779395}
 
</pre>
 
</pre>

Version vom 21. Juni 2022, 14:22 Uhr

Der OGC-Standard Web Map Tile Service (WMTS) (offizielle Website mit Versionen, PDF v1.0.0) ist eine von mehreren Konventionen um Rasterkarten als (potenziell vor-berechnete & vor-gerenderte) Kachelsammlung anzubieten.

Siehe auch

Verwendung

Einbinden auf SwissTopo-Webkarte

  1. Gehe auf https://map.geo.admin.ch/
  2. Unter "Advanced Tools" (de: "Erweiterte Werkzeuge"), klicke "Import" (de: "Importieren")
  3. Gib die URL zur WMTSCapabilities.xml-Datei an
  4. Klicke "Connect" (de: "Verbinden")
    Die Liste der verfügbaren Layer des WMTS wird angezeigt. Durch Hovern über dem jeweiligen Listeneintrag wird eine Vorschau im Hintergrund geladen.
  5. Für jeden gewünschten Layer:
    1. Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste
    2. Füll wahlweise das Feld "Description" (de: "Beschreibung" aus) (optional)
    3. Klicke "Add Layer" (de: "Layer Hinzufügen")


Einbinden in QGIS

Variante QGIS Builtin (XYZ/TMS Tiles Driver):

Variante mit GDAL Konfig.-Datei (XML)

Variante als WMTS Layer (OGC Standard, WMTSCapabilities.xml)

  1. Menü "Layer" > "Add Layer" > "Add WMS/WMTS Layer..." oder Ctrl-Shift-W
  2. Button "New"
  3. Feld "Name" beliebig ausfüllen
  4. In Feld "URL" die URL zur WMTSCapabilities.xml-Datei angeben
  5. Button "OK"
  6. Button "Connect"
    Die Liste der verfügbaren Layer des WMTS wird angezeigt.
  7. Für jeden gewünschten Layer:
    1. Wähle (durch Anklicken) den gewünschten WMTS-Layer aus der angezeigten Liste
    2. Klicke Button "Add"
  8. Klicke Button "Close"

Begrenzungen

Position im XML-Baum (XPath) begrenzt mittels Minimalbeispiel Maximalbeispiel
//Layer/ows:BoundingBox

das dargestellte Datenset des Layers

(informativ; Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)

Koordinaten im CRS des Layers
<ows:BoundingBox>
    <ows:LowerCorner>420000 30000</ows:LowerCorner>
    <ows:UpperCorner>900000 350000</ows:UpperCorner>
</ows:BoundingBox>
<ows:BoundingBox crs="urn:ogc:def:crs:EPSG:6.3:21781" dimensions="2">
    <ows:LowerCorner>420000.000000 30000.000000</ows:LowerCorner>
    <ows:UpperCorner>900000.000000 350000.000000</ows:UpperCorner>
</ows:BoundingBox>
//Layer/WGS84BoundingBox

das dargestellte Datenset des Layers

(informativ; Tiles können auch ausserhalb verfügbar sein, stellen dort aber keine Daten dar)

dezimalen WGS84-Koordinaten (lon-lat: Längengrad vor Breitengrad)
<ows:WGS84BoundingBox>
    <ows:LowerCorner>-180 -85.05112878</ows:LowerCorner>
    <ows:UpperCorner>180 85.05112878</ows:UpperCorner>
</ows:WGS84BoundingBox>
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84" dimensions="2">
    <ows:LowerCorner>-180.0 -85.05112877980659237838</ows:LowerCorner>
    <ows:UpperCorner>180.0 85.05112877980659237838</ows:UpperCorner>
</ows:WGS84BoundingBox>
//Layer/TileMatrixSetLink/TileMatrixSetLimits/TileMatrixLimits

die abrufbaren Tiles des Layers für diese TileMatrix innerhalb des verlinken TileMatrixSets

(normativ; Anfrage ausserhalb sollte zu TileOutOfRange-Exception bzw. HTTP-Status-Code 400 Bad Request führen)

Tile-Indices
//TileMatrixSet/BoundingBox

den Definitionsbereich des TileMatrixSets und damit die potentiell abrufbaren Tiles aller aktuellen und künftigen Layers, die dieses Set verwenden

Koordinaten im CRS des TileMatrixSets

XYZ → WMTS

Hat man bereits einen nach XYZ-Konvention im Web verfügbaren Kachel-Satz, so lässt sich aus diesem ein (RESTful) WTMS machen, in dem man eine passende (statische) ServiceMetadata-XML-Datei WMTSCapabilities.xml serviert.

Beispiel

Kacheln von osm.ch als WMTS Konfig.-Datei: https://gist.githubusercontent.com/das-g/882334b2844d5cdc7807eb9c12b8bccb/raw/WMTSCapabilities.xml

XML-Schema-Validierung für WMTSCapabilities.xml

Siehe auch diese StackOverflow-Antwort bzgl. "XML Schema (XSD) validation tool".

Mit xmllint (libxml)

(CLI-Tool, das bei libxml mitinstalliert wird, und somit auf Linux & Mac meist bereits vorhanden ist.)

xmllint --noout --schema http://www.opengis.net/wmts/1.0 WMTSCapabilities.xml

oder

xmllint --noout --schema http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd WMTSCapabilities.xml

(Falls das Schema lokal vorhanden ist, kann auch der Pfad zur Schema-Datei angegeben werden. Umgekehrt kann die XML-Datei auch als URL angegeben werden, um eine online verfügbare Version zu validieren. Allerdings scheint für Schema und XML nur HTTP, nicht aber HTTPS zu funktionieren.)

Mit xsd-validator

(Kleines Java-Programm, das den Standard-XML-Parser der JRE (normalerweise Xerces) verwendet.)

git clone https://github.com/amouat/xsd-validator.git
wget http://www.opengis.net/wmts/1.0 --output-document=wmts.xsd
wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd
./xsd-validator/xsdv.sh wmts.xsd WMTSCapabilities.xml

oder einfach

git clone https://github.com/amouat/xsd-validator.git
wget http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd
./xsd-validator/xsdv.sh wmtsGetCapabilities_response.xsd WMTSCapabilities.xml

(xsd-validator kann nur mit lokalen Schema-Dateien umgehen, daher laden wir diese(s) hier mit wget selbst herunter. Auch die XML-Datei muss lokal vorliegen.)


TileMatrixSet

Für einen Kachel-Satz nach OSM- & Google Maps-Konvention kann das "Well-known scale set" "GoogleMapsCompatible" (urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible) aus Annex E.4 des Standards verwendet werden.

Scale Denominator

In Tabelle E.4 "Definition of Well-known scale set GoogleMapsCompatible" im Standard sind die Werte des "Scale Denominator" bereits für die Zoom-Levels 0–18 angegeben. Diese lassen sich aber auch wie folgt berechnen:

Herleitung

In Abschnitt 6.1 "Tile matrix set – the geometry of the tiled space" des Standards erhalten wir (unten auf Seite 8) u.A. folgende beiden Formeln:

pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)

Die Standard-Pixelgrösse ist gemäss OGC SLD Standard 0.28 Millimeter.

tileSpanX = tileWidth × pixelSpan

Daraus folgt

tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)

und daraus durch auflösen nach scaleDenominator

scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)

Die Kachel-Kantenlänge in Pixel tileWidth ist bei OSM & Google immer 256.

Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist metersPerUnit(crs) hierfür 1.

Bei Zoomlevel Z wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf 2^Z × 2^Z Kacheln abgebildet. Entlang des Äquators hat man also 2^Z Kachel-Kanten. Laut Annex E.4 stimmen die "Scale Denominator"-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius (im EPSG-Eintrag "Semi-Major Axis (a)" genannt) ist der von WGS 84 und beträgt 6'378'137 m. Mit Tau (a.k.a. 2 Pi) multipliziert ergibt dies die Äquatorlänge. Damit ist

tileSpanX = Äquatorlänge  / (2^Z)
          = 6378137 × Tau / (2^Z)

Damit ergibt sich

scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)

oder umgeformt die

Berechnungsformel
scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)

Berechnung für Zoomlevels 0–18 in Python 3.6:

from math import tau

equator_length = 6378137 * tau
{i : equator_length / (256 * 2**i * 0.28e-3) for i in range(19)}
{0: 559082264.0287178,
 1: 279541132.0143589,
 2: 139770566.00717944,
 3: 69885283.00358972,
 4: 34942641.50179486,
 5: 17471320.75089743,
 6: 8735660.375448715,
 7: 4367830.1877243575,
 8: 2183915.0938621787,
 9: 1091957.5469310894,
 10: 545978.7734655447,
 11: 272989.38673277234,
 12: 136494.69336638617,
 13: 68247.34668319309,
 14: 34123.67334159654,
 15: 17061.83667079827,
 16: 8530.918335399136,
 17: 4265.459167699568,
 18: 2132.729583849784}

Pixel Size (m)

Die im Annex E.4 angegebenen (obwohl im XML wohl nicht anzugebenden) Pixel-Grössen in Metern ergeben sich, wenn man aus obiger Formel den 0.28 mm/px-Faktor weglässt:

pixelSize = 6378137 × Tau / (256 × (2^Z))

Berechnung für Zoomlevels 0–18 in Python 3.6:

from math import tau

equator_length = 6378137 * tau
{i : equator_length / (256 * 2**i) for i in range(19)}
{0: 156543.03392804097,
 1: 78271.51696402048,
 2: 39135.75848201024,
 3: 19567.87924100512,
 4: 9783.93962050256,
 5: 4891.96981025128,
 6: 2445.98490512564,
 7: 1222.99245256282,
 8: 611.49622628141,
 9: 305.748113140705,
 10: 152.8740565703525,
 11: 76.43702828517625,
 12: 38.21851414258813,
 13: 19.109257071294063,
 14: 9.554628535647032,
 15: 4.777314267823516,
 16: 2.388657133911758,
 17: 1.194328566955879,
 18: 0.5971642834779395}