Praktijkrichtlijn Vector Tiling

Geonovum Praktijkrichtlijn
Consultatieversie

Deze versie:
https://docs.geostandaarden.nl/serv/cv-pr-vt-20210415/
Laatst gepubliceerde versie:
https://docs.geostandaarden.nl/serv/vt/
Laatste werkversie:
https://geonovum.github.io/praktijkrichtlijn-vector-tiling/
Redacteurs:
Niene Boeijen, This Way Cartography
Thijs Brentjens, Geonovum
Doe mee:
GitHub geonovum/praktijkrichtlijn-vector-tiling
Dien een melding in
Revisiehistorie
Pull requests
Rechtenbeleid:

Samenvatting

De Praktijkrichtlijn Vector Tiling formuleert eisen en aanbevelingen hoe vector tiles te gebruiken voor Nederlandse toepassingen. De praktijkrichtlijn richt zich op het aanbieden, publiceren en gebruiken van vector tiles in (web)applicaties, waarbij visualisatie het hoofddoel is. Dit moet het voor gebruikers makkelijker maken vector tiles van derden te gebruiken.

Enkele van de belangrijkste punten zijn:

Aanvullend op de praktijkrichtlijn is er een document met Best practices.

Status van dit document

Deze paragraaf beschrijft de status van dit document ten tijde van publicatie. Het is mogelijk dat er actuelere versies van dit document bestaan. Een lijst van Geonovum publicaties en de laatste gepubliceerde versie van dit document zijn te vinden op https://www.geonovum.nl/geo-standaarden/alle-standaarden.

Dit is een door de werkgroep goedgekeurde consultatieversie. Commentaar over dit document kan gestuurd worden naar geo-standaarden@geonovum.nl. Dit is de definitieve versie van de praktijkrichtlijn. Een praktijkrichtlijn is een product dat informatie geeft, vaak met een technisch karakter, dat nodig is voor het toepassen van een standaard. Een praktijkrichtlijn hoort altijd bij een standaard/norm.

1. Inleiding

1.1 Doel

De Prakrijktrichtlijn specificeert hoe het beste vector tiles aangeboden kunnen worden om breed gebruik mogelijk te maken (maximale interoperabiliteit), voor Nederlandse toepassingen. Dit moet het ook makkelijker maken om vector tiles van derden te gebruiken. Zie verder het hoofdstuk over de scope.

Deze praktijkrichtlijn is geen verplichting.

1.2 Totstandkoming

Dit document is opgesteld onder redactie van Geonovum. De inhoud is met Nederlandse experts in enkele werksessies afgestemd.

1.2.1 Werkgroepleden

Onder andere de volgende mensen hebben een bijdrage geleverd aan deze praktijkrichtlijn via de werksessies of op een andere manier:

  • Anton Bakker, Kadaster
  • Niene Boeijen, This Way Cartography (redactie)
  • Thijs Brentjens, Geonovum (redactie)
  • Stefan de Konink, Stichting OpenGeo
  • Jeroen Hogeboom, Kadaster
  • Edward Mac Gillavry, Webmapper
  • Just van den Broecke, Just Objects
  • Wouter Visscher, Kadaster

1.3 Aansluiten bij internationale standaarden

Deze Prakrijktrichtlijn gebruikt zoveel mogelijk internationale standaarden en specificaties. Waar dat nog niet goed mogelijk is, kiezen we de meest gangbare oplossing uit de praktijk. Deze richtlijn is niet gebonden aan specifieke software.

1.4 Best practices

Er zijn ook onderwerpen die niet per se gaan over interoperabiliteit, maar wel van belang kunnen zijn om op een goede, geschikte manier vector tiles aan te bieden. Deze staan in een apart Best practices document.

1.5 Doelgroep

De praktijkrichtlijn is bedoeld voor o.a.:

1.6 Leeswijzer

Dit document bevat kenmerken waaraan een implementatie moet voldoen (eisen) en waaraan een implementatie idealiter voldoet, maar niet noodzakelijk voor alle implementaties (aanbevelingen).

De Praktijkrichtlijn zelf is geen verplichting. Om een onderscheid te maken in prioriteit, hanteert de Prakrijktrichtlijn wel de termen EIS en AANBEVELING om de minimaal benodigde set van kenmerken aan te geven (eisen) voor hergebruik van vector tiles en de gewenste set (aanbevelingen) om het zo goed mogelijk te doen.

Eisen staan geformuleerd in oranje blokken, bijvoorbeeld:

EIS Dit is een vereist kenmerk

Aanbevelingen zonder extra opmaak:

AANBEVELING Dit is een aanbeveling

2. Scope

2.1 Binnen scope

De Praktijkrichtlijn richt zich op het aanbieden, publiceren en gebruiken van vector tiles in (web)applicaties, van data van Nederlandse organisaties.

Meer concreet gaat het om 2D vector tiles voor visualisatie / portrayal door derden (applicatie onwikkelaars en geo-specialisten), zoals voor achtergrondkaarten. Het gaat dus niet om het delen van objectgegevens / features of nauwkeurige metingen. Typisch gebruik van vector tiles is het visualiseren van grotere datasets en cartografische producten zoals topografische achtergrond kaarten. Waarbij de aanname is dat de data hiervoor voorbewerkt is en versimpeld om tot een goed uitgewerkte visualisatie te komen. En als gevolg daarvan niet per se de kwalitatief nauwkeurige coördinaten van de orginele geodata bevat.

Deze vector tiles kunnen aangeboden worden als service / via een API of als bulk download. In dit document wordt er voor vector tiles via een service geen verschil gemaakt of de vector tiles al voorberekend zijn ("pre-cooked" / "pre-processed") en al dan niet uit een cache aangeboden worden, of dynamisch worden opgebouwd (on-the-fly).

Door ons te beperken tot visualisatie het gevolg dat niet alle geschikte mogelijkheden van vector tiles hier behandeld worden. Maar het doel van deze praktijkrichtlijn is om de verschillende vector tile aanbieders hun vector tile sets zo aan te laten bieden dat deze makkelijk te gebruiken, combineren en hergebruiken zijn. Niet alleen met andere vector tile sets maar ook te combineren met de OGC standaarden, zoals WMS, WFS, met gangbare online kaartdiensten/platformen (Google Maps, Mapbox, etc) en de toekomstige OGC API standaarden. Daarom sluiten we in deze praktijktichtlijn ook zo veel mogelijk aan bij bestaande richtlijnen en standaarden.

2.2 Buiten scope

Hoewel het mogelijk is om vector tiling te gebruiken om alleen de (feature/object) data uit te wisselen (al dan niet met nauwkeurige geometrie), is dit buiten scope van deze Praktijkrichtlijn.

Buiten scope van de Praktijkrichtlijn zijn:

De Best practices bevatten ook enkele onderwerpen die buiten scope zijn van de praktijkrichtlijn, maar wel relevant voor het handig kunnen maken en aanbieden van vector tiles. Dit zijn zaken als:

Voor eigen applicaties en specifieke toepassingen staat het uiteraard vrij om op een andere manier vector tiles aan te bieden dan deze praktijkrichtlijn beschrijft.

3. Basis specificaties

Dit hoofdstuk beschrijft de specificaties waar deze praktijkrichtlijn op gebaseerd is.

3.1 Vector tiles maken

Bij het maken van vector tiles gaan deze richtlijn uit van het gebruik van de technische specificatie zoals beschreven door de [Mapbox-Vector-Tile-Specification]. Deze specificatie bevat de belangrijkste standaarden en instellingen over hoe geografische data opgeslagen en gecodeerd wordt in een vector tile. Deze bevat informatie over bestandsformaten, extensies, projecties, bounds, en de interne structuur van een vector tile.

3.2 Eis: Mapbox Vector Tile specification versie 2.1

EIS Gebruik [Mapbox-Vector-Tile-Specification] versie 2.1 (January 19th, 2016) om vector tiles op te bouwen

In het kort gaat deze specificatie uit van:

In deze praktijkrichtlijn wijken wij af van de beschreven bestand extensie .mvt zoals genoemd in 2.1 File extension van de Mapbox specificatie. Ook wijken wij af van de paragraaf 2.2 Multipurpose Internet Mail Extensions (MIME).

3.2.1 Eis: Vrije Bestands Extensie

EIS De bestands extensie voor de vector tiles is vrij in te vullen, alsmede het MIME type.

Deze praktijkrichtlijn wijkt hiermee af van Hoofdstuk 2. File Format definities van de Mapbox Vector tile specification.

3.2.2 Eis: Encoding PBF

EIS Gebruik voor de encoding van de data [PBF] (Google Protobuf)

3.2.3 Eis: Winding order conform OGC

[Mapbox-Vector-Tile-Specification] vereist de OGC Winding order. Zie de de Mapbox documentatie over Winding order voor een toelichting. Omdat de winding order vaak mis gaat bij implementaties, bevat de Praktijkrichtlijn een expliciete eis hiervoor.

EIS Voor de volgorde van coördinaten bij polygonen, gebruik de zogenaamde winding order zoals in OGC Simple Features Access is gedefinieerd.

3.3 Vector tiles aanbieden

Voor het aanbieden en publiceren van vector tiles is nog geen open standaard gereed. De vector tiles kunnen als download aangeboden worden of als service, via een API, of als statische directory structure.

Het OGC werkt aan verscheidene nieuwe specificaties voor het publiceren en aanbieden van geografische data via APIs: voor features, maps en vector tiles. Voor vector tiles is de [OGC-API-Tiles-Core] specificatie relevant.

Er is nu alleen nog geen open standaard gereed voor publicatie van vector tiles. [OGC-API-Tiles-Core] lijkt hier wel de open standaard voor te worden. Vooruitlopend op formele goedkeuring door OGC, schrijft deze praktijkrichtlijn daarom [OGC-API-Tiles-Core] voor.

3.3.1 Eis: OGC API Tiles

EIS Als vector tiles via een API aangeboden worden, gebruik dan [OGC-API-Tiles-Core].

Hoofdstuk 5 werkt het gebruik van OGC API Tiles verder uit. Daar worden ook alternatieven aangegeven voor wanneer het nog niet mogelijk is te voldoen aan de OGC API Tiles specificatie.

4. Vector tiles schema

4.1 Coördinaat Referentie Systemen

Een vector tiles schema bestaat uit een oorsprong, grid indeling en zoomniveaus voor een bepaald Coördinaat Referentie Systeen (CRS). Voor het te gebruiken CRS en grid kan het beste aangesloten worden bij bestaande standaarden. Het OGC en W3C beschrijven in de Spatial Data on the Web Best Practices [SDW-BP] dat het CRS WGS84 vaak de voorkeur heeft. Web Mercator en andere WGS84 gebaseerde CRSen zijn veelgebruikt bij vector tiles en tools hebben hier brede ondersteuning voor.

Maar WGS84 is voor Nederland (en andere Europese landen) tot op zekere hoogte onnauwkeurig. Afhankelijk van de toepassing kan dit zeer ongewenste effecten hebben. De bijlage Coördinaat referentie systemen voor vector tiles bevat meer informatie over deze (on)nauwkeurigheid en wat de impact is voor vector tiles.

Voor de meeste toepassingen die vector tiles gebruiken binnen de scope van deze Prakrijktrichtlijn is Web Mercator voldoende nauwkeurig.

4.2 Eis: te gebruiken TileMatrixSets

Het OGC definieert in [OGC-Two-Dimensional-Tile-Matrix-Set] enkele zogenaamde TileMatrixSets, internationaal te gebruiken tiling schema's voor raster en vector tiling. Deze nemen we als basis voor de praktijkrichtlijn.

[OGC-API-Tiles-Core] beschrijft alleen een beperkte standaardset van 8 TileMatrixSets, uit [OGC-Two-Dimensional-Tile-Matrix-Set]. Omdat er nog geen OGC TileMatrixSet voor het Rijksdriehoekstelsel is, hebben wij deze opgesteld en opgenomen als bijlage voor deze praktijkrichtlijn. Zie de bijlage: NetherlandsRDNewQuad.json

Vooruitlopend op een extensie om andere TileMatrixSets te ondersteunen, kiezen we in deze Praktijkrichtlijn voor een zelfde mechanisme om de TileMatrixSet te publiceren als eentje uit de standaardset van [OGC-API-Tiles-Core].

EIS Biedt vector tiles aan in tenminste één van de volgende TileMatrixSets voor de coördinaat referentie systemen:

Let op, de resolutie in de TileMatrixSet is niet van toepassing op vector tiles.

4.3 Eis: Publicatie van gebruikte CRS

Als vector tiles via OGC API Tiles worden aangeboden, is de TileMatrixSetId onderdeel van de URL en beschrijving van de vector tiles. Daarmee is het gebruikte CRS gepubliceerd.

EIS Neem de TileMatrixSetId op in de URL en de beschrijving van de vector tiles.

4.4 Eis: platte index

Bij tiling wordt normaal gesproken bij 1 niveau verder inzoomen een vector tile opgeknipt in 4 nieuwe vector tiles (een zogenaamde platte index / flat index). Het kan nuttig zijn om vanwege datadichtheid dit niet te doen, maar slimmer om te gaan met bijna lege vector tiles (niet meer opknippen). Ook het overslaan van zoomniveaus wordt wel eens toegepast. Beide methodes vragen om een slimmere index, waarmee duidelijk is bij welke stappen wel of juist geen nieuwe tile opgevraagd moet worden. Een dergelijke slimme index is voor clients lastiger om te gebruiken. De Prakrijktrichtlijn schrijft daarom alleen een platte index voor.

EIS Gebruik een platte / "flat" index als indeling voor vector tiles.

5. Vector tiles aanbieden

5.1 Eis: gebruik OGC API Tiles

Er is nu nog geen open standaard gereed voor publicatie. [OGC-API-Tiles-Core] lijkt dat wel te worden. Vooruitlopend op formele goedkeuring door OGC, schrijft deze praktijkrichtlijn deze API specificatie daarom voor.

EIS Als vector tiles via een API aangeboden worden, gebruik dan [OGC-API-Tiles-Core].

5.2 Eis: Content-Type

EIS Als vector tiles via een API aangeboden worden, gebruik dan de HTTP Header Content-Type om het gebruikte media type van de vector tiles weer te geven.

5.3 Aanbeveling: gebruik HTTP Header Content-Encoding bij gzip compressie op de webserver

AANBEVELING Als GZIP compressie gebruikt wordt op de webserver, geef dan de HTTP Header Content-Encoding: gzip mee.

5.4 Downloaden van vector tiles

Voor sommige doelen, zoals gebruik in offline systemen of voor het kopiëren van vector tiles voor installatie van een eigen vector tileserver, is het handig om meerdere vector tiles of een hele set van vector tiles in één bestand te kunnen downloaden. Er zijn meerdere manieren in gebruik, zoals in filebased databases als MBTiles of GeoPackage of het comprimeren (ZIPpen) van een directorystructuur met vector tiles. Elk van deze manieren kan geschikt zijn. Er is op dit moment geen specifieke eis of aanbeveling over op te nemen.

6. Documentatie

Het is belangrijk bij het aanleveren van een vector tile set (download of service) om de juiste metadata beschrijvingen en bron beschrijvingen mee te geven. Dit heeft een aantal technische voordelen en tegelijkertijd ook voordelen voor het delen, vinden en hergebruiken van bronnen.

6.1 Eis: OGC API Tiles "TileSet" requirement class

EIS Sluit zoveel mogelijk aan bij de OGC API Tiles definitie en de "TileSet" requirement class endpoint.

Als de vector tiles via de OGC API Tiles standaard worden aangeboden dan is in de core een "TileSet" requirement class beschreven. Deze bevat de beschrijving van de aangeboden vector tiles set en de bron beschrijving van de vector tiles (ook raster). De response heeft 2 formaten: TileJSON en OGC JSON.

Deze beschrijvingen bevatten o.a. :

Requirement Class "TileSet" Defines the response of a TileSet GET request (but not the path or the link for the request). The response has two formats: tilejson and OGC json. The OGC json includes tilematrixset links, a central point (optional), a links to the URI template to individual tiles, and the geospatial data resources involved in the creation of the tiles (optional), and other metadata (including attribution; optional) Defines how to formulate a request for individual tiles and how the response will look like (success and failure)

6.2 Eis: Handmatige TileJSON

Omdat de OGC API Tiles specificatie nog niet af is en om die reden nog niet aan te sluiten is bij deze specificatie, raden wij het volgende alternatief aan:

EIS Lever op zijn minst een TileJSON document aan bij een vector tile set. Zoals gedefineerd in Annex B.1. Example TileJson Document: Draft van het OGC API Tiles document.

In de praktijk betekent dit het handmatig aanleveren van een TileJSON bestand. Ook zijn er software tools die een TileJSON of Capabilities bestand genereren. Controleer hierbij of alle van de volgende minimale aanbevelingen juist zijn opgenomen.

6.3 Minimale aanbevelingen

In deze paragraaf staan meer details voor de verschillende metadata onderdelen die men kan aanleveren bij een vector tile set.

6.3.1 Aanbeveling: Data lagen

AANBEVELING Zorg in een TileJSON bestand voor een beschrijving van welke data lagen er aanwezig zijn in de vector tile set bij het onderdeel "Vector Layers"

6.3.2 Aanbeveling: Overzooming

Eén van de vordelen van het gebruik van een TileJSON bestand voor vector tiles is zogenaamde overzooming op lagen.

De layer definition met minzoom en maxzoom level definitie zorgt ervoor dat de client kan overzoomen op de vector tiles. Dit houdt in dat, wanneer vector tiles niet beschikbaar zijn op een bepaald zoom level, een client de vector tiles op kan halen van een bovenliggend zoomniveau.

AANBEVELING minzoom en maxzoom definiëren in de data lagen beschrijving.

6.3.3 Aanbeveling: Data Attributen

AANBEVELING Geef aan welke attributen (fields) er beschikbaar zijn per data laag. Een TileJSON bestand bevat verder geen beschrijving van de attributen die beschikbaar zijn per data laag. Wij bevelen aan deze beschrijving los te documenteren of op te nemen als additionalProperties of description in de data laag beschrijving.

6.3.4 Aanbeveling: Bron annotatie

Een TileJSON bestand kan de bronhouder bevatten, wat soms gewenst of vereist is om op te nemen in een applicatie. Zoals mogelijke copyright annotatie.

AANBEVELING Geef de bron attribution op in een TileJSON bestand, zodat deze zichtbaar is als annotatie op de kaart in de client.

6.4 API design rules Nederlandse Overheid

Verder raden wij aan ook te kijken naar de [API-Designrules] voor de Nederlandse overheid. Deze bevatten principes voor het aanbieden van APIs door Nederlandse overheidsorganisaties.

AANBEVELING Volg de aanbevelingen over documentatie uit de [API-Designrules] voor de Nederlandse overheid: https://docs.geostandaarden.nl/api/API-Designrules/#documentation

7. Styling

Voor het weergeven van vector tiles is een weergavestijl specificatie nodig die beschrijft welke data te tekenen, in welke volgorde, en in welke stijl.

7.1 Aanbeveling: Styling publiceren via OGC API Styles

Het OGC ontwikkelt [OGC-API-Styles] voor het publiceren, delen en vinden van kaart stijlen en bijbehorende resources.

AANBEVELING Lever de styling aan door middel van de OGC API Styles specificatie.

7.2 Aanbeveling: Styling specificatie encoding

[OGC-API-Styles] ondersteunt verschillende styling encodings, zoals JSON, HTML, CSS, SLD encoding en ook de Mapbox styling.

In de praktijk ondersteund veel tooling de [Mapbox-Style-Specification] en zien we dat deze het meest wordt gebruikt.

AANBEVELING Specificeer de stijl conform de [Mapbox-Style-Specification]

7.3 Eis: Standaard stijl

Een vector tile set is moeilijk te gebruiken zonder styling. Door het aanleveren van minimaal 1 default stijl is de instap voor delen, hergebruik en aanpassing makkelijker. Dit zorgt ervoor dat de gebruiker / applicatie ontwikkelaar direct aan de slag kan.

EIS Lever altijd minimaal 1 standaard stijl aan bij een vector tile set.

7.4 Best practices styling

De styling hangt direct samen met de aangeleverde data in de vector tiles. Een goede inrichting van de data en de data attributen in samenhang met een goede styling opzet, is cruciaal voor de snelheid en gebruiksvriendelijkheid van de kaart en de vector tile service. Voor meer tips en tricks hierover zie het Best Practices document.

A. Coördinaat referentie systemen voor vector tiles

A.1 Coördinaat referentie systemen bij beoogd gebruik

Het OGC en W3C beschrijven in de Spatial Data on the Web Best Practices [SDW-BP] dat het CRS WGS84 vaak de voorkeur heeft. Een CRS kiezen dat bij de potentiële gebruikers breed bekend is, heeft voordelen in de adoptatie en het kunnen hergebruiken van data. Zie de paragrafen CRS background en Best practice 7:

Best Practice 7: Choose coordinate reference systems to suit your user's applications

Consider your user's intended application when choosing the coordinate reference system(s) used to publish spatial data

Veel tools ondersteunen latitude en longitude in WGS84 en bevatten vaak ook methodes om andere CRSen te ondersteunen. OGC APIs gaan in de basis uit van WGS84 als CRS. Via extensies kunnen andere CRSen ondersteund worden. De [Mapbox-Vector-Tile-Specification] gaat uit van de Web Mercator projectie (met WGS84 als datum) maar bevat verder geen verplichting voor een specifiek Coördinaat Referentie Systeem (CRS) voor vector tiles.

A.2 Onnauwkeurigheid WGS84 en bijstelling

Door tektonische verschuiving van Europa veranderen coördinaten van punten in Nederland met 2,5 cm/jaar. Het verschil tussen WGS84 en ETRS89 is daardoor opgelopen tot ruim 0,8 m in 2020. WGS84 is daarom minder geschikt voor nauwkeurige toepassingen.

WGS84 wordt periodiek bijgesteld op basis van nieuwe metingen. Voor nauwkeurige eenduidige definitie van het CRS is het daarom nodig een specifieke realisatie van WGS84 te vermelden (bijvoorbeeld WGS84-G1762, EPSG:9057). Vanwege de tektonische verschuiving van Europa is het daarnaast nodig het tijdstip (epoche) van de geldigheid van de coördinaten te vermelden. Bij coördinaten die direct in WGS84 gemeten zijn (zoals met een niet-landmeetkundige GPS-ontvanger) is het epoche het tijdstip van de meting. Bij transformatie van RD/ETRS89 naar een WGS84-realisatie wordt impliciet een referentie-epoche gebruikt of moet de gebruiker een epoche opgeven. Wanneer geen specifieke WGS84-realisatie gespecificeerd wordt, dan wordt meestal een onnauwkeurige nul-transformatie tussen ETRS89 en WGS84 gebruikt.

Strikt genomen wordt met Web Mercator bij voorkeur bedoeld: Web Mercator op basis van WGS84-G1762, wat gelijkgesteld kan worden aan ITRF2008.

A.3 Impact onnauwkeurigheid WGS84 gering voor beoogde vector tiling toepassingen

Voor het maken van vector tiles zullen geometriëen omgerekend worden naar het lokale stelsel van een vector tile, in integers (vaak in een bereik van 0-4096 bij 0-4096). Dit betekent dat de originele geometrie nauwkeurigheid verliest in een vector tile.

Voor publicatiedoeleinden bij de meeste (web)applicatie geldt dat WGS84 acceptabel is, ondanks de beschreven onnauwkeurigheid. En voor visualisatie van achtergrondkaarten betekent dat in web applicaties vaak Web Mercator. Als de vector tiles bedoeld zijn voor toepassingen die niet nauwkeuriger zijn dan 1 meter, is dit een voldoende nauwkeurig coördinaat referentie systeem.

In de Praktijkrichtlijn hanteren we voor Web mercator de gangbare EPSG code EPSG:3857 (WGS84 / Pseudo-Mercator), met als Geodetisch CRS WGS84 conform EPSG:4326.

B. Bijlage TileMatrixSet Rijksdriehoekstelsel

Deze bijlage bevat encodings van de TileMatrixSet voor het Rijksdriehoekstelsel.

B.1 JSON encoding

{
"type": "TileMatrixSetType",
"title": "Amersfoort / RD New schema for the Netherlands",
"identifier": "NetherlandsRDNewQuad",
"boundingBox": {
    "type": "BoundingBoxType",
    "crs": "http://www.opengis.net/def/crs/EPSG/0/28992",
    "lowerCorner": [
        595401.92,
        22598.08
    ],
    "upperCorner": [
        -285401.92,
        903401.92
    ]
},
"supportedCRS": "http://www.opengis.net/def/crs/EPSG/0/28992",
"wellKnownScaleSet": " urn:ogc:def:wkss:OGC:1.0:NLDEPSG28992Scale",
"tileMatrix": [
    {
        "identifier": "0",
        "type": "TileMatrixType",
        "scaleDenominator": 1.2288E7,
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 1,
        "matrixHeight": 1
    },
    {
        "type": "TileMatrixType",
        "identifier": "1",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 6144000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 2,
        "matrixHeight": 2
    },
    {
        "type": "TileMatrixType",
        "identifier": "2",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 3072000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 4,
        "matrixHeight": 4
    },
    {
        "type": "TileMatrixType",
        "identifier": "3",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 1536000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 8,
        "matrixHeight": 8
    },
    {
        "type": "TileMatrixType",
        "identifier": "4",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 768000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 16,
        "matrixHeight": 16
    },
    {
        "type": "TileMatrixType",
        "identifier": "5",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 384000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 32,
        "matrixHeight": 32
    },
    {
        "type": "TileMatrixType",
        "identifier": "6",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 192000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 64,
        "matrixHeight": 64
    },
    {
        "type": "TileMatrixType",
        "identifier": "7",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 96000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 128,
        "matrixHeight": 128
    },
    {
        "type": "TileMatrixType",
        "identifier": "8",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 48000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 256,
        "matrixHeight": 256
    },
    {
        "type": "TileMatrixType",
        "identifier": "9",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 24000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 512,
        "matrixHeight": 512
    },
    {
        "type": "TileMatrixType",
        "identifier": "10",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 12000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 1024,
        "matrixHeight": 1024
    },
    {
        "type": "TileMatrixType",
        "identifier": "11",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 6000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 2048,
        "matrixHeight": 2048
    },
    {
        "type": "TileMatrixType",
        "identifier": "12",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 3000.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 4096,
        "matrixHeight": 4096
    },
    {
        "type": "TileMatrixType",
        "identifier": "13",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 1500.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 8192,
        "matrixHeight": 8192
    },
    {
        "type": "TileMatrixType",
        "identifier": "14",
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "scaleDenominator": 750.0,
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 16384,
        "matrixHeight": 16384
    },
    {
        "identifier": "15",
        "type": "TileMatrixType",
        "scaleDenominator": 375.0,
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 32768,
        "matrixHeight": 32768
    },
    {
        "identifier": "16",
        "type": "TileMatrixType",
        "scaleDenominator": 187.5,
        "topLeftCorner": [
            -285401.92,
            903402.0
        ],
        "tileWidth": 256,
        "tileHeight": 256,
        "matrixWidth": 65536,
        "matrixHeight": 65536
    }
]
}

B.2 XML Encoding

<tilematrixset id="NetherlandsRDNewQuad" xsi:schemalocation="geonovum/tilematrixset/def">
<ows:title>Amersfoort / RD New schema for the Netherlands</ows:title>
<ows:identifier>NetherlandsRDNewQuad</ows:identifier>
<ows:boundingbox crs="http://www.opengis.net/def/crs/EPSG/0/28992">
<ows:lowercorner>595401.92 22598.08
</ows:lowercorner>
<ows:uppercorner>-285401.92 903401.92
</ows:uppercorner>
</ows:boundingbox>
<ows:supportedcrs>http://www.opengis.net/def/crs/EPSG/0/28992</ows:supportedcrs>
<ows:identifier>EPSG:28992</ows:identifier>
<ows:supportedcrs>urn:ogc:def:crs:EPSG::28992</ows:supportedcrs>
<tilematrix>
<ows:identifier>00</ows:identifier>
<scaledenominator>1.2288E7</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>1</matrixwidth>
<matrixheight>1</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>01</ows:identifier>
<scaledenominator>6144000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>2</matrixwidth>
<matrixheight>2</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>02</ows:identifier>
<scaledenominator>3072000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>4</matrixwidth>
<matrixheight>4</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>03</ows:identifier>
<scaledenominator>1536000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>8</matrixwidth>
<matrixheight>8</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>04</ows:identifier>
<scaledenominator>768000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>16</matrixwidth>
<matrixheight>16</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>05</ows:identifier>
<scaledenominator>384000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>32</matrixwidth>
<matrixheight>32</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>06</ows:identifier>
<scaledenominator>192000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>64</matrixwidth>
<matrixheight>64</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>07</ows:identifier>
<scaledenominator>96000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>128</matrixwidth>
<matrixheight>128</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>08</ows:identifier>
<scaledenominator>48000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>256</matrixwidth>
<matrixheight>256</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>09</ows:identifier>
<scaledenominator>24000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>512</matrixwidth>
<matrixheight>512</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>10</ows:identifier>
<scaledenominator>12000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>1024</matrixwidth>
<matrixheight>1024</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>11</ows:identifier>
<scaledenominator>6000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>2048</matrixwidth>
<matrixheight>2048</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>12</ows:identifier>
<scaledenominator>3000.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>4096</matrixwidth>
<matrixheight>4096</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>13</ows:identifier>
<scaledenominator>1500.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>8192</matrixwidth>
<matrixheight>8192</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>14</ows:identifier>
<scaledenominator>750.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>16384</matrixwidth>
<matrixheight>16384</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>15</ows:identifier>
<scaledenominator>375.0</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>32768</matrixwidth>
<matrixheight>32768</matrixheight>
</tilematrix>
<tilematrix>
<ows:identifier>16</ows:identifier>
<scaledenominator>187.5</scaledenominator>
<topleftcorner>-285401.92 903402.0</topleftcorner>
<tilewidth>256</tilewidth>
<tileheight>256</tileheight>
<matrixwidth>65536</matrixwidth>
<matrixheight>65536</matrixheight>
</tilematrix>
</tilematrixset>

C. Lijst van afbeeldingen

D. Referenties

D.1 Normatieve referenties

[API-Designrules]
API Designrules (Nederlandse API Strategie IIa). W3C en OGC. Geonovum Standaard. URL: https://docs.geostandaarden.nl/api/API-Designrules/
[Mapbox-Style-Specification]
Mapbox Style Specification. Mapbox. v13.18.0. URL: https://docs.mapbox.com/mapbox-gl-js/style-spec/
[Mapbox-Vector-Tile-Specification]
Mapbox Vector Tile Specification. Mapbox. V2.1. URL: https://github.com/mapbox/vector-tile-spec/tree/master/2.1
[OGC-API-Styles]
OGC API Styles. OGC. URL: https://www.ogc.org/projects/groups/stylesapiswg
[OGC-API-Tiles-Core]
OGC API - Tiles - Part 1: Core. OGC. DRAFT. URL: https://ogcapi.ogc.org/tiles/
[OGC-Two-Dimensional-Tile-Matrix-Set]
OGC Two Dimensional Tile Matrix Set. OGC. 1.0. URL: https://docs.opengeospatial.org/is/17-083r2/17-083r2.html
[PBF]
Google Proto Buffers. Google. URL: https://developers.google.com/protocol-buffers/

D.2 Informatieve referenties

[SDW-BP]
Spatial Data on the Web Best Practices. W3C en OGC. Best practice. URL: https://www.w3.org/TR/sdw-bp/