Join the Conversation

53 Comments

  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. 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’

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

  5. 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

  6. 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?

  7. 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

  8. 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?

  9. 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.

  10. 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?

    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.

      1. Ik heb het script gedraaid, maar ik krijg allerlei syntax errors, en het werkt niet.

        Kan iemand helpen?

        # create a layer group
        layer_group = QgsProject.instance().layerTreeRoot().insertGroup(0, ‘TopoTijdReis’)
        Traceback (most recent call last):
        File “C:\OSGEO4~1\apps\Python37\lib\code.py”, line 63, in runsource
        code = self.compile(source, filename, symbol)
        File “C:\OSGEO4~1\apps\Python37\lib\codeop.py”, line 168, in __call__
        return _maybe_compile(self.compiler, source, filename, symbol)
        File “C:\OSGEO4~1\apps\Python37\lib\codeop.py”, line 99, in _maybe_compile
        raise err1
        File “C:\OSGEO4~1\apps\Python37\lib\codeop.py”, line 87, in _maybe_compile
        code1 = compiler(source + “\n”, filename, symbol)
        File “C:\OSGEO4~1\apps\Python37\lib\codeop.py”, line 133, in __call__
        codeob = compile(source, filename, symbol, self.flags, 1)
        File “”, line 14
        layer_group = QgsProject.instance().layerTreeRoot().insertGroup(0, ‘TopoTijdReis’)
        ^
        SyntaxError: invalid syntax
        # make the group mutually exlusive (one layer visible at a time)
        layer_group.setIsMutuallyExclusive(True)
        Traceback (most recent call last):
        File “C:\OSGEO4~1\apps\Python37\lib\code.py”, line 90, in runcode
        exec(code, self.locals)
        File “”, line 1, in
        RuntimeError: wrapped C/C++ object of type QgsLayerTreeGroup has been deleted
        # 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)

  11. 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.

  12. 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?

  13. 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?

  14. 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!

  15. Heel veel dank voor al deze moeite die jullie hierin hebben gestoken. Heb altijd heel veel gebruik gemaakt van de topotijdreis functie in QGIS en gebruik het ontzettend veel in mijn werk, maar ook bestaande projecten doen steeds moeilijker bij het laden inderdaad sinds enkele weken. Ik heb het nieuw .qgz project gedownload, alleen geeft deze nog steeds dezelfde foutmeldingen bij het laden als mijn al bestaande projecten. Ik krijg tijdens het laden een pop-up waarop wordt vermeldt ‘foute lagen afhandelen’ waarbij bijna alle lagen aangegeven staan die ik wil laden (behalve die van 1909 en 1920) waardoor hij al de genoemde lagen uiteindelijk niet laadt en zegt dat ze verloren gaan als ik doorga. Heb geen idee waar dit nu precies fout gaat en heb ook geen idee waar ik mogelijk de http zou moeten veranderen in https. Kan iemand een leek als mij nog op gang helpen??

    1. Hoi Udo, ik heb wel de code geupdate, maar nog niet de qgz (de project file). Ik zal dat morgen doen.
      Het probleem zat ‘m erin dat esri van http naar httpS url’s ging…
      Probeer morgen die qgz nog eens te downloaden

  16. Hi Udo, ik heb een nieuw projectfile neergezet met url’s die direkt naar httpS gaan, maar bij mij deed ook de oude het gewoon. En ook de code werkt bij mij.
    Wanneer je http url’s hebt, worden die door de webserver van topotijdreis netjes doorgestuurd naar de juiste httpS url..

    Wat betreft de url’s aanpassen in een bestaand project, dat kan eigenlijk niet volgens mij.
    Het beste is denk ik dan:
    – een tweede QGIS openenen,
    – daar de topotijdreis nieuw in laden
    – dan de lagen copy/pasten (dat is eigenlijk een hele leuke functie in QGIS 🙂 ) die je nodige hebt maar niet hoeft aan te passen
    – dat project opnieuw opslaan

    Succes

    1. Hoi Barend, inderdaad ik zie het. Ik heb de projectfile en het scriptje even aangepast. Hoewel ik het idee heb dat er niet zozeer data is toegevoegd (althans niet zichtbaar vooral bij de oudere lagen).
      Mocht iemand een laag tevoorschijn kunnen toveren met unieke data laat me ajb even weten.

  17. Rond de jaarwisseling wordt er meestal een laag met actueel kaartmateriaal toegevoegd. Zo is afgelopen maand de laag 2020 ontsloten. Begin vorig jaar zijn er trouwens ook historische luchtfoto’s vanaf 2006 toegevoegd.

  18. Hallo, eindelijk deze functie gevonden maar bij mij maakt hij wel de groep aan maar vervolgens zit er geen inhoud in de groep. ik plak de volgende code in de Python Console:
    # 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’, ‘2000’, ‘2001’, ‘2002’, ‘2003’, ‘2004’, ‘2005’, ‘2006’, ‘2007’, ‘2008’, ‘2009’, ‘2010’, ‘2011’, ‘2012’, ‘2013’, ‘2014’, ‘2015’,
    ‘2016’, ‘2017’, ‘2018’, ‘2019’]
    # 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)

    Als ik hem heb geplakt verschijnt automatisch de groep maar dus zonder inhoud.
    Wat doe ik fout?

    Gr Michiel

Leave a comment

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