[gdal-dev] GDAL GeoTiff Corrupt on Write (C++ )

Even Rouault even.rouault at spatialys.com
Fri Feb 27 03:34:06 PST 2015


Le vendredi 27 février 2015 12:28:01, Dusted a écrit :
> I'm getting corrupt output when writing a GeoTiff using GDAL API (v1.10 -
> C++). The raster geotransform is correct, the block is written in the
> correct position but the pixels are written at random positions and values
> within the block.
> 
> Example:  http://i.imgur.com/mntnAfK.png <http://i.imgur.com/mntnAfK.png>
> 
> Method: Open a GDAL Raster --> copy projection info & size --> create
> output GeoTiff --> write a block from array at offset.
> 
> Code:
> 
> //Open the input DEM
> const char* demFName = "/Users/mount.dem";
> const char* outFName = "/Users/geodata/out_test.tif";
> auto poDataset = ioUtils::openDem(demFName);
> double adfGeoTransform[6];
> poDataset->GetGeoTransform( adfGeoTransform );
> 
> //Setup driver
> const char *pszFormat = "GTiff";
> GDALDriver *poDriver;
> poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
> char *pszSRS_WKT = NULL;
> GDALRasterBand *poBand;
> //Get size from input Raster
> int xSize = poDataset->GetRasterXSize();
> int ySize = poDataset->GetRasterYSize();
> 
> //Set output Dataset
> GDALDataset *poDstDS;
> char **papszOptions = NULL;
> 
> //Create output geotiff
> poDstDS = poDriver->Create( outFName, xSize, ySize, 1, GDT_Byte,
> papszOptions );
> 
> //Get the geotrans from the input geotrans
> poDataset->GetGeoTransform( adfGeoTransform );
> poDstDS->SetGeoTransform( adfGeoTransform );
> poDstDS->SetProjection( poDataset->GetProjectionRef() );
> 
> //Create some data to write
> unsigned char rData[512*512];
> //Assign some values other than 0
> for (int col=0; col < 512; col++){
>     for (int row=0; row < 512; row++){
>         rData[col*row] = 50;

==> rData[row*512+col] = 50

And for efficiency with the CPU caches, you should switch the order of the for 
loops.

>     }
> }
> 
> //Write some data
> poBand = poDstDS->GetRasterBand(1);
> poBand->RasterIO( GF_Write, 200, 200, 512, 512,
>                   rData, 512, 512, GDT_Byte, 0, 0 );
> 
> //Close
> GDALClose( (GDALDatasetH) poDstDS );
> std::cout << "Done" << std::endl;
> 
> 
> Any pointers / help much appreciated!
> 
> Chris
> 
> 
> 
> --
> View this message in context:
> http://osgeo-org.1560.x6.nabble.com/GDAL-GeoTiff-Corrupt-on-Write-C-tp5190
> 440.html Sent from the GDAL - Dev mailing list archive at Nabble.com.
> _______________________________________________
> 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