[gdal-dev] Warping an image using GDALAutoCreateWarpedVRT() and other questions

Adeel Raza adeel.raza at crc.gc.ca
Thu Jul 9 15:47:16 EDT 2009


Hi,

You're awesome Even. I suppose I will give the MEM driver a try as you 
suggested. Thanks so much. :)

Regards,
Adeel.

Even Rouault wrote:
> Le Thursday 09 July 2009 20:38:13 Adeel Raza, vous avez écrit :
>   
>> Hi,
>>
>> I'm using the "GTiff" driver and using it to create an empty file.
>> Afterwards I write data to the (one and only) rasterband using a float
>> array as the buffer (the GDALDataType I use for the GDALDataset is
>> GDT_Float32 - I believe that should be ok). Then I warp the image
>> using  the GDALAutoCreateWarpedVRT() function. I have noticed that after
>> the image is warped, the number of pixels are not the same as the
>> original TIFF image. Is this normal? I know this sounds like a stupid
>> question, but I need to be sure.
>>     
>
> Yes it is normal if you change projection. The shape and resolutions of the 
> output will not be the same as the input.
>
>   
>> Secondly I was also wondering how the GDALRasterBand::RasterIO()
>> function feeds data into the raster band. I make a function call to the
>> RasterIO function according to the following code:
>>
>>     GDALDriver *tifDriver;
>>     GDALDataset *srcDataset;
>>
>>     tifDriver = (GDALDriver *)GDALGetDriverByName("GTiff");
>>     assert(tifDriver != NULL);
>>     srcDataset = tifDriver->Create("srcDataset.tif", nCols, nRows, 1,
>> GDALDataType::GDT_Float32, NULL);
>>     assert(srcDataset != NULL);
>>
>>     srcDataset->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, nCols, nRows,
>> realCellVals, nCols, nRows, GDALDataType::GDT_Float32, 0 , 0);
>>
>> Both nCols and nRows are unsigned shorts and realCellVals is defined as
>> "float *realCellVals = new float[nCols*nRows];". I have filled
>> realCellValls so that the row at the top of the raster image is the
>> first row and the row at the bottom of the raster image is the last row
>> in the array. Also columns indices increase from left to right. Will
>> this implementation work properly with the RasterIO() function or do I
>> need to arrange my array in another way? 
>>     
>
> I guess you could try and check yourself ;-) If I've understood your 
> description, this should work as you expect.
>
>   
>> The reason why this is critical 
>> is so that I can create a north up TIFF image, warp it to the desired
>> projection system, and get an affine geo transform of the warped north
>> up image so that GT[2] and GT[4] are 0 (GT is the returned affine geo
>> transform from the function - GDALDataset::GetGeoTransform()).
>>     
>
> GDALAutoCreateWarpedVRT() will return a dataset with such characteristics. (to 
> be exact, it won't necessary be exactly "north up", it depends on the 
> destination projection, but I play a bit on words)
>
>   
>> Lastly I initially tried the same approach using a virtual database and
>> creating it in memory using the GDALDriver::Create() function. I tried
>> using the GDALRasterBand::RasterIO() function on the database but I got
>> an error saying "writing to VRTWarpedRasterBands is not supported".
>>     
>
> A VRT file can be created (the XML description), and data can be read from it. 
> But writing pixels into it doesn't make any sense of course, so the error 
> message is logical.
>
>   
>> Therefore I had to use the tiff format to warp the image. Is there
>> anyway to bypass this so that I don't have to create a temporary tiff
>> file to warp my image?
>>     
>
> Yes, I see 2 possibilities : 
> * use the MEM driver instead of the GTiff driver to create an in-memory source 
> dataset (easiest way)
> * use the /vsimem virtual filesystem to creaty an in-memory GeoTIFF file
>
>   
>> Any help would be greatly appreciated. Thanks.
>>
>> Best Regards,
>> Adeel.
>>
>>
>> _______________________________________________
>> gdal-dev mailing list
>> gdal-dev at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>>     
>
>
>
>   



More information about the gdal-dev mailing list