I'm trying to resample an in image in the MODIS sinusoidal projection. There are several fill/ NoData values that I want to exclude in the resampling. The data are unsigned 16-bit integer values. A sample source image can be downloaded here.; I'm using the ET_1km
layer in the 2014 image: MOD16A3.A2014365.h11v05.105.2015034131802.hdf
.
Because the source is an HDF4 file, I initially use gdal_translate
to built a VRT.
gdal_translate -of vrt -ot UInt16 HDF4_EOS:EOS_GRID:"/path/to/file/MOD16A3.A2014365.h11v05.105.2015034131802.hdf":MOD_Grid_MOD16A3:PET_1km ~/Downloads/temp.vrt
Then, I use gdal_merge.py
(because I really want to merge multiple VRTs to build a global mosaic) to output a GeoTIFF.
gdal_merge.py -of "GTiff" -o ~/Downloads/temp.tiff ~/Downloads/temp.vrt
Finally, I use gdalwarp
to resample/ reproject the image. The target projection here is a global EASE-Grid 2.0. Note I have multiple srcnodata
values that I want to map to a single NoData value in the output.
gdalwarp -t_srs "EPSG:6933" -r bilinear -tr 1000 1000 \
-te -17367530.450 -7301459.170 17336469.550 7314540.830 \
-srcnodata "65535 65534 65533 65532 65531 65530 65529" \
-dstnodata 65535 -multi -wo NUM_THREADS=6 -ot UInt16 \
~/Downloads/temp.tiff ~/Downloads/temp_warped.tiff
Unfortunately, the warped file has resampled the srcnodata
values. It has set the correct output NoData value (65535) but there are still unmasked values from the srcnodata
array and they have contaminated adjacent, resampled pixels. These values are much higher than the expected range, so they're pretty obviously affected by these unmasked srcnodata
values.
Reading the array in with GDAL/NumPy, I can verify that I'm asking gdalwarp
to mask the right values; the three highest are among my srcnodata
values and nothing else comes close:
>>> np.unique(arr)[6300:]
array([18227, 18228, 18230, 18250, 18258, 18259, 18268, 18271, 18275,
18278, 18281, 18282, 18288, 18292, 18299, 18302, 18304, 18306,
18315, 18319, 18320, 18322, 18326, 18338, 18341, 18352, 18355,
18365, 18373, 18385, 18389, 18435, 18465, 18479, 18504, 18535,
18552, 18555, 18556, 18559, 18561, 18566, 18572, 18594, 18614,
18622, 18637, 18640, 18735, 18738, 18845, 18867, 18868, 18906,
19100, 65530, 65533, 65534], dtype=uint16)
Is there something special about specifying multiple srcnodata
values? I don't often use more than one. I guess until I figure this out I'll use nearest-neighbor interpolation and manually re-map these values.