On Wed, 5 Nov 2008, Jonathan Greenberg wrote:
R-geographers...
I'm trying to solve a problem to implement a line-by-line tiled processing
using RGDAL (read 1 line of an image, process the one line, write one line of
the image to a binary file). Everything except for the final step I'm able
to do using a combination of RGDAL and r-base commands. Below is the basic
structure, the input file "elev" can be any image file GDAL supports -- the
code below just "copies" the image one line at a time:
###
library(rgdal)
infile='elev'
outfile_base='testout'
outfile_ext='.bil'
outfile=paste(outfile_base,outfile_ext,sep='')
outcon <- file(outfile, "wb")
infile_info=GDALinfo(infile)
nl=infile_info[[1]]
ns=infile_info[[2]]
for (row in 1:nl) {
templine <- readGDAL(infile,region.dim=c(1,ns),offset=c(row-1,0))
writeBin(templine[[1]], outcon,size=4)
}
close(outcon)
# Below doesn't work
# writeGDAL(templine,outfile_base,drivername='EHdr',type="Float32")
###
The issue is this: I need to be able to effectively copy the
geographic/header information from the input file (the last line almost
works, but as you can see it sets the line #s to 1, not "ns"), and parse it
over to the output file (which is some form of a flat binary file -- in this
case, an Arc Binary Raster, but an ENVI binary output would also be good) --
ideally I'd like to be able to modify this header, particularly the number
type (e.g. if the input file is an integer, and I'm writing out a floating
point binary, I need that reflected in the output header). I can do this by
*manually* creating the output header via a series of ascii-writes, but I was
wondering if there is a more effective way of doing this using RGDAL that
might apply generically to the header of any binary image file I might write?
Thanks!
It is the internals of writeGDAL() and create2GDAL() without the bands:
data(meuse.grid)
gridded(meuse.grid) <- ~x+y
d.drv <- new("GDALDriver", "EHdr")
gp <- gridparameters(meuse.grid)
cellsize <- gp$cellsize
offset <- gp$cellcentre.offset
dims <- gp$cells.dim
nbands <- 1
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")
list.files(tempdir())
fn <- tempfile()
saveDataset(tds.out, fn)
list.files(tempdir())
GDAL.close(tds.out)
list.files(tempdir())
However, the driver does commit the data file too, so you'd need to run
the above code to produce the header so as not to overwrite your output
data. The key thing is to get the input grid parameters right, but you've
got them anyway. If you want the projection information out too, look in
create2GDAL for the .Call() you need. Note that passing unchecked
variables through .Call may crash your session - going through
GridTopology should make sure that they are stored correctly.
Hope this helps,
Roger
--j
--
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: [EMAIL PROTECTED]
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.