Web Map Tile Service: Unterschied zwischen den Versionen
Das-g (Diskussion | Beiträge) (Neuer Abschnitt →XYZ → WMTS) |
Das-g (Diskussion | Beiträge) (→Scale Denominator: Herleitung & Berechnung für XYZ (OSM/Google-compatible)) |
||
| Zeile 10: | Zeile 10: | ||
Für einen Kachel-Satz nach OSM- & Google Maps-Konvention kann das "Well-known scale set" "GoogleMapsCompatible" (<code><nowiki>urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible</nowiki></code>) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 Standards] verwendet werden. | Für einen Kachel-Satz nach OSM- & Google Maps-Konvention kann das "Well-known scale set" "GoogleMapsCompatible" (<code><nowiki>urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible</nowiki></code>) aus Annex E.4 des [http://portal.opengeospatial.org/files/?artifact_id=35326 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: | |||
<pre>pixelSpan = scaleDenominator × 0.28e-3 / metersPerUnit(crs)</pre> | |||
<pre>tileSpanX = tileWidth × pixelSpan</pre> | |||
Daraus folgt | |||
<pre>tileSpanX = tileWidth × scaleDenominator × 0.28e-3 / metersPerUnit(crs)</pre> | |||
und daraus durch auflösen nach <code>scaleDenominator</code> | |||
<pre>scaleDenominator = tileSpanX × metersPerUnit(crs) / (tileWidth × 0.28e-3)</pre> | |||
Die Kachel-Kantenlänge in Pixel <code>tileWidth</code> ist bei OSM & Google immer '''256'''. | |||
Das CRS WebMercator verwendet (pseudo-)Metrische Koordinaten, daher ist <code>metersPerUnit(crs)</code> hierfür '''1'''. | |||
Bei Zoomlevel <code>Z</code> wird die Welt zwischen 85.06°S and 85.06°N (und von 180°W bis 180°O) auf <code>2^Z × 2^Z</code> Kacheln abgebildet. Entlang des Äquators hat man also <code>2^Z</code> Kachel-Kanten. Laut Annex E.4 stimmen die "Scale Denominator"-Werte nur in Äquatornähe, also können wir das verwenden. Der Äquator-Radius ([http://www.epsg-registry.org/report.htm?type=selection&entity=urn:ogc:def:crs:EPSG::3857&reportDetail=short&style=urn:uuid:report-style:default-with-code&style_name=OGP%20Default%20With%20Code&title=EPSG:3857 im EPSG-Eintrag] "Semi-Major Axis (a)" genannt) ist der von WGS 84 und beträgt '''6'378'137 m'''. Mit <code>Tau</code> (a.k.a. <code>2 Pi</code>) multipliziert ergibt dies die Äquatorlänge. Damit ist | |||
<pre> | |||
tileSpanX = Äquatorlänge / (2^Z) | |||
= 6378137 × Tau / (2^Z) | |||
</pre> | |||
Damit ergibt sich | |||
<pre>scaleDenominator = (6378137 × Tau / (2^Z)) / (256 × 0.28e-3)</pre> | |||
oder umgeformt die | |||
===== Berechnungsformel ===== | |||
<pre>scaleDenominator = 6378137 × Tau / (256 × (2^Z) × 0.28e-3)</pre> | |||
Berechnung für Zoomlevels 0-18 in Python 3.6: | |||
<pre> | |||
from math import tau | |||
equator_length = 6378137 * tau | |||
{i:equator_length / (256 * 2**i * 0.28e-3) for i in range(19)} | |||
</pre> | |||
<pre> | |||
{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} | |||
</pre> | |||
Version vom 9. August 2017, 14:35 Uhr
Der OGC-Standard Web Map Tile Service (WMTS) ist eine von mehreren Konventionen um Rasterkarten als (potenziell vor-berechnete & vor-gerenderte) Kachelsammlung anzubieten.
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.
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)
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}