Qingfeng (Gene) Guan wrote:
I am trying to write a program which is able to create a raster dataset of any supported format. To do so, I first created a virtual dataset in memory using the Create() function, then set the projection and add the bands to the virtual dataset (no links to source datasets), and then used the CreateCopy() function to create a non-virtual dataset from the virtual dataset I just created. However, the CreateCopy() always returned a NULL pointer. I also tried creating a temporary vrt file using the Create() function before using CreateCopy(). Still, the CreateCopy() returned a NULL pointer. Has anyone done this before or have any idea how to do this? Do I have to link a source dataset to the virtual dataset before using CreateCopy() to create a non-virtual dataset from the virtual dataset? I just want to create an empty dataset in which all the pixels are set to some initial value (for example, zero).

I am using GDAL 1.5.3. <http://1.5.3./> The following is the code I wrote:

...
GDALDriver *poDriver = (GDALDriver *) GDALGetDriverByName( "VRT" );
GDALDataset *poVRTDS;
poVRTDS = poVRTDriver->Create("", xSize, ySize,
                            3, GDT_Byte,
                            NULL);

Gene,

It turns out that VRTSourcedRasterBand::IRasterIO() returns CE_Failure if
there are no sources for the band.  I believe this is an inappropriate
behavior, and unnecessarily interferes in situations like yours.

I would appreciate your filing a trac ticket on the issue, and I'll look
into applying a fix.  Tentatively I'm considering this change
in gdal/frmts/vrt/vrtsourcedrasterband.cpp:

Index: vrtsourcedrasterband.cpp
===================================================================
--- vrtsourcedrasterband.cpp    (revision 15924)
+++ vrtsourcedrasterband.cpp    (working copy)
@@ -122,7 +122,7 @@

 {
     int         iSource;
-    CPLErr      eErr = CE_Failure;
+    CPLErr      eErr = CE_None;

     if( eRWFlag == GF_Write )
     {
@@ -171,7 +171,7 @@
 /* -------------------------------------------------------------------- */
 /*      Overlay each source in turn over top this.                      */
 /* -------------------------------------------------------------------- */
-    for( iSource = 0; iSource < nSources; iSource++ )
+    for( iSource = 0; eErr == CE_None && iSource < nSources; iSource++ )
     {
         eErr =
             papoSources[iSource]->RasterIO( nXOff, nYOff, nXSize, nYSize,

You might want to try it yourself.

Best regards,
--
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up   | Frank Warmerdam, [EMAIL PROTECTED]
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush    | Geospatial Programmer for Rent

_______________________________________________
gdal-dev mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to