[R-sig-Geo] Problems freeing rgdal driver...
Robert Hijmans
r.hijmans at gmail.com
Wed Feb 11 01:29:34 CET 2009
Hi Jonathan,
I ran into the same problem when writing the writeRaster function in
the raster package (and see the incipient RemoteSensing package on
R-forge that uses it); which is very similar.
This is the problem:
> driver = new("GDALDriver", "GTiff")
> GDAL.close(driver)
>
> driver = new("GDALDriver", "GTiff")
Error in .local(.Object, ...) : No driver registered with name: GTiff
> GDAL.close(driver)
>
But it does not always happen right away; for some reason.
If you omit
GDAL.close(d.drv)
It will work.
Robert
On Wed, Feb 11, 2009 at 7:32 AM, Jonathan Greenberg
<greenberg at ucdavis.edu> wrote:
> A few months back I was getting some help with adapting R for doing tiled
> processing of remote sensing data, and I made some serious headway, but
> there is a lingering problem I keep scratching my head at. First off, a
> quick recap of the base algorithm:
>
> 1) Let i = input raster, f() some function to apply to i, and o the output
> raster, such that o = f(i)
> 2) i is read in "tiles", each tile read from the input we'll call i_tile (to
> make it simplest, assume I'm just reading i one line at a time) -- this
> process is performed using readGDAL(...offset=c(j, 0),...) where j is the
> current line I'm reading. o_tile = f(i_tile), which is written using
> *writeBin* (not writeGDAL).
> 3) This produces a flat binary file of the sort that Arc binary rasters or
> ENVI rasters use.
>
> So I produce the binary file, but the portion I'm getting a bit hung up on
> is the production of the little text header which completes the file
> (.hdr/.prj for an ESRI raster, .hdr for an ENVI raster, note that the .hdr
> is different between arc and envi). For this example, let's try to make an
> ENVI header. Remember i_tile is one of the readGDAL objects of a tiled
> subset of image of filename i:
>
> ***
>
> gp <- gridparameters(i_tile)
> cellsize <- gp$cellsize
> offset <- gp$cellcentre.offset
> dims <- gp$cells.dim
> dims[[2]]=rows
> nbands <- 1
> tempopen <- GDAL.open(i)
> file_projection <- getProjectionRef(tempopen)
> GDAL.close(tempopen)
> # This was from Roger Bivand
> d.drv <- new("GDALDriver", "ENVI")
> tds.out <- new("GDALTransientDataset", driver = d.drv, rows = dims[2],cols
> = dims[1], bands = nbands, type = "Float32")
> gt <- c(offset[1] - 0.5 * cellsize[1], cellsize[1], 0.0,offset[2] +
> (dims[2] -0.5) * cellsize[2], 0.0, -cellsize[2])
> .Call("RGDAL_SetGeoTransform", tds.out, gt, PACKAGE = "rgdal")
> .Call("RGDAL_SetProject", tds.out, file_projection, PACKAGE = "rgdal")
> fn <- tempfile()
> saveDataset(tds.out, fn)
> GDAL.close(tds.out)
> GDAL.close(d.drv)
>
> temporary_dir=dirname(fn)
> outdir=dirname(outfile)
>
> fnhdr<-as.character(paste(basename(fn),outfile_hdr,sep=''))
> outhdr<-as.character(paste(basename(rasteroutput),outfile_hdr,sep=''))
>
> setwd(temporary_dir)
>
> file.rename(fnhdr,outhdr)
> file.copy(outhdr,outdir,overwrite=TRUE)
>
> ***
>
> So this WORKS the first time I run it, but the SECOND time it is run
> (without quitting out of R) I get the following error:
>> d.drv <- new("GDALDriver", "ENVI")
> Error in .local(.Object, ...) : No driver registered with name: ENVI
>
> It seems like there is some lingering open driver or something someplace,
> but for the life of me I can't tell where it is. You can see that I did a
> GDAL.close(d.drv) but that doesn't seem to be sufficient. Thoughts?
>
> By the way, the full algorithm would deal with RS data of an arbitrary
> number of samples, lines and bands (e.g. hyperspectral processing would be
> completely feasible). I'm happy to send the script to the list once the
> bugs are worked out! Thanks!
>
> --j
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at stat.math.ethz.ch
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>
More information about the R-sig-Geo
mailing list