Hi,

This should work better. I'm not greatly familiar with the lower-level R functions for GDAL, but the following should be closer to what you wanted.

This assumes that "bm" is defined in the top level workspace, and the function can access it via R's scoping rules. You could use a similar approach to read the source in small pieces as well if need be. Please consult the rgdal documentation. I believe further discussion belongs on R-Sig-Geo as your problem likely has nothing to do with GDAL.

You may need to work with a column-wise version of indexing from your source matrix, depending on whether "bm" is aligned according to the image() conventions.

Cheers, Mike.

library(rgdal)
data(volcano)
bm <- volcano

##bm <- matrix(rnorm(1e6), nrow = 1000)  ## larger example

bm.writeTiff <- function(filename) {
## search for "bm" matrix in workspace (simplistic way to avoid copying)
       if (!(exists("bm") | is.matrix(bm)) ) stop("bm matrix not found ")
# GTiff driver
       driver <- new('GDALDriver', 'GTiff')
tds <- new("GDALTransientDataset",driver,nrow(bm),ncol(bm), type="Int32")

       for (row in 1:nrow(bm)) {
## note that leaving one index empty equates to specifying "all indices" putRasterData(tds, bm[row, ], offset= c(row - 1, 0)) ## R is 1-based, GDAL rows are 0-based
       }
saveDataset(tds,filename) GDAL.close(tds)
}

bm.writeTiff("test.tif")


Henning Bredel wrote:
On Mon, 2009-01-19 at 20:57 +1100, Michael Sumner wrote:
Hello,


Hey Mike,

thanks for your exhaustive answere :-)

Note this recent R-Sig-Geo post about the "in-development" nature of the latest builds of rgdal - you need to let us know what versions you are using. Also, view the definition of writeGDAL() to see how the lower level functions are used.

https://stat.ethz.ch/pipermail/r-sig-geo/2009-January/004830.html


I have read that message, but my version is not affected be the one
Roger refers to:

,----------------------------------
library(rgdal)
Loading required package: sp
Geospatial Data Abstraction Library extensions to R successfully loaded
Loaded GDAL runtime: GDAL 1.5.2, released 2008/05/29
GDAL_DATA: /usr/local/lib/R/site-library/rgdal/gdal
Loaded PROJ.4 runtime: Rel. 4.6.0, 21 Dec 2007
PROJ_LIB: /usr/local/lib/R/site-library/rgdal/proj
sessionInfo()
R version 2.7.1 (2008-06-23) i486-pc-linux-gnu
locale:
LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;\
LC_COLLATE=en_US.UTF-8;LC_MONETARY=C;LC_MESSAGES=en_US.UTF-8;\
LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;\
LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods
base
other attached packages:
[1] rgdal_0.5-33 sp_0.9-29
loaded via a namespace (and not attached):
[1] grid_2.7.1      lattice_0.17-20
`----------------------------------

BTW, you can simplify the writing of GTiffs with writeGDAL() -unless you are intending to develop your function to write to the file in smaller pieces. The code to do that can be as simple as this:


library(rgdal)
## read in matrix to bm
## . . .
## generate X/Y coordinates - assuming your matrix is aligned as image() expects (replace 0 and 1 as needed)
xx <- seq(0, length = nrow(bm), by = 1)
yy <- seq(0, length = ncol(bm), by = 1)
##
writeGDAL(image2Grid(list(x = xx, y = yy, z = bm))


That snipped brought my machine »to its knees« .. but that is
a problem of R itself (actually, I'm currently exploring).

But, your R function works for me for the following simple test. As Frank mentioned, it probably comes down to a version problem or a file size limit (although that seems unlikely since your input matrix "bm" must be completely loaded in memory).

 library(rgdal)
#Loading required package: sp
#Geospatial Data Abstraction Library extensions to R successfully loaded
#Loaded GDAL runtime: GDAL 1.6.0, released 2008/12/04
#Path to GDAL shared files: C:\inst\R\library/rgdal/gdal
#Loaded PROJ.4 runtime: Rel. 4.6.1, 21 August 2008
#Path to PROJ.4 shared files: C:\inst\R\library/rgdal/proj

data(volcano)  # matrix 87x61
bm.writeTiff(volcano, "volc.tif")
#         used (Mb) gc trigger (Mb) max used (Mb)
#Ncells 305831  8.2     597831   16   407500 10.9
#Vcells 149194  1.2     786432    6   467409  3.6
tst <- readGDAL("volc.tif")

#volc.tif has GDAL driver ltalk X6
#and has 87 rows and 61 columns


My image got dimension 8950 9790    7, could that dimension
be the problem?

Regards

  Henning


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

Reply via email to