From: Frank W. <war...@po...> - 2004-01-23 20:17:52
|
Carolyn Johnston wrote: > OK, I give, this is driving me nuts. I am trying to create a GDALDataset > in Python, fit it out with metadata and raster data, and write it to a > file. So simple! > > I am checking to see that the geotiff driver supports Create() (it > does), creating the dataset with Create(), and then running the > following code, but nothing happens after I call Create(), at which time > the file has size 0. > > outformat = 'GTiff' > out_driver = gdal.GetDriverByName(outformat) > metadata = out_driver.GetMetadata() > print metadata > if metadata.has_key(gdal.DCAP_CREATE) \ > and metadata[gdal.DCAP_CREATE] == 'YES': > print 'Driver %s supports Create() method.' % outformat > else: > print 'Driver %s does not support Create() method.' % outformat > dd_obj.demdiff = out_driver.Create(dd_obj.ddfilename, xsize, ysize, > 1, gdal.GDT_Float32) > print "demdiff object: ", dd_obj.demdiff > dd_obj.demdiff.SetDescription("DEM Difference produced by DEM Fusion > Prototype") Carolyn, The description on a GDALDataset is actually intended to be the filename itself, and some things will screw up seriously if you fool with this. So please avoid doing this ... it won't save any description in the file. > dd_obj.demdiff.SetGeoTransform(std_geomatrix) > dd_obj.demdiff.SetProjection(std_srs.ExportToWkt()) > dd_obj.demdiff.GetRasterBand(1).WriteArray(ddchunk) > > So what is wrong with this? > :) Carolyn Are you closing the file? Especially with TIFF, but also sometimes with other formats not much gets written to the physical file till you close it. I tried the following rather gross form of you script, and got a file after the script finish, but while waiting for the sys.stdin.readline() the file was zero length still. import gdal import sys class testclass: pass dd_obj = testclass() dd_obj.ddfilename = "out.tif" xsize = 200 ysize = 200 std_geomatrix = [0,1,0,0,0,1] if 1: outformat = 'GTiff' out_driver = gdal.GetDriverByName(outformat) metadata = out_driver.GetMetadata() print metadata if metadata.has_key(gdal.DCAP_CREATE) \ and metadata[gdal.DCAP_CREATE] == 'YES': print 'Driver %s supports Create() method.' % outformat else: print 'Driver %s does not support Create() method.' % outformat dd_obj.demdiff = out_driver.Create(dd_obj.ddfilename, xsize, ysize, 1, gdal.GDT_Float32) print "demdiff object: ", dd_obj.demdiff dd_obj.demdiff.SetDescription("DEM Difference produced by DEM Fusion Prototype") dd_obj.demdiff.SetGeoTransform(std_geomatrix) # dd_obj.demdiff.SetProjection(std_srs.ExportToWkt()) # dd_obj.demdiff.GetRasterBand(1).WriteArray(ddchunk) sys.stdin.readline() The most straight forward way of closing the file is to dereference it. Setting dd_obj.demdiff = None should suffice. If you feel the need to keep the file open, calling FlushCache() on the dataset may help. Best regards, -- ---------------------------------------+-------------------------------------- I set the clouds in motion - turn up | Frank Warmerdam, war...@po... light and sound - activate the windows | http://pobox.com/~warmerdam and watch the world go round - Rush | Geospatial Programmer for Rent |