[gdal-dev] Interpolation when using the WMS format

Peter Hopfgartner peter.hopfgartner at r3-gis.com
Fri Sep 26 09:14:02 PDT 2014


On 09/19/2014 01:50 PM, Peter Hopfgartner wrote:
> On 09/18/2014 10:30 PM, Even Rouault wrote:
>> Le jeudi 18 septembre 2014 22:23:06, Peter Hopfgartner a écrit :
>>> Salut Evan,
>>>
>>> thanks for you recipe. Unfortunately, what I am really interested in 
>>> is to
>>> use this from MapServer. Could you give me a pointer in the source 
>>> where
>>> the resampling takes place?
>> In gcore/rasterio.cpp : GDALRasterBand::IRasterIO(). I must warn you 
>> : quite
>> tricky code
>>
>> But perhaps you don't need code change. In MapServer did you try to 
>> define
>> PROCESSING "RESAMPLE=BILINEAR" ?
>>
>>> Thanks,
>>>
>>> Peter
>>>
>>> Am 18.09.2014 um 22:11 schrieb Even Rouault 
>>> <even.rouault at spatialys.com>:
>>>> Le jeudi 18 septembre 2014 17:40:11, Peter Hopfgartner a écrit :
>>>>> Hi, everybody
>>>>>
>>>>> we are using the GDAL WMS driver for getting maps from a public WMTS
>>>>> service, http://www.basemap.at. Anyway, the resulting image does not
>>>>> look smooth. In particular, I would guess that the the image was 
>>>>> scaled
>>>>> with something like a nearest neighbor algorithm.
>>>>> So my question is simply, if I can switch the interpolation method in
>>>>> some place.
>>>>>
>>>>> The XML file, taken from
>>>>> http://gisforge.wordpress.com/2012/11/06/basemap-at-wmts-layer-in-qgis/, 
>>>>>
>>>>> is:
>>>>>
>>>>> <GDAL_WMS>
>>>>>
>>>>>   <Service name="TMS">
>>>>>
>>>>> <ServerUrl>http://maps.wien.gv.at/basemap/geolandbasemap/normal/google38 
>>>>>
>>>>> 57/ ${z}/${y}/${x}.jpeg</ServerUrl> </Service>
>>>>>
>>>>>   <DataWindow>
>>>>>      <UpperLeftX>-20037508.34</UpperLeftX>
>>>>>    <UpperLeftY>20037508.34</UpperLeftY>
>>>>>    <LowerRightX>20037508.34</LowerRightX>
>>>>>    <LowerRightY>-20037508.34</LowerRightY>
>>>>>    <TileLevel>18</TileLevel>
>>>>>    <TileCountX>1</TileCountX>
>>>>>    <TileCountY>1</TileCountY>
>>>>>    <YOrigin>top</YOrigin>
>>>>>     </DataWindow>
>>>>>   <Projection>EPSG:3857</Projection>
>>>>>   <BlockSizeX>256</BlockSizeX>
>>>>>   <BlockSizeY>256</BlockSizeY>
>>>>>   <BandsCount>3</BandsCount>
>>>>>   <Cache />
>>>>>
>>>>> </GDAL_WMS>
>>>>>
>>>>> The command is:
>>>>>
>>>>> gdal_translate -srcwin 35500000 23500000 100000 100000 -of JPEG 
>>>>> -outsize
>>>>> 250 250 basemap_at.xml basemap_at.jpg
>>>> Peter,
>>>>
>>>> Resampling done by gdal_translate is nearest neighbour, so not always
>>>> that great.
>>>>
>>>> What you can do is select an outsize that is compatible with the 
>>>> source
>>>> overviews. In TMS, the ratio between sucessive overviews work with 
>>>> factor
>>>> of 2, so you should select an outsize of 10000 / 2^N. The closest is
>>>> 10000 / 256 = 390.625 -> 391
>>>>
>>>> So
>>>>
>>>> gdal_translate -srcwin 35500000 23500000 100000 100000 -outsize
>>>> 391 391 basemap_at.xml tmp.tif
>>>>
>>>> and then:
>>>>
>>>> gdalwarp tmp.tif tmp2.tif -r lanczos -ts 250 250 (you can try 
>>>> different
>>>> resampling kernel)
>>>> gdal_translate tmp2.tif basemap_at.jpg -of JPEG
>>>>
>>>> Best regards,
>>>>
>>>> Even
> I've tried to simulate the result of different algorithms to further 
> investigate the idea of having a configurable resampling step. The 
> original tile is 256 x 256 pixels and I've rescaled it to rescale it 
> to 200x200 using Gimp.
>
> The original tile was taken from 
> http://maps.wien.gv.at/basemap/geolandbasemap/normal/google3857/8/89/137.jpg, 
> a copy is stored at 
> https://dl.dropboxusercontent.com/u/4935329/resampling_tests/137.jpg.
>
> Results
> no interpolation, (nearest neighbor?): 
> https://dl.dropboxusercontent.com/u/4935329/resampling_tests/137.resampled_to_200.px-noint.png
> bilinear: 
> https://dl.dropboxusercontent.com/u/4935329/resampling_tests/137.resampled_to_200.px-linear.png
> bicubic: 
> https://dl.dropboxusercontent.com/u/4935329/resampling_tests/137.resampled_to_200.px-cubic.png
> lanczos: 
> https://dl.dropboxusercontent.com/u/4935329/resampling_tests/137.resampled_to_200.px-lanczos.png
>
> I'd say that the quality of the resampling respects the obove order, 
> with lanczos being the best.
>
> Regards,
>
> Peter
>
I finally took the time to have a better look at this.

The attached patch is only for our special case, where data arrives in 8 
bit bands  and is certainly far from being decent (I've written my last 
C++ code approx. 15 years ago). Anyway, the image quality seems indeed 
to improve sensibly.

I used the current SVN version as a base for the development.

Applying the patch I get from 
https://dl.dropboxusercontent.com/u/4935329/resampling_tests/basemap.2000x2000-quasiorig.jpg 
to this 
https://dl.dropboxusercontent.com/u/4935329/resampling_tests/basemap.2000x2000.bilinear.jpg 
.

Anyway, the execution time approximatly doubles (on my 2011 notebook it 
passes from  ~ 1.8 s to ~ 3.4 s), which in our case is not really an 
issue, but probaly for almost everybody else.

The command line is, starting from the compilation dir:

apps/gdal_translate -srcwin 35555000 23538000 2500 2500 -of JPEG 
-outsize 2000 2000 basemap.xml basemap.2000x2000.bilinear.jpg .

Any comment is highly appreciated.

Regards and a nice weekend,

Peter

-- 
Peter Hopfgartner
R3 GIS
web  : http://www.r3-gis.com

-------------- next part --------------
A non-text attachment was scrubbed...
Name: rasterio.bilinear.patch
Type: text/x-patch
Size: 4284 bytes
Desc: not available
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20140926/8a648293/attachment.bin>


More information about the gdal-dev mailing list