Web Map Tile Service: Unterschied zwischen den Versionen

Aus Geometa Lab OST
Zur Navigation springen Zur Suche springen
(Neuer Abschnitt →‎Begrenzungen: mit Tabelle)
(→‎Beispiel: Die WMTS-Datei für tile.osm.ch-Kachelsätze wird nun auch auf tile.osm.ch selbst serviert)
 
(15 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 ==
== Begrenzungen ==
Zeile 69: Zeile 107:
| <code>//TileMatrixSet/BoundingBox</code>
| <code>//TileMatrixSet/BoundingBox</code>
|
|
den '''Definitionsbereich''' des TileMatrixSets
und damit
die '''potentiell abrufbaren Tiles'''
die '''potentiell abrufbaren Tiles'''
des TileMatrixSets
aller aktuellen ''und künftigen'' Layers,
für alle aktuellen und künftigen Layers,
die dieses Set verwenden
die dieses Set verwenden
| Koordinaten im CRS des TileMatrixSets
| Koordinaten im CRS des TileMatrixSets
Zeile 82: Zeile 121:


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://tile.osm.ch/1.0.0/WMTSCapabilities.xml


=== XML-Schema-Validierung für <code>WMTSCapabilities.xml</code> ===
=== XML-Schema-Validierung für <code>WMTSCapabilities.xml</code> ===
Zeile 89: Zeile 133:
==== Mit <code>xmllint</code> (libxml) ====
==== Mit <code>xmllint</code> (libxml) ====


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


<pre>
<pre>
Zeile 134: 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 189: Zeile 236:
==== Pixel Size (m) ====
==== 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 mysteriösen 0.28&nbsp;mm/px-Faktor weglässt:
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>
<pre>pixelSize = 6378137 × Tau / (256 × (2^Z))</pre>



Aktuelle Version vom 2. Dezember 2025, 17:06 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://tile.osm.ch/1.0.0/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}