[R-sig-Geo] Converting array into raster brick

Robert J. Hijmans r.hijmans at gmail.com
Sun Dec 19 17:06:21 CET 2010


Agus,

I have added an new method for 'brick', included below

library(raster)
# new method, included in raster 1.7-17
setMethod('brick', signature(x='array'),
	function(x, xmn=0, xmx=1, ymn=0, ymx=1, crs=NA) {
		dm <- dim(x)
		if (length(dm) != 3) {
			stop('array has wrong dimensions')
		}
		b <- brick(xmn=xmn, xmx=xmx, ymn=ymn, ymx=ymx, crs=crs)
		dim(b) <- dm
		setValues(b, matrix(sapply(x, as.vector), ncol=dm[3]))
	}
)

r = raster(nrow=5, ncol=5)
r[] = 1:25
s = stack(r,r*2,r*3)

a = as.array(s)
b = brick(a)
# values of b are the same as those of a
sum(getValues(s) != getValues(b))

Best, Robert
On Sun, Dec 19, 2010 at 3:20 AM, Agustin Lobo <alobolistas at gmail.com> wrote:
> Robert,
>
> Converting from a regular 3D array to brick is probably going to be
> quite a  common operation,
> perhaps you could consider a simpler syntax in the future, i,e:
>
> r = as.brick(x)
>
> where x would be a 3D array?
>
> Agus
>
> 2010/12/16 Robert J. Hijmans <r.hijmans at gmail.com>:
>> Christian,
>>
>> Could be quicker if you make a matrix out of the array (or, if
>> possible, avoid the array in the first place). See below
>>
>> library(raster)
>>
>> # create an array
>> m <- matrix(1:100, ncol=10, byrow=TRUE)
>> a <- array(list(m, m, m, m, m))
>>
>> # empty RasterBrick
>> x <- brick(ncol=10, nrow=10)
>>
>> # make matrix from array
>> v <- sapply(a, function(x) as.vector(t(x)))
>>
>> x <- setValues(x, v)
>> plot(x)
>>
>>
>> Best, Robert
>>
>> On Thu, Dec 16, 2010 at 12:26 PM,  <christian.kamenik at giub.unibe.ch> wrote:
>>> Dear all,
>>>
>>> I needed to convert an array into a RasterBrick object. The output did not
>>> need to be written to memory, as assessed by canProcessInMemory(). The only
>>> way to put the data into the RasterBrick that worked for me was layer by
>>> layer:
>>>
>>> for (l in 1:nlayers(x)) x
>>> <-setValues(x,values=as.vector(t(xx[,,l])),layer=l)
>>>
>>> This was quite complicated and slow. So I am wondering if there is a better
>>> way of doing this.
>>>
>>> Many thanks, Christian
>>>
>>> _______________________________________________
>>> R-sig-Geo mailing list
>>> R-sig-Geo at r-project.org
>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>>
>>
>> _______________________________________________
>> R-sig-Geo mailing list
>> R-sig-Geo at r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>
>



More information about the R-sig-Geo mailing list