BGT WMTS downloaden naar PNG met bbox via Python

Hoi, ik heb een probleem met de BGT WMTS ik zie niks in mijn plaatje, leeg :confused:

from owslib.wmts import WebMapTileService

bbox=f'{buffer_item.xcoord.min()},{buffer_item.ycoord.min()},{buffer_item.xcoord.max()},{buffer_item.ycoord.max()}'

wmts = WebMapTileService("https://service.pdok.nl/lv/bgt/wmts/v1_0?request=GetCapabilities&service=WMTS")

list(wmts.contents)
# Fetch a tile (using some defaults):

tile = wmts.gettile(layer='standaardvisualisatie', tilematrix='0', row=0, column=0, format="png", bbox=bbox)
out = open('test_wmts.png', 'wb')

bytes_written = out.write(tile.read())

out.close()

Misschien is er een andere manier om dit te schrijven, maar ik ben kapot van zoveel testen en lezen.

1 like

Van Python heb ik geen verstand, wel zie ik dat je row=0 en column=0 opgeeft. Dit valt ver buiten Nederland in de matrix en zal niet gevuld zijn.

Hier vind je wat aanvullende informatie:

1 like

bbox is voor een WMS niet voor WMTS.

2 likes

Scherp!

@ccg : Lees dat draadje waar Anton naar verwijst even goed door, je probeert exact hetzelfde te doen als de OP daar. Alleen haal je WMS en WMTS ook nog door elkaar, zo te zien.

Realiseer je wel, dat zodra je die plaatjes lokaal hebt staan, ze daarna alleen maar gaan verouderen en achterlopen. Je zult ze dus regelmatig moeten verversen, 1 van de redenen waarom ik het nut van een dergelijke actie betwijfel. Als je de gegevens nodig hebt in een applicatie dioe geen WMTS ondersteund of anderszins een live-feed, dan kun je de data die je nodig hebt ook gewoon downloaden. Is misschien wat makkelijker…

@ccg er spelen hier twee problemen door elkaar:

Eerste probleem, de aanroep van wmts.gettile is niet correct, als je in de OWSLib broncode kijkt zie je dat functie de volgende parameters verwacht:

  • tilematrixset, optioneel want defaults naar eerste tilematrixset in de capabilities, maar gezien dat je moet weten welke tilematrixset je hebt om de juiste waardes voor tilematrix, row en column te kiezen kan je hier beter expliciet zijn
  • tilematrix
  • row
  • column

De functie gebruikt dus geen bbox parameter.

De BGT WMTS beschikt alleen over tegels in de EPSG:28992 tilematrixset. Dus om de tegel tilematrix=0&row=0&column=0 op te halen voor de BGT zou je de volgende code moeten uitvoeren:

from owslib.wmts import WebMapTileService
wmts = WebMapTileService(
    "https://service.pdok.nl/lv/bgt/wmts/v1_0?request=GetCapabilities&service=WMTS"  # brta: "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0?SERVICE=WMTS&REQUEST=GETCAPABILITIES"
)
list(wmts.contents)
tile = wmts.gettile(
    layer="standaardvisualisatie",  # brta: "grijs"
    tilematrixset="EPSG:28992",
    tilematrix=0,
    row=0,
    column=0,
    format="png",
)
out = open("test_wmts.png", "wb")
bytes_written = out.write(tile.read())
out.close()

Dit resulteert echter in een leeg plaatje (tweede probleem), omdat de BGT WMTS alleen beschikbaar is op diepere zoomniveaus (vanaf zoomlevel (tilematrix) 12. Voor de BRT Achtergrondkaart werkt bovenstaande code wel (zie de uitgecommentarieerde waardes):

test_wmts

De volgende zxy waardes resulteren wel in kaartbeeld bij de BGT:

tilematrix=12,
row=2133,
column=2210,

test_wmts

Voor zoomniveau 0 geldt dat dus niet, maar dat resulteert dus niet in kaartbeeld bij de BGT WMTS.

Overigens communiceren we nu nog geen schaalgrenzen in onze WMTS capabilities (dit kan met TileMatrixSetLimits). Dit is wel iets wat we van plan zijn om te gaan implementeren. Daarmee zou je dan automatisch kunnen afleiden op welke zoomniveau’s (tilematrices) tegels beschikbaar zijn.
Kan helaas geen schatting geven van wanneer dit opgepakt gaat worden.

1 like