TopoTijdReis kaartlagen in QGIS

Aanpassing 3 september 2020: de WMTS service werkt nu alleen nog onder httpS. Let dus op de code is aangepast (de service heeft een dag of wat de verkeerde url’s (http) in de capabilities gehad, maar per 3sept OK)

Aanpassing 19 juni 2020: voor de hele ongeduldige mensen (of bij wie het stukje code niet lukt): hier een gezipt QGIS topotijdreisqgisproject. Even uitpakken en het .qgz bestand openen als project.

Aanpassing 15 april 2018: code geupdate, werkt nu in zowel QGIS2 als QGIS3

Al weer even geleden presenteerde Het Kadaster samen met ESRI the website TopoTijdReis. Een website met prachtig kaartmateriaal: verdeelt over 75 kaartlagen de scans van topografische data van Het Kadaster van 1815 tot en met 2015!
topotijdreis
Een website is mooi, maar dezelfde data kunnen gebruiken in bijvoorbeeld QGIS is nog leuker. Toen iemand mij benaderde of dat mogelijk was, heb ik geprobeerd om de lagen toe te voegen als ‘ArcGIS Mapserver layer’, wat mogelijk zou moeten zijn met QGIS 2.16 en hoger. Maar… ik kreeg het niet voor elkaar (en ernaar ‘googelende’ blijkbaar meer mensen niet)…
Maar… na wat gemopper van mij op Twitter dat ‘ze’ toch eens wat meer dit soort zaken m.b.v. OpenStandaarden zouden moeten ontsluiten, kreeg ik van het Kadaster het vriendelijke antwoord, dat de kaartlagen ook als WMTS beschikbaar zouden moeten zijn. Dat wil ik wel zien.
Eerst maar eens proberen op de WMTS link te klikken in een pagina als
http://tiles.arcgis.com/tiles/nSZVuSZjHpEZZbRo/arcgis/rest/services/Historische_tijdreis_1950/MapServer…
Mmm, geen tiles. Gelukkig werkt het getCapabilities document wel:
En op basis daarvan is het in QGIS eenvoudig om de service te bevragen. Voer de capabilities url (of de verkorte versie zonder het /1.0.0/WMTSCapabilities.xml deel) in in het ‘WMS/WMTS kaartlaag toevoegen’ dialoog
addwmts
en de dialoog toont welke kaartlaag er op te halen is.
wmtslayer
Prachtig! Werkt!
haarlem1950
Maar het mooie aan de TopoTijdReis is natuurlijk dat je je de historie van een omgeving kunt bekijken door even door te tijd te reizen… We willen natuurlijk al die 75 kaartlagen ‘even’ laden in QGIS. Jammer dat elke laag in een aparte service is gedefineerd 🙁
Ik zie twee mogelijkheden:
1) we zorgen dat die 75 lagen komen te staan in het pdok.json lagenbestand van de PDOKServicePlugin, maar dan nog moet je 75 keer klikken om alle lagen te bekijken (deze optie stel ik dus even uit tot iemand hier heel vriendelijk om vraagt…)
2) we schrijven wat Python code welke we in de Python Console kunnen uitvoeren om die 75 lagen te laden.
DOEN:
– open de Python Console die je vind als menu item in het Plugins menu
– open een bestandje door op het ‘nieuw bestand’ knopje te klikken (4e knopje van links)
– kopieer daarin de volgende regels:

OPMERKING: onderstaande code zou zowel in recente QGIS 2.x als QGIS 3.x versies moeten werken:

# create a layer group
layer_group = QgsProject.instance().layerTreeRoot().insertGroup(0, 'TopoTijdReis')
# make the group mutually exlusive (one layer visible at a time)
layer_group.setIsMutuallyExclusive(True)
# copied from https://tiles.arcgis.com/tiles/nSZVuSZjHpEZZbRo/arcgis/rest/services/
years = ['1815', '1820', '1821', '1823_1829', '1830_1849', '1850', '1857', '1858', '1861', '1862', '1865', '1866', '1868', '1870', '1871', '1872', '1880', '1883', '1886', '1888', '1889', '1893', '1899', '1900', '1901', '1902', '1904', '1908', '1909', '1910', '1912', '1915', '1918', '1919', '1920', '1922', '1925', '1929', '1931', '1935', '1937', '1940', '1942', '1943', '1947', '1948', '1949', '1950', '1951', '1952', '1953', '1955', '1962', '1963', '1965', '1970', '1971', '1973', '1975', '1976', '1978', '1980', '1984', '1988', '1990', '1994', '1995', '1996', '1997', '1999', '2006', '2010', '2011', '2014', '2015']
# for every year, create a layer
for year in years:
  layer = QgsRasterLayer("tileMatrixSet=default028mm&crs=EPSG:28992&layers=Historische_tijdreis_{0}&styles=default&format=image/jpgpng&url=https://tiles.arcgis.com/tiles/nSZVuSZjHpEZZbRo/arcgis/rest/services/Historische_tijdreis_{1}/MapServer/WMTS/".format(year, year), "TopoTijdReis {0}".format(year), "wms")
  # add it to the layer registry, without showing it yet
  # False, meaning not ready to add to legend
  if hasattr(qgis.core, 'QgsMapLayerRegistry'):
    # QGIS 2.x
    QgsMapLayerRegistry.instance().addMapLayer(layer, False)
  else:
    # QGIS 3.x
    QgsProject.instance().addMapLayer(layer, False)
  # add it on top of the group
  layer_group.insertLayer(0, layer)

Door nu op het blauwe ‘Play’-knopje te klikken wordt bovenstaande code uitgevoerd, en moet QGIS er ongeveer zo uit zien:
qgistopotijdreis
Zoals je ziet staan de 75 beschikbare kaartlagen (die ik trouwens van de ‘services’ url heb http://tiles.arcgis.com/tiles/nSZVuSZjHpEZZbRo/arcgis/rest/services/ gehaald) netjes in een aparte groep.
En het mooi van een layer-group is dat je ‘m ‘mutual exlusive’ kunt maken, d.w.z. er is slechts 1 kaartlaag tegelijk zichtbaar: bij het zichtbaar maken van een andere kaartlaag wordt een evt andere zichtbaar kaartlaag uit die groep verborgen.
Eigenlijk hebben we zo onze eigen TopoTijdReis in QGIS.
En mocht je nu via de python console gewoon maar 1 kaartlaag willen laden, gebruik dan:
iface.addRasterLayer(
"tileMatrixSet=default028mm&crs=EPSG:28992&layers=Historische_tijdreis_1820&styles=default&format=image/jpgpng&url=https://tiles.arcgis.com/tiles/nSZVuSZjHpEZZbRo/arcgis/rest/services/Historische_tijdreis_1820/MapServer/WMTS/", # uri
"TopoTijdReis 1820", # name for layer (as seen in QGIS)
"wms"
)

Een paar leuke screenshots nog ter afsluiting:
Zoals je ziet is de kaarttekst van 1815 nog franstalig. Wanneer namen we ook al weer afscheid van de Fransen? De daaropvolgende kaart is dan ook opgedragen “aan zijne majesteit den koning”
kaartkoppen
Verder is het goed te zien dat er hier en daar wel flink ‘geplakt’ is.
Letterlijk (ik denk door het oude Kadaster):
plakwerk
Figuurlijk (door de cache bouwer):
mapmix
Een paar tips:
– Gebruik het ‘Tile Scale Panel/Paneel Schaal tegel’ om de juiste kaartschaal te bepalen: maak een kaartlaag aktief/zichtbaar en gebruik dan de schuif om ‘m op de juiste schaal te krijgen. (zie de grijze ‘schuif’ aan de rechterkant in een van de volgende screenshots)
– Zorg dat je in Extra/Opties/Rendering het vinkje ‘Gelijktijdig rendereren van kaartlagen …’ aan hebt. Voor Tiled layers scheelt dit aanzienlijk en ziet er VEEL beter uit!
– Gebruik de middelmuisknop om netjes met een factor 2 in of uit te zoomen (gebruik diezelfde middelmuisknop trouwens ook eens om eenvoudig te ‘pannen’ zonder de pan-tool aktief te hoeven maken
En om toch nog wat te mopperen te hebben:
– waarom heeft het kadaster/esri zich eigenlijk niet gehouden aan de Nederlands Tiling richtlijn? De kaartschalen komen niet overeen met die van de overige PDOK kaartlagen?
– waarom zijn juist de modernste kaartlagen niet scherp?
Maar verder: bedankt Kadaster en ESRI voor het beschikbaarstellen van dit prachtige kaartmateriaal!!

One thought on “TopoTijdReis kaartlagen in QGIS

  1. Dank voor deze scripts ! heel handig.
    de franse kaart is de kaart met postroutes uit 1815, het jaar waarin de oranjes de staatsgreep pleegden waarbij Willem van Oranje Koning Willem 1 werd.
    Jammer dat het kadaster hier niet de Kraijenhoffkaart gebruikt, uit dezelfde tijd, maar met het eerste driehoekstelsel erop, dat zou uitgroeien tot het huidige RD-stelsel. Inderdaad wordt deze kaart direct na de inrichting van het Koninkrijk in het Nederlands vertaald. Er was ook nog een voorganger, “kaart van Holland als onderdeel van het Fransche Rijk”.
    de topkaart met de bruine randjes erin is gescand van een op bruin linnen geplakte topografische kaart. Die kun je handig vouwen op die randjes, zodat de kaart zelf niet beschadigt. Destijds een standaard-uitgave voor mensen in het veld.

  2. Hartelijk dank, Richard!
    Het opladen is goed verlopen en de kaarten zien er goed uit. Een mooi stukje historische kartografie binnen handbereik.

  3. Heldere uitleg en werkt fantastisch!
    Exact het geen wat ik zocht voor mijn werk en al aan het uitproberen was om via WMS in te laden.
    You’ve made my day!

  4. Richard, mooie uitleg!
    Ik heb een vraag: is het mogelijk om nadat je alle kaartlagen hebt geladen hier ook ‘automatisch’, als een filmpje, doorheen te gaan? Dus dat je met een klik op een knop de lagen afloopt waarbij je elke laag x seconden laat zien en je de ontwikkeling van de kaarten ziet?

    1. Niet met standaard functionaliteit van QGIS denk ik?
      Maar natuurlijk wel met een paar regels python code, die zoiets doet als:
      – verberg alle histo lagen
      – toon laag 1
      – wacht een seconde
      – verberg laag en en dan weer naar toon laag x etc etc
      Dat zou je evt weer onder een knopje kunnen brengen
      Lukt dat?

      1. Richard,
        mooi om te horen dat het zou kunnen. Ik ben zelf nog niet thuis in Python-code, dus dit zal betekenen dat ik me daar in moet gaan verdiepen…:). Dank voor je reactie!

      2. Ik krijg de volgende foutmelding.
        hoe kan ik dit verhelpen?
        Jeroen
        execfile(u’C:/Users/andrea/Desktop/Geen naam-0.py’.encode(‘mbcs’))
        Traceback (most recent call last):
        File “”, line 1, in
        File “C:/Users/andrea/Desktop/Geen naam-0.py”, line 4, in
        layer_group.setIsMutuallyExclusive(True)
        AttributeError: ‘QgsLayerTreeGroup’ object has no attribute ‘setIsMutuallyExclusive’

          1. Vreemd want die methode is er al sinds 2.4..
            Ik kan dit hier in zowel 2.14 als 2.18 draaien.
            Gebruiken jullie hier wel IN QGIS de PythonConsole voor?

  5. Hartelijk dank voor deze uitleg, het werkt heel mooi.
    Nog een vraagje:
    Zijn er voor Duitsland ook soortgelijke service beschikbaar?

  6. Je kunt ook alles in 1 keer binnen halen met onderstaande code.
    Alsje de beide jaartallen verandert kun je kiezen welk tijdvak.
    # create a layer group
    layer_group = QgsProject.instance().layerTreeRoot().insertGroup(0, ‘TopoTijdReis’)
    # make the group mutually exlusive (one layer visible at a time)
    layer_group.setIsMutuallyExclusive(True)
    year = 1819
    while year < 2017:
    layer = QgsRasterLayer("tileMatrixSet=default028mm&crs=EPSG:28992&layers=Historische_tijdreis_{0}&styles=default&format=image/jpgpng&url=http://tiles.arcgis.com/tiles/nSZVuSZjHpEZZbRo/arcgis/rest/services/Historische_tijdreis_{1}/MapServer/WMTS/".format(year, year), "TopoTijdReis {0}".format(year), "wms")
    QgsMapLayerRegistry.instance().addMapLayer(layer, False) # False, meaning not ready to add to legend
    layer_group.insertLayer(0, layer)
    year = year + 1
    next

    1. Hoi Nico, is inderdaad korter. Ik wist alleen niet of alle lagen er waren, vandaar dat ik dat gechecked heb…
      Maar, kijkende naar de lijst, missen er toch juist heel veel jaartallen? Dus dan heb je allemaal lege jaar-lagen?

  7. Dank voor de uitleg!
    Bij mij geeft de WMTS server: forbidden aan. Terwijl het eerder wel werkte. Doet de WMTS het bij jou nog wel?

  8. Hallo Richard, bedankt voor het bruikbare verhaal. Het werkte meteen onder QGIS, maar ik krijg het onder OpenLayers niet aan de praat. Het zit hem in de afwijkende resoluties. PDOK-WMTS-kaarten definieer ik als volgt:
    var projectionExtent = [-285401.92, 22598.08, 595401.9199999999, 903401.9199999999];
    var resolutions = [3440.640, 1720.320, 860.160, 430.080, 215.040, 107.520, 53.760, 26.880, 13.440, 6.720, 3.360, 1.680, 0.840, 0.420, 0.210,0.105];
    var matrixIds = new Array(15);
    for (var z = 0; z < 15; ++z) {
    matrixIds[z] = 'EPSG:28992:' + z;
    }
    kadaster = new ol.layer.Tile({ // {{{2
    visible:false,
    source:new ol.source.WMTS({
    attributions: 'Kaartgegevens: © Kadaster‘,
    url: ‘https://geodata.nationaalgeoregister.nl/tiles/service/wmts?’,
    layer: “kadastralekaartv3”,
    matrixSet: ‘EPSG:28992’,
    format: ‘image/png’,
    projection: projection,
    tileGrid: new ol.tilegrid.WMTS({
    origin: ol.extent.getTopLeft(projectionExtent),
    resolutions: resolutions,
    matrixIds: matrixIds
    }),
    style: ‘default’,
    wrapX: false
    })
    })
    Als ik dit voor Topotijdreis doe, worden de tiles correct opgevraagd, maar geven allemaal de foutmelding “incorrect Tile Matrix Set defined”
    Enig idee hoe ik dit kan aanpassen?

  9. Nee, het is echt een EPSG:28992 schema. De kaarten zijn duidelijk RD, en de coordinaten in de capabilities zijn dat ook.
    In die capabilities staat een tileMatrixSet met de naam “default028mm”, maar die geeft dezelfde foutmelding als ik hem in OL gebruik. En zonder een tile matrix definitie werkt het ook niet.
    Jammer, want in QGIS werkt het prachtig, en in Leaflet ook:
    http://compuron.nl/leaflet/ (onderin)
    Daar gebruiken ze een speciale definitie voor ArcGIS-layer. Maar als ik iets dergelijks in OL gebruik (ol.source.TileArcGISRest) krijg ik altijd de capabilities voor iedere tile terug, niet een plaatje. Ongeacht wat ik daar aan parameters meegeef. Als je weet waar ik verder moet zoeken houd ik me aanbevolen

  10. Als ik de macro in Qgis 3.12.3 laat lopen, dan krijg ik de foutmelding
    “Processing: Traceback (most recent call last): File “C:/OSGEO4~1/apps/qgis/./python/plugins\processing\script\ScriptEditorDialog.py”, line 230, in runAlgorithm exec(self.editor.text(), d) File “”, line 2, in NameError: name ‘QgsProject’ is not defined”
    Heb je een tip hoe dit op te lossen is?

  11. Rene: Vreemd ik probeer dat net zelf onder windows, maar t werkt bij mij… De foutmelding lijkt te zeggen dat je niet de default imports hebt… beetje raar.
    Je zou er boven kunnen zetten:
    from qgis.core import *
    maar dat zou er gewoon moeten zijn. Een ander ideetje: heb je wel een project geladen? Zou het kunnen dat QGIS nog niks heeft? Kun je eens een willekeurig nl projectje draaien?

    1. Dag Richard,
      Dank voor je snelle reactie.
      Ik heb inderdaad gewoon een NL-project geladen en ik sta op een NL-positie in het RD stelsel met als basiskaart de opentopo kaart.
      Als ik jouw aanvulling “from qgis.core import *” als eerste regel bij de macro plaats, dan komt hij wel één stap verder: de macro maakt nu de groep ‘TopoTijdReis’ in lagen aan.
      Direct na het aanmaken van die groep volgt nu deze foutmelding:
      Processing: Traceback (most recent call last): File “C:/PROGRA~1/QGIS3~1.12/apps/qgis/./python/plugins\processing\script\ScriptEditorDialog.py”, line 224, in runAlgorithm exec(self.editor.text(), _locals) File “”, line 15, in NameError: name ‘qgis’ is not defined
      PS: Ik draai Qgis 3.12.3 met als menu-taal Engels. Maakt dat nog iets uit?

      1. Nee, sorry, zoals gezegd, je zou die modules allemaal al geladen moeten hebben. Misschien moet je eens met een ‘schoon’ QGIS profile beginnen. Kijken of het dan wel werkt.
        En anders lijkt er toch iets met het python deel van je installatie te zijn…
        Ik zal anders even kijken of ik aan dit artikeltje ook een QGIS-projectje kan hangen waarin gewoon alle lagen al zijn geladen.

  12. Heel erg bedankt! De Python code werkt als een zonnetje en scheelt voor mij heel erg veel opzoekwerk.

  13. vanaf vandaag werkt de verbinding met de server niet meer. heb geprobeerd met https ipv http omdat dit per 1-9-2020 zou gaan veranderen. Maar ook dat lukt niet.
    Hebben jullie suggesties?

  14. Ligt het aan mij, of is deze service niet meer beschikbaar? Sinds deze week krijg ik het niet meer in QGIS geladen.

  15. Ik maak al een tijdje gebruik van deze functie, maar sinds 1 september 2020 worden de kaarten niet meer geladen

  16. Sinds gisteren werkt bij mij de TopoTijdReis niet meer in QGis.
    Hebben ze de lagen nu achter een login gegooid of beperkt tot één domein? Iemand die hierover iets meer weet, of ben ik de enige met dit probleem?

    1. Ondertussen werkt het weer. Als je nog het ‘oude’ script gebruikt hebt dan niet, maar als je dit script opnieuw draait, werkt het als een zonnetje. Het zal inderdaad de overgang naar https zijn geweest zoals @Rombert al zei.

  17. Het is nu 3 september 2020 en ik merk dat de topotijdreis lagen in QGIS niet meer ingeladen worden, is er iets dat ik mis? Het werkte tot 1 september altijd prima.

  18. de layers werken sinds 1-9-2020 niet meer. het geprobeerd met https ipv http. ivm de wijzigingen bij de server. maar ook dat werkt niet. heeft iemand een oplossing?

  19. Sinds 1 september werkt dit niet meer, de lagen worden niet gekoppeld en als ik in een verse QGIS start (3.12 Bucuresti) dan krijg ik ook de foutmelding en crasht QGIS. Enig idee wat ik kan doen?

  20. Per 1 september is de WMTS service alleen nog per httpS te krijgen. Wanneer je dus http in de service url hebt, moet je die service url aanpassen (zie bovenstaande stuk code, die is nu aangepast). Enige tijd hielp dat nog niet omdat de GetCapabilities-response dan toch nog http-url’s bevatte, die dan weer mis gingen.
    Nu werkt dus alles weer als het goed is!

  21. Let op: http werkt niet meer, maar als je http verandert in https werkt het weer.

  22. Sinds enkele dagen laden de TopoTijdReis lagen niet meer in QGIS, maar door http in https te veranderen doet het script het weer

Leave a Reply to Meike Valk Cancel reply

Your email address will not be published. Required fields are marked *