[gdal-dev] Remapping nodata

Even Rouault even.rouault at spatialys.com
Thu Jan 7 02:09:10 PST 2016


Le jeudi 07 janvier 2016 10:52:24, Blumentrath, Stefan a écrit :
> Hi,
> 
> This is also an issue for PostGIS:
> https://trac.osgeo.org/postgis/ticket/828
> 
> You could try a VRT:
> gdal_translate -of VRT -a_nodata 99999 your_raster.tif your_raster.vrt
> which is pretty efficient (fast and does not duplicate your data), esp. if
> you have a bigger raster and do not need to reproject...
> 

gdal_translate -of VRT -a_nodata will not remap values, but just change the 
declared nodata value.

You can though manually post-edit the VRT to make the SimpleSource a 
ComplexSource and add a NODATA node, as below:

<VRTDataset rasterXSize="2" rasterYSize="2">
  <GeoTransform>  4.4072000000000000e+05,  6.0000000000000000e+01,  
0.0000000000000000e+00,  3.7513200000000000e+06,  0.0000000000000000e+00, 
-6.0000000000000000e+01</GeoTransform>
  <Metadata>
    <MDI key="AREA_OR_POINT">Area</MDI>
  </Metadata>
  <VRTRasterBand dataType="Float32" band="1">
    <NoDataValue>99999</NoDataValue>
    <ColorInterp>Gray</ColorInterp>
    <ComplexSource>
      <SourceFilename relativeToVRT="1">in.asc</SourceFilename>
      <SourceBand>1</SourceBand>
      <SourceProperties RasterXSize="2" RasterYSize="2" DataType="Float32" 
BlockXSize="2" BlockYSize="1" />
      <SrcRect xOff="0" yOff="0" xSize="2" ySize="2" />
      <DstRect xOff="0" yOff="0" xSize="2" ySize="2" />
      <NODATA>nan</NODATA>
    </ComplexSource>
  </VRTRasterBand>
</VRTDataset>


Which can also be accomplished with gdalbuildvrt  and the -vrtnodata switch 
without any manual editing:

$ gdalbuildvrt out2.vrt in.asc -vrtnodata 0

$ cat out2.vrt
<VRTDataset rasterXSize="2" rasterYSize="2">
  <GeoTransform>  4.4072000000000000e+05,  6.0000000000000000e+01,  
0.0000000000000000e+00,  3.7513200000000000e+06,  0.0000000000000000e+00, 
-6.0000000000000000e+01</GeoTransform>
  <VRTRasterBand dataType="Float32" band="1">
    <NoDataValue>0</NoDataValue>
    <ColorInterp>Gray</ColorInterp>
    <ComplexSource>
      <SourceFilename relativeToVRT="1">in.asc</SourceFilename>
      <SourceBand>1</SourceBand>
      <SourceProperties RasterXSize="2" RasterYSize="2" DataType="Float32" 
BlockXSize="2" BlockYSize="1" />
      <SrcRect xOff="0" yOff="0" xSize="2" ySize="2" />
      <DstRect xOff="0" yOff="0" xSize="2" ySize="2" />
      <NODATA>nan</NODATA>
    </ComplexSource>
  </VRTRasterBand>
</VRTDataset>

$ gdal_translate out2.vrt /vsistdout/ -of aaigrid
ncols        2
nrows        2
xllcorner    440720.000000000000
yllcorner    3751200.000000000000
cellsize     60.000000000000
NODATA_value  0
 0.0 123
 115 132


> Cheers
> Stefan
> 
> -----Original Message-----
> From: gdal-dev [mailto:gdal-dev-bounces at lists.osgeo.org] On Behalf Of Even
> Rouault Sent: 7. januar 2016 10:42
> To: gdal-dev at lists.osgeo.org
> Subject: Re: [gdal-dev] Remapping nodata
> 
> Le jeudi 07 janvier 2016 08:54:17, Julien Michel a écrit :
> > Well, maybe this is a little off topic for the gdal mailing list, but
> > I recently had to deal with the same case, and wrote a small
> > application in Orfeo ToolBox (>5.2) to do exactly that: map NaN to a
> > real no data value [1]. So if you need this really quick, and can
> > afford bringin another (quite big) tool in your workflow, here is a
> > workaround.
> > 
> > In the long term, this would be a nice addition to gdal_translate
> > capabilities.
> 
> This can actually be done with gdalwarp.
> 
> $ cat in.asc
> ncols        2
> nrows        2
> xllcorner    440720
> yllcorner    3751200
> cellsize     60
> NODATA_value nan
>  nan 123.0
>  115 132
> 
> $ gdalwarp in.asc out.tif  -dstnodata 0 -overwrite
> 
> (if using trunk please update to the latest revision as I just discovered
> and fixed a bug for this very particular case (float32 and 0 as target
> nodata). 2.0 works fine)
> 
> $ gdal_translate out.tif /vsistdout/ -of aaigrid
> ncols        2
> nrows        2
> xllcorner    440720.000000000000
> yllcorner    3751200.000000000000
> cellsize     60.000000000000
> NODATA_value  0
>  0.0 123
>  115 132
> 
> (you likely need a recent enough GDAL version so that NaN is correctly
> dealt with)
> 
> > Regards,
> > 
> > Julien
> > 
> > [1]
> > https://www.orfeo-toolbox.org/CookBook/CookBooksu61.html#x85-1900004.1.7
> > 
> > Le 06/01/2016 23:59, Brad Hards a écrit :
> > > I'm working on the geopackage elevation extension experiment, and
> > > trying to produce some GeoTIFF tiles that get inserted into sqlite.
> > > 
> > > I need to remap the existing nodata (nan) to some other value that I
> > > can insert into a sqlite table as a number (say zero).
> > > 
> > > I had a long explanation of what I'm doing here, but it is actually
> > > explained in the docs: "Note that, if the input dataset has a nodata
> > > value, this does not cause pixel values that are equal to that nodata
> > > value to be changed to the value specified with this option. "
> > > 
> > > Is there an easy way to do that conversion?
> > > 
> > > Brad
> > > _______________________________________________
> > > gdal-dev mailing list
> > > gdal-dev at lists.osgeo.org
> > > http://lists.osgeo.org/mailman/listinfo/gdal-dev

-- 
Spatialys - Geospatial professional services
http://www.spatialys.com


More information about the gdal-dev mailing list