diff --git a/contextily/__init__.py b/contextily/__init__.py index 7c4f9249..7d254dac 100644 --- a/contextily/__init__.py +++ b/contextily/__init__.py @@ -6,6 +6,6 @@ from ._providers import providers from .place import Place, plot_map from .tile import * -from .plotting import add_basemap, add_attribution +from .plotting import add_basemap, add_attribution, add_basemap_wmts __version__ = "1.0rc2" diff --git a/contextily/_providers.py b/contextily/_providers.py index df094f13..c3f2c629 100644 --- a/contextily/_providers.py +++ b/contextily/_providers.py @@ -1477,6 +1477,684 @@ def __call__(self, **kwargs): attribution = '![](https://docs.onemap.sg/maps/images/oneMap64-01.png) New OneMap | Map data (C) contributors, Singapore Land Authority', name = 'OneMapSG.LandLot' ) + ), + PDOK = Bunch( + brtachtergrondkaart_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'brtachtergrondkaart', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaart_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaart_EPSG_3857 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 19, + bounds = [[-184488.8572700502, 6113595.549897805], [1256825.7575465257, 7541243.309005486]], + variant = 'brtachtergrondkaart', + style = 'default', + tilematrixset = 'EPSG:3857', + crs = 'EPSG:3857', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaart_EPSG_3857', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaart_EPSG_25831_RWS = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 11, + bounds = [[209006.82664865535, 5354143.456760174], [1117699.0477674687, 6206271.809019262]], + variant = 'brtachtergrondkaart', + style = 'default', + tilematrixset = 'EPSG:25831:RWS', + crs = 'EPSG:25831', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaart_EPSG_25831_RWS', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartgrijs_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'brtachtergrondkaartgrijs', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartgrijs_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartgrijs_EPSG_3857 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 19, + bounds = [[-184488.8572700502, 6113595.549897805], [1256825.7575465257, 7541243.309005486]], + variant = 'brtachtergrondkaartgrijs', + style = 'default', + tilematrixset = 'EPSG:3857', + crs = 'EPSG:3857', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartgrijs_EPSG_3857', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartgrijs_EPSG_25831_RWS = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 11, + bounds = [[209006.82664865535, 5354143.456760174], [1117699.0477674687, 6206271.809019262]], + variant = 'brtachtergrondkaartgrijs', + style = 'default', + tilematrixset = 'EPSG:25831:RWS', + crs = 'EPSG:25831', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartgrijs_EPSG_25831_RWS', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartpastel_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'brtachtergrondkaartpastel', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartpastel_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartpastel_EPSG_3857 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 19, + bounds = [[-184488.8572700502, 6113595.549897805], [1256825.7575465257, 7541243.309005486]], + variant = 'brtachtergrondkaartpastel', + style = 'default', + tilematrixset = 'EPSG:3857', + crs = 'EPSG:3857', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartpastel_EPSG_3857', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartpastel_EPSG_25831_RWS = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 11, + bounds = [[209006.82664865535, 5354143.456760174], [1117699.0477674687, 6206271.809019262]], + variant = 'brtachtergrondkaartpastel', + style = 'default', + tilematrixset = 'EPSG:25831:RWS', + crs = 'EPSG:25831', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartpastel_EPSG_25831_RWS', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartwater_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'brtachtergrondkaartwater', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartwater_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartwater_EPSG_3857 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 19, + bounds = [[-184488.8572700502, 6113595.549897805], [1256825.7575465257, 7541243.309005486]], + variant = 'brtachtergrondkaartwater', + style = 'default', + tilematrixset = 'EPSG:3857', + crs = 'EPSG:3857', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartwater_EPSG_3857', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brtachtergrondkaartwater_EPSG_25831_RWS = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 11, + bounds = [[209006.82664865535, 5354143.456760174], [1117699.0477674687, 6206271.809019262]], + variant = 'brtachtergrondkaartwater', + style = 'default', + tilematrixset = 'EPSG:25831:RWS', + crs = 'EPSG:25831', + format = 'image/png8', + name = 'nlmaps.brtachtergrondkaartwater_EPSG_25831_RWS', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bodemkaart50000_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-283214.7350810917, 29993.466279334272], [680410.1621092468, 925272.8137449462]], + variant = 'bodemkaart50000', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.bodemkaart50000_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + geomorfologischekaart50000_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-283214.7350810917, 29993.466279334272], [680410.1621092468, 925272.8137449462]], + variant = 'geomorfologischekaart50000', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.geomorfologischekaart50000_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + top10nlv2_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'top10nlv2', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.top10nlv2_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + kadastralekaartv3_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'kadastralekaartv3', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.kadastralekaartv3_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + natura2000_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'natura2000', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.natura2000_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + nok2011_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'nok2011', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.nok2011_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + aan_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'aan', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.aan_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bag_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'bag', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.bag_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + top25raster_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-283214.7350810917, 29993.466279334272], [680410.1621092468, 925272.8137449462]], + variant = 'top25raster', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.top25raster_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + top50raster_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-283214.7350810917, 29993.466279334272], [680410.1621092468, 925272.8137449462]], + variant = 'top50raster', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.top50raster_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + top100raster_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-283214.7350810917, 29993.466279334272], [680410.1621092468, 925272.8137449462]], + variant = 'top100raster', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.top100raster_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + top250raster_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-283214.7350810917, 29993.466279334272], [680410.1621092468, 925272.8137449462]], + variant = 'top250raster', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.top250raster_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + top500raster_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-283214.7350810917, 29993.466279334272], [680410.1621092468, 925272.8137449462]], + variant = 'top500raster', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.top500raster_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + top1000raster_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-283214.7350810917, 29993.466279334272], [680410.1621092468, 925272.8137449462]], + variant = 'top1000raster', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.top1000raster_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + brpgewaspercelen_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'brpgewaspercelen', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.brpgewaspercelen_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bgtstandaardv2_EPSG_28992_16 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 16, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'bgtstandaardv2', + style = 'default', + tilematrixset = 'EPSG:28992:16', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.bgtstandaardv2_EPSG_28992_16', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bgtsymbolenv2_EPSG_28992_16 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 16, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'bgtsymbolenv2', + style = 'default', + tilematrixset = 'EPSG:28992:16', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.bgtsymbolenv2_EPSG_28992_16', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bgtplaninformatie_EPSG_28992_16 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 16, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'bgtplaninformatie', + style = 'default', + tilematrixset = 'EPSG:28992:16', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.bgtplaninformatie_EPSG_28992_16', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bgtstandaard_EPSG_28992_16 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 16, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'bgtstandaard', + style = 'default', + tilematrixset = 'EPSG:28992:16', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.bgtstandaard_EPSG_28992_16', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bgtachtergrond_EPSG_28992_16 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 16, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'bgtachtergrond', + style = 'default', + tilematrixset = 'EPSG:28992:16', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.bgtachtergrond_EPSG_28992_16', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bgtomtrekgericht_EPSG_28992_16 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 16, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'bgtomtrekgericht', + style = 'default', + tilematrixset = 'EPSG:28992:16', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.bgtomtrekgericht_EPSG_28992_16', + attribution = 'Kaartgegevens (C) Kadaster' + ), + bgtpastel_EPSG_28992_16 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 16, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'bgtpastel', + style = 'default', + tilematrixset = 'EPSG:28992:16', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.bgtpastel_EPSG_28992_16', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn1_100m_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn1_100m', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn1_100m_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn1_25m_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn1_25m', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn1_25m_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn1_5m_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn1_5m', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn1_5m_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn2_5m_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn2_5m', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn2_5m_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn2_05m_non_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn2_05m_non', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn2_05m_non_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn2_05m_int_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn2_05m_int', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn2_05m_int_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn2_05m_ruw_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn2_05m_ruw', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn2_05m_ruw_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn3_5m_dsm_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn3_5m_dsm', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn3_5m_dsm_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn3_5m_dtm_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn3_5m_dtm', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn3_5m_dtm_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn3_05m_dsm_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn3_05m_dsm', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn3_05m_dsm_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + ahn3_05m_dtm_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'ahn3_05m_dtm', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png8', + name = 'nlmaps.ahn3_05m_dtm_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + opentopo_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'opentopo', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.opentopo_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + opentopoachtergrondkaart_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'opentopoachtergrondkaart', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.opentopoachtergrondkaart_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + nl2016_ortho25_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = '2016_ortho25', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/jpeg', + name = 'nlmaps.nl2016_ortho25_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + nl2016_ortho25IR_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = '2016_ortho25IR', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/jpeg', + name = 'nlmaps.nl2016_ortho25IR_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + nl2017_ortho25_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = '2017_ortho25', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/jpeg', + name = 'nlmaps.nl2017_ortho25_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + nl2017_ortho25IR_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = '2017_ortho25IR', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/jpeg', + name = 'nlmaps.nl2017_ortho25IR_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ), + lufolabels_EPSG_28992 = TileProvider( + url = 'https://geodata.nationaalgeoregister.nl/tiles/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={variant}&STYLE={style}&TILEMATRIXSET={tilematrixset}&TILEMATRIX={tilematrixset}:{z}&TILEROW={y}&TILECOL={x}&FORMAT={format}', + min_zoom = 0, + max_zoom = 14, + bounds = [[-285401.92067705275, 22598.081978615082], [595401.9089015555, 903401.9209669305]], + variant = 'lufolabels', + style = 'default', + tilematrixset = 'EPSG:28992', + crs = 'EPSG:28992', + format = 'image/png', + name = 'nlmaps.lufolabels_EPSG_28992', + attribution = 'Kaartgegevens (C) Kadaster' + ) ) ) diff --git a/contextily/plotting.py b/contextily/plotting.py index af8069c8..052213cc 100644 --- a/contextily/plotting.py +++ b/contextily/plotting.py @@ -3,7 +3,7 @@ import numpy as np from . import tile_providers as sources from . import providers -from .tile import _calculate_zoom, bounds2img, _sm2ll, warp_tiles, _warper +from .tile import _calculate_zoom, bounds2img, _sm2ll, warp_tiles, _warper, bounds2img_wmts from rasterio.enums import Resampling from rasterio.warp import transform_bounds from matplotlib import patheffects @@ -202,3 +202,40 @@ def add_attribution(ax, text, font_size=ATTRIBUTION_SIZE, **kwargs): wrap_width = ax.get_window_extent().width * 0.99 text_artist._get_wrap_line_width = lambda: wrap_width return text_artist + + +def add_basemap_wmts( + ax, + url, + zoom=ZOOM, + interpolation=INTERPOLATION, + attribution=None, + attribution_size=ATTRIBUTION_SIZE, + reset_extent=True, + resampling=Resampling.bilinear, + **extra_imshow_args +): + xmin, xmax, ymin, ymax = ax.axis() + # Assume web source for now + # Extent + left, right, bottom, top = xmin, xmax, ymin, ymax + # Assume crs is consistent + # Zoom + image, extent = bounds2img_wmts( + left, bottom, right, top, url, zoom + ) + # Plotting + img = ax.imshow( + image, extent=extent, interpolation=interpolation, **extra_imshow_args + ) + + if reset_extent: + ax.axis((xmin, xmax, ymin, ymax)) + + # Add attribution text + if attribution is None: + attribution = url.get("attribution") + if attribution: + add_attribution(ax, attribution, font_size=attribution_size) + + return image \ No newline at end of file diff --git a/contextily/tile.py b/contextily/tile.py index a7fe8c8b..7d6eb5bb 100644 --- a/contextily/tile.py +++ b/contextily/tile.py @@ -23,7 +23,10 @@ from . import tile_providers as sources from . import providers -__all__ = ["bounds2raster", "bounds2img", "warp_tiles", "warp_img_transform", "howmany"] +import projecttile as pt + + +__all__ = ["bounds2raster", "bounds2img", "warp_tiles", "warp_img_transform", "howmany", "bounds2raster_wmts", "bounds2img_wmts"] USER_AGENT = "contextily-" + uuid.uuid4().hex @@ -560,3 +563,199 @@ def _merge_tiles(tiles, arrays): ) return img, (west, south, east, north) + + +def _merge_tiles_wmts(tiles, arrays): + """ + Merge a set of tiles into a single array. + + Parameters + --------- + tiles : list of mercantile.Tile objects + The tiles to merge. + arrays : list of numpy arrays + The corresponding arrays (image pixels) of the tiles. This list + has the same length and order as the `tiles` argument. + + Returns + ------- + img : np.ndarray + Merged arrays. + extent : tuple + Bounding box [west, south, east, north] of the returned image + in long/lat. + """ + # create (n_tiles x 2) array with column for x and y coordinates + tile_xys = np.array([(t.x, t.y) for t in tiles]) + + # get indices starting at zero + indices = tile_xys - tile_xys.min(axis=0) + + # the shape of individual tile images + h, w, d = arrays[0].shape + + # number of rows and columns in the merged tile + n_x, n_y = (indices + 1).max(axis=0) + + # empty merged tiles array to be filled in + img = np.zeros((h * n_y, w * n_x, d), dtype=np.uint8) + + for ind, arr in zip(indices, arrays): + x, y = ind + img[y * h : (y + 1) * h, x * w : (x + 1) * w, :] = arr + + bounds = np.array([pt.bounds(t) for t in tiles]) # mt => pt + west, south, east, north = ( + min(bounds[:, 0]), + min(bounds[:, 1]), + max(bounds[:, 2]), + max(bounds[:, 3]), + ) + + return img, (west, south, east, north) + + +def _calculate_zoom_wmts(w, s, e, n, provider_bounds): + """Automatically choose a zoom level given a desired number of tiles. + + Parameters + ---------- + w : float + The western bbox edge. + s : float + The southern bbox edge. + e : float + The eastern bbox edge. + n : float + The northern bbox edge. + provider_bounds : tuple of float + Bounding values in cartesian coordinates: left, bottom, right, top + + Returns + ------- + zoom : int + The zoom level to use in order to download this number of tiles. + """ + # Calculate bounds of the bbox + lon_range = np.sort([e, w])[::-1] + lat_range = np.sort([s, n])[::-1] + + lon_length = np.subtract(*lon_range) + lat_length = np.subtract(*lat_range) + + left, bottom, right, top = provider_bounds + + # Calculate the zoom + zoom_lon = np.ceil(np.log2((right - left) / lon_length)) + zoom_lat = np.ceil(np.log2((top - bottom) / lat_length)) + zoom = np.max([zoom_lon, zoom_lat]) + return int(zoom) + + +def _clamp_zoom_wmts(zoom, provider): + msg = "Zoom level is outside of available levels. Fetching nearest available instead." + if zoom < provider["min_zoom"]: + warnings.warn(msg) + return provider["min_zoom"] + elif zoom > provider["max_zoom"]: + warnings.warn(msg) + return provider["max_zoom"] + else: + return zoom + + +def bounds2img_wmts(left, bottom, right, top, url, zoom="auto", wait=0, max_retries=2): + """ + Arguments + --------- + left : float + West edge + bottom : float + South edge + right : float + East edge + top : float + North edge + url : contextily.TileProvider + zoom : int + Level of detail + + Returns + ------- + img : ndarray + Image as a 3D array of RGB values + extent : tuple + Bounding box [minX, maxX, minY, maxY] of the returned image + """ + (_left, _bottom), (_right, _top) = url["bounds"] + provider_bounds = (_left, _bottom, _right, _top) + if zoom == "auto": + zoom = _calculate_zoom_wmts(left, bottom, right, top, provider_bounds) + zoom = _clamp_zoom_wmts(zoom, url) + tiles = [] + arrays = [] + for t in pt.tiles(left, bottom, right, top, [zoom], provider_bounds): + x, y, z = t.x, t.y, t.z + tile_url = _construct_tile_url(url, x, y, z) + image = _fetch_tile(tile_url, wait, max_retries) + tiles.append(t) + arrays.append(image) + merged, (left, bottom, right, top) = _merge_tiles_wmts(tiles, arrays) + # Matplotlib expents them in a different order ... + extent = (left, right, bottom, top) + return merged, extent + + +def bounds2raster_wmts( + left, bottom, right, top, path, url, zoom="auto", wait=0, max_retries=2, +): + """ + Arguments + --------- + left : float + West edge + bottom : float + South edge + right : float + East edge + top : float + North edge + path : str + Path to raster file to be written + url : contextily.TileProvider + zoom : int + Level of detail + + Returns + ------- + img : ndarray + Image as a 3D array of RGB values + extent : tuple + Bounding box [minX, maxX, minY, maxY] of the returned image + """ + # Download + Z, ext = bounds2img_wmts(left, bottom, right, top, url, zoom, wait, max_retries) + # Write + # --- + h, w, b = Z.shape + # --- https://mapbox.github.io/rasterio/quickstart.html#opening-a-dataset-in-writing-mode + minX, maxX, minY, maxY = ext + x = np.linspace(minX, maxX, w) + y = np.linspace(minY, maxY, h) + resX = (x[-1] - x[0]) / w + resY = (y[-1] - y[0]) / h + transform = from_origin(x[0] - resX / 2, y[-1] + resY / 2, resX, resY) + # --- + with rio.open( + path, + "w", + driver="GTiff", + height=h, + width=w, + count=b, + dtype=str(Z.dtype.name), + transform=transform, + ) as raster: + for band in range(b): + raster.write(Z[:, :, band], band + 1) + return Z, ext diff --git a/contextily_local_basemaps.ipynb b/contextily_local_basemaps.ipynb new file mode 100644 index 00000000..3ff2819e --- /dev/null +++ b/contextily_local_basemaps.ipynb @@ -0,0 +1,78 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "import contextily as ctx\n", + "import geopandas as gpd\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "provider = ctx.providers[\"PDOK\"]['opentopo_EPSG_28992']\n", + "provider" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "w = 128_000.0\n", + "s = 440_000.0\n", + "e = 150_000.0\n", + "n = 460_000.0\n", + "a, extent = ctx.bounds2img_wmts(w, s, e, n, url=provider, zoom=\"auto\")\n", + "fig, ax = plt.subplots(figsize=(10, 10))\n", + "ax.imshow(a, interpolation=\"spline36\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x = 155_000.0\n", + "y = 463_000.0\n", + "df = pd.DataFrame({\"Locatie\": [\"Onze Lieve Vrouwentoren\"], \"x\": [x], \"y\": [y]})\n", + "gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.x, df.y))\n", + "ax = gdf.plot(figsize=(10, 10))\n", + "a = ctx.add_basemap_wmts(ax, provider, interpolation=\"spline36\", zoom=\"auto\", reset_extent=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.7.6 64-bit ('salty': conda)", + "language": "python", + "name": "python37664bitsaltycondaf755b71eb5284478984b9eadde8a8258" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/scripts/fetch_wmts_providers.py b/scripts/fetch_wmts_providers.py new file mode 100644 index 00000000..51f93ea9 --- /dev/null +++ b/scripts/fetch_wmts_providers.py @@ -0,0 +1,140 @@ +from copy import deepcopy +import json +import itertools +import projecttile as pt + +import parse_leaflet_providers + + +def starts_with_digit(name): + try: + int(name[0]) + return True + except ValueError: + return False + + +def process_metadata( + basename, + provider_metadata, + tilematrixsets, + prepend=None, + base_url=None, + attribution=None, +): + """ + Arguments + --------- + basename : str + basename of the Bunch + provider_metadat : dict + contains the metadata of all content the WMTS service provides + tilematrixsets : dict + contains the metadata of the matrixsets the WMTS service provides + prepend : string, optional + the WTMS layers may start with digits, which results in invalid Python + variable names. This is prepended with this string in case the name + starts with a digit. + base_url : string, optional + Depending on the service, URLs are provided as ResourceURLs, or they + should **hopefully** follows WMTS specs in which case they have a single + root base_url. + attribution : string, optional + attribution to include. WMTS services do not appear to give proper + attribution info, so it has to be added manually. + + Returns + ------- + providers : dict of dicts + Contains the provider metadata, ready to dump as json into the _providers.py module. + """ + + # Avoid side-effects + provider_metadata = deepcopy(provider_metadata) + providers = {} + + for name, d in data.items(): + # Get rid of 8 bit pngs + if len(d["formats"]) > 1: + try: + d["formats"].pop("image/png8") + except: + pass + # Don't combine bounding box: + bbox = d.pop("bboxWGS84") + combinations = [dict(zip(d, v)) for v in itertools.product(*d.values())] + + for item in combinations: + setname = item["tilematrixset"] + # Colons might be problematic in the names? + provider_name = name + "_" + setname.replace(":", "_") + + if starts_with_digit(provider_name): + provider_name = prepend + provider_name + + tilematrixset = tilematrixsets[setname] + provider_crs = tilematrixset["crs"] + # Remove weird double colon + provider_crs = "EPSG:" + provider_crs.split("EPSG::")[-1] + left, bottom, right, top = pt.provider_bounds(bbox, provider_crs) + bounds = [[left, bottom], [right, top]] + + url = item.get("url") + if url is None: + url = base_url + + provider = dict( + url=url, + min_zoom=tilematrixset["min_zoom"], + max_zoom=tilematrixset["max_zoom"], + bounds=bounds, + variant=name, + style=item["styles"], + tilematrixset=setname, + crs=provider_crs, + format=item["formats"], + name=basename + "." + provider_name, + ) + if attribution is not None: + provider["attribution"] = attribution + + providers[provider_name] = provider + + return providers + + +if __name__ == "__main__": + # Get capabilities + url = "https://geodata.nationaalgeoregister.nl/tiles/service/wmts?" + # Fetch data + data, tilematrixsets = pt.wmts_metadata(url) + + base_url = ( + "https://geodata.nationaalgeoregister.nl/tiles/service/wmts?" + "SERVICE=WMTS" + "&REQUEST=GetTile" + "&VERSION=1.0.0" + "&LAYER={variant}" + "&STYLE={style}" + "&TILEMATRIXSET={tilematrixset}" + "&TILEMATRIX={tilematrixset}:{z}" + "&TILEROW={y}" + "&TILECOL={x}" + "&FORMAT={format}" + ) + attribution = "Kaartgegevens (C) Kadaster" + nlmaps_providers = process_metadata( + basename="PDOK", + provider_metadata=data, + tilematrixsets=tilematrixsets, + prepend="nl", + base_url=base_url, + attribution=attribution, + ) + + # Write to file + content = parse_leaflet_providers.generate_file( + {"PDOK": nlmaps_providers}, description=url + ) + with open("_nl_providers.py", "w") as f: + f.write(content)