<div dir="ltr">As you proposed I tested <b>gdal_translate </b>utility but for the following sample command I get an empty image (tested with jpg and png)<div><br><font face="monospace">gdal_translate "WMTS:<a href="http://maps.wien.gv.at/wmts/1.0.0/WMTSCapabilities.xml,layer=fmzk3dviewer">http://maps.wien.gv.at/wmts/1.0.0/WMTSCapabilities.xml,layer=fmzk3dviewer</a>" -srcwin 1820157 6144777 512 512 tile.jpg</font><br><div><br></div><div><img src="cid:ii_lwur0f4t1" alt="image.png" style="margin-right: 0px;" width="562" height="57"><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">pt., 31 maj 2024 o 15:31 Michał Kowalczuk <<a href="mailto:michkowalczuk@gmail.com">michkowalczuk@gmail.com</a>> napisał(a):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Thank you Rukka,<div>Since <b>-srcwin</b> and <b>-projwin</b> are options only for <b>gdal_translate</b> utility, your suggestion leads me to use <b>GDALTranslate()</b> function with these parameters.</div><div><br></div><div>This means that I cannot use directly created WMTS dataset to retrieve data (using GDALDatasetRasterIO), but create a new (in-memory or file-based) for each map extent change.</div><div><br></div><div>And this is the standard way of doing it?</div><div>Do I understand it correctly?</div><div><br></div><div>Michal </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">pt., 31 maj 2024 o 15:13 Rahkonen Jukka <<a href="mailto:jukka.rahkonen@maanmittauslaitos.fi" target="_blank">jukka.rahkonen@maanmittauslaitos.fi</a>> napisał(a):<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>





<div lang="FI">
<div>
<p class="MsoNormal"><span lang="EN-US">Hi,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">Before starting to program you can familiar yourself with the topic by using gdal_translate
</span><a href="https://gdal.org/programs/gdal_translate.html" target="_blank"><span lang="EN-US">gdal_translate — GDAL documentation</span></a><span lang="EN-US">.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">Play with the -srcwin and -projwin / -projwin_srs options and gather some trust that is is possible to select and download any part of the large WMTS layer. Add “-- debug on” and you
 will see that GDAL downloads tiles separately just like QGIS. Actually, with WMTS it is the only way to download data. Maybe you have read the standard already
<a href="https://portal.ogc.org/files/?artifact_id=35326" target="_blank">https://portal.ogc.org/files/?artifact_id=35326</a>. It is not necessary because GDAL knows what to do, but a review every now and then does not harm. Especially the TileMatrix and TileMatrixSet things
 are not self-evident, but they provide the answer to the question about how a WMTS client knows which row, col, and zoom to download.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">Do not touch the DataWindow. It defines the extent of the whole WMTS layer and it is used for example if gdal_translate is run without spatial selection (-srcwin or -projwin). Touch
 in your future code things which are equivalent to -srcwin or -projwin of gdal_translate.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">-Jukka Rahkonen-<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">Lähettäjä:</span></b><span lang="EN-US"> Michał Kowalczuk <<a href="mailto:michkowalczuk@gmail.com" target="_blank">michkowalczuk@gmail.com</a>>
<br>
<b>Lähetetty:</b> perjantai 31. toukokuuta 2024 15.45<br>
<b>Vastaanottaja:</b> Even Rouault <<a href="mailto:even.rouault@spatialys.com" target="_blank">even.rouault@spatialys.com</a>><br>
<b>Kopio:</b> Rahkonen Jukka <<a href="mailto:jukka.rahkonen@maanmittauslaitos.fi" target="_blank">jukka.rahkonen@maanmittauslaitos.fi</a>>; <a href="mailto:gdal-dev@lists.osgeo.org" target="_blank">gdal-dev@lists.osgeo.org</a><br>
<b>Aihe:</b> Re: [gdal-dev] GDAL WMTS get tiles no documentation<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<div>
<p class="MsoNormal"><span lang="EN-US">Hi, thank you for your replies!<br>
As I'm still a newbie especially with WMTS. I need to take a step back to the basics. </span>Let's forget about multithreading for now.<u></u><u></u></p>
<div>
<ul type="disc">
<li class="MsoNormal">
<span lang="EN-US">I'm in the stage that I can open a dataset using WMTS service path from data provider<u></u><u></u></span></li><li class="MsoNormal">
<span lang="EN-US">I can list subdatasets and open the selected layer as a new dataset using path from
<b>SUBDATASET_id_NAME</b>.<u></u><u></u></span></li><li class="MsoNormal">
<span lang="EN-US">This dataset reports large height and width values, which is obvious.<u></u><u></u></span></li><li class="MsoNormal">
<span lang="EN-US">The first question is how to read any fragment from this dataset using
<b>GDALDatasetRasterIO</b>.<br>
Is there a similar way to <b>SpatialFIlter </b>from vector layers?<br>
I see in the docs there is a <b><DataWindow></b> tag for a local service descriptions which defines extents of the data. Does it mean that for each map extent change I need to create a new local XML file and open a new dataset to read demanded bbox?<br>
</span>Is this the only way for doing it?<u></u><u></u></li><li class="MsoNormal">
<span lang="EN-US">From other site I noticed that QGIS downloads tiles separately? But how it knows which row/col and zoom should be used in GET request?
</span>Does it use GDAL for WMTS reading at all?<br>
<img border="0" width="562" height="79" style="width: 5.8541in; height: 0.8229in;" id="m_-2494342556564177547m_-1659288043362590199Kuva_x0020_1" src="cid:ii_18fced072cd4cff311"><u></u><u></u></li></ul>
<p class="MsoNormal"><span lang="EN-US">I will be grateful for any tip and trucks for a newbie ;-)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Regards,<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Michal  <u></u><u></u></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US">śr., 29 maj 2024 o 12:41 Even Rouault <</span><a href="mailto:even.rouault@spatialys.com" target="_blank"><span lang="EN-US">even.rouault@spatialys.com</span></a><span lang="EN-US">> napisał(a):<u></u><u></u></span></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin:5pt 0cm 5pt 4.8pt">
<div>
<p><span lang="EN-US">Hi,<u></u><u></u></span></p>
<p><span lang="EN-US">The WMS cache (which is used underneath by the WMTS driver) writes each tiles in a separate file. So if you use multi-threaded, as long as you read in parallel different GDALDataset* object on the WMTS filename, and read disjoint areas,
 that should be fine. There might be a slight risk of things going bad if you happened to read the same tile from different GDALDataset* object at the same time, as it could potentially read a partially written cached tile, or concurrently write the tile in
 the cache and corrupt it. The logic is in frmts/wms/gdalwmscache.cpp<u></u><u></u></span></p>
<p><span lang="EN-US">Even<u></u><u></u></span></p>
<div>
<p class="MsoNormal"><span lang="EN-US">Le 29/05/2024 à 10:14, Michał Kowalczuk via gdal-dev a écrit :<u></u><u></u></span></p>
</div>
<blockquote style="margin-top:5pt;margin-bottom:5pt">
<div>
<p class="MsoNormal"><span lang="EN-US">Because this is not clear in documentation, especially in WMTS driver docs, my question is strictly about this issue to programmers who have already explored this topic.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Regards<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Michal<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US">W dniu śr., 29.05.2024 o 10:04 Rahkonen Jukka <</span><a href="mailto:jukka.rahkonen@maanmittauslaitos.fi" target="_blank"><span lang="EN-US">jukka.rahkonen@maanmittauslaitos.fi</span></a><span lang="EN-US">> napisał(a):<u></u><u></u></span></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin:5pt 0cm 5pt 4.8pt">
<div>
<div>
<p class="MsoNormal"><span lang="EN-US">Hi,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">No, I am not sure because I do not program myself. Reading this document
</span><a href="https://gdal.org/user/multithreading.html" target="_blank"><span lang="EN-US">https://gdal.org/user/multithreading.html</span></a><span lang="EN-US"> makes me feel that it is possible to do some things in parallel, but the programmer must know
 how to do it right.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">-Jukka Rahkonen-<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">Lähettäjä:</span></b><span lang="EN-US"> Javier Jimenez Shaw <</span><a href="mailto:j1@jimenezshaw.com" target="_blank"><span lang="EN-US">j1@jimenezshaw.com</span></a><span lang="EN-US">>
<br>
<b>Lähetetty:</b> keskiviikko 29. toukokuuta 2024 10.41<br>
<b>Vastaanottaja:</b> Rahkonen Jukka <</span><a href="mailto:jukka.rahkonen@maanmittauslaitos.fi" target="_blank"><span lang="EN-US">jukka.rahkonen@maanmittauslaitos.fi</span></a><span lang="EN-US">><br>
<b>Kopio:</b> Michał Kowalczuk <</span><a href="mailto:michkowalczuk@gmail.com" target="_blank"><span lang="EN-US">michkowalczuk@gmail.com</span></a><span lang="EN-US">>;
</span><a href="mailto:gdal-dev@lists.osgeo.org" target="_blank"><span lang="EN-US">gdal-dev@lists.osgeo.org</span></a><span lang="EN-US"><br>
<b>Aihe:</b> Re: [gdal-dev] GDAL WMTS get tiles no documentation<u></u><u></u></span></p>
</div>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US">On Wed, 29 May 2024 at 08:59, Rahkonen Jukka via gdal-dev <</span><a href="mailto:gdal-dev@lists.osgeo.org" target="_blank"><span lang="EN-US">gdal-dev@lists.osgeo.org</span></a><span lang="EN-US">>
 wrote:<u></u><u></u></span></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin:5pt 0cm 5pt 4.8pt">
<div>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US">Hi,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">When you have a RasterBand  from the WMTS data source, it is abstracted and you can read the raster data just like from any other data source and raster band
</span><a href="https://gdal.org/tutorials/raster_api_tut.html#reading-raster-data" target="_blank"><span lang="EN-US">https://gdal.org/tutorials/raster_api_tut.html#reading-raster-data</span></a><span lang="EN-US"> “There are a few ways to read raster data,
 but the most common is via the GDALRasterBand::RasterIO() method. This method will automatically take care of data type conversion, up/down sampling and windowing.” GDAL knows which tiles to read.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">I do not know if the WMTS driver can do parallel tile downloads. If not, it is possible to run many RasterIO() at the same time, each reading data from a different
 window like in this rasterio document </span><a href="https://rasterio.readthedocs.io/en/latest/topics/concurrency.html" target="_blank"><span lang="EN-US">https://rasterio.readthedocs.io/en/latest/topics/concurrency.html</span></a><span lang="EN-US">.<u></u><u></u></span></p>
</div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Jukka, are you sure you can run several RasterIO in parallel (on the same dataset)? in GDAL GeoTIFF you cannot: the cache may be corrupted. In that case I open
 several datasets over the same file. I do not know about WMTS.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
</div>
<blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin:5pt 0cm 5pt 4.8pt">
<div>
<div>
<div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US">-Jukka Rahkonen-<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<div>
<p class="MsoNormal"><b><span lang="EN-US">Lähettäjä:</span></b><span lang="EN-US"> gdal-dev <</span><a href="mailto:gdal-dev-bounces@lists.osgeo.org" target="_blank"><span lang="EN-US">gdal-dev-bounces@lists.osgeo.org</span></a><span lang="EN-US">>
<b>Puolesta </b>Michal Kowalczuk via gdal-dev<br>
<b>Lähetetty:</b> keskiviikko 29. toukokuuta 2024 9.08<br>
<b>Vastaanottaja:</b> </span><a href="mailto:gdal-dev@lists.osgeo.org" target="_blank"><span lang="EN-US">gdal-dev@lists.osgeo.org</span></a><span lang="EN-US"><br>
<b>Aihe:</b> [gdal-dev] GDAL WMTS get tiles no documentation<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
<div>
<p class="MsoNormal"><span lang="EN-US">Hi GDAL fellows<u></u><u></u></span></p>
<div>
<p class="MsoNormal"><span lang="EN-US">This is my first post on this mailing list, so I'm asking for understanding.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">As all we know the purpose of using WMTS over WMS, I'd like to implement parallel downloading tiles from service using C API.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">In my opinion GDAL documentation (</span><a href="https://gdal.org/drivers/raster/wmts.html" target="_blank"><span lang="EN-US">https://gdal.org/drivers/raster/wmts.html</span></a><span lang="EN-US">)
 says nothing on this topic.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">I can get capabilities from WMTS, I can open the selected subdataset but how to get tiles for given extent? I could not find any information how to do it, even
 in the GDAL tests on github.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">I am kindly asking for tips. It also can be in python. How using pure GDAL API fetch tiles to dynamically complete the displayed map. This is my goal.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Thank you!<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Michal<u></u><u></u></span></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><span lang="EN-US">_______________________________________________<br>
gdal-dev mailing list<br>
</span><a href="mailto:gdal-dev@lists.osgeo.org" target="_blank"><span lang="EN-US">gdal-dev@lists.osgeo.org</span></a><span lang="EN-US"><br>
</span><a href="https://lists.osgeo.org/mailman/listinfo/gdal-dev" target="_blank"><span lang="EN-US">https://lists.osgeo.org/mailman/listinfo/gdal-dev</span></a><span lang="EN-US"><u></u><u></u></span></p>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
<p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p>
<pre><span lang="EN-US">_______________________________________________<u></u><u></u></span></pre>
<pre><span lang="EN-US">gdal-dev mailing list<u></u><u></u></span></pre>
<pre><a href="mailto:gdal-dev@lists.osgeo.org" target="_blank"><span lang="EN-US">gdal-dev@lists.osgeo.org</span></a><span lang="EN-US"><u></u><u></u></span></pre>
<pre><a href="https://lists.osgeo.org/mailman/listinfo/gdal-dev" target="_blank"><span lang="EN-US">https://lists.osgeo.org/mailman/listinfo/gdal-dev</span></a><span lang="EN-US"><u></u><u></u></span></pre>
</blockquote>
<pre><span lang="EN-US">-- <u></u><u></u></span></pre>
<pre><a href="http://www.spatialys.com/" target="_blank"><span lang="EN-US">http://www.spatialys.com</span></a><span lang="EN-US"><u></u><u></u></span></pre>
<pre><span lang="EN-US">My software is free, but my time generally not.<u></u><u></u></span></pre>
</div>
</blockquote>
</div>
</div>
</div>

</div></blockquote></div>
</blockquote></div>