An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-sig-geo/attachments/20090123/953a9893/attachment.pl>
Coercing multiband readGDAL objects to a matrix/vector...
3 messages · Jonathan Greenberg, Michael Sumner
Michael:
Thank you for your prompt reply -- if I wanted to extract multiple
bands in a single call, how would I do that? I suppose I could do it
with a for-next loop, but it seems there is probably some simple way of
doing this:
as.matrix(x[1:3]) (doesn't work, but the idea is I want bands 1-3 in this matrix).
--j
Michael Sumner wrote:
Hello, You can use either as.imageSpatialGridDataFrame(x[1]) or as.matrix(x[1]), where "x" is a SpatialGridDataFrame or SpatialPixelsDataFrame. The "1" index assumes you want the first band, replace as appropriate. The first gives you a list with x, y, z components in the convention expected by image(), so as.imageSpatialGridDataFrame(x[1])$z is the matrix. The second returns the matrix directly but in a different orientation. HTH Regards, Mike. ==============Original message text=============== On Fri, 23 Jan 2009 8:59:02 +1100 Jonathan Greenberg wrote: I was hoping I could get some info on how to coerce the type of object readGDAL produces, assuming its a multiband object, into an R matrix (I just want the raster values in the matrix)? Thanks! --j
Can you provide more detail as to what you mean?
If you want more than one band in the matrix you'll need to pre-allocate
the result and use sub-indexing into that matrix (2D).
In one step you could access the bands from the Spatial*DataFrame
directly as columns/vectors, but you'd have to handle the orientation
specially.
Perhaps you actually want the 3 bands as a 3D array?
Here's an example of that.
library(sp)
data(meuse.grid)
m = SpatialPixelsDataFrame(points = meuse.grid[c("x", "y")], data =
meuse.grid)
dimXY <- getGridTopology(m)@cells.dim ## the X/Y dimensions of the result
## the 3D result
result <- array(NA, c(dimXY, 3))
## slot each band matrix into the 3D array
for (i in 1:3) {
result[,,i] <- as.image.SpatialGridDataFrame(m[i])$z
}
## check the result
image(result[,,1])
image(result[,,2])
image(result[,,3])
Regards, Mike.
Jonathan Greenberg wrote:
Michael: Thank you for your prompt reply -- if I wanted to extract multiple bands in a single call, how would I do that? I suppose I could do it with a for-next loop, but it seems there is probably some simple way of doing this: as.matrix(x[1:3]) (doesn't work, but the idea is I want bands 1-3 in this matrix). --j Michael Sumner wrote:
Hello, You can use either as.imageSpatialGridDataFrame(x[1]) or as.matrix(x[1]), where "x" is a SpatialGridDataFrame or SpatialPixelsDataFrame. The "1" index assumes you want the first band, replace as appropriate. The first gives you a list with x, y, z components in the convention expected by image(), so as.imageSpatialGridDataFrame(x[1])$z is the matrix. The second returns the matrix directly but in a different orientation. HTH Regards, Mike. ==============Original message text=============== On Fri, 23 Jan 2009 8:59:02 +1100 Jonathan Greenberg wrote: I was hoping I could get some info on how to coerce the type of object readGDAL produces, assuming its a multiband object, into an R matrix (I just want the raster values in the matrix)? Thanks! --j
------------------------------------------------------------------------ No virus found in this incoming message. Checked by AVG - http://www.avg.com Version: 8.0.176 / Virus Database: 270.10.12/1910 - Release Date: 22/01/2009 6:28 PM