从Raster对象获取XYZ列表

时间:2017-07-24 21:22:34

标签: r raster r-raster

我知道从XYZ列表获取光栅(其中x和y是coords的数字向量,z是数字矩阵)我可以直接使用函数raster。但是,如果我有一个光栅并且我想得到一个XYZ列表怎么办?是否已在光栅包上开发了一个简单的函数?

当然,我知道我可以建立一个索引光栅对象上不同级别的列表,但我发现我必须做一些反转来实现它,所以我想知道是否有一种简单有效的方法

感谢。

3 个答案:

答案 0 :(得分:4)

您可以考虑使用rasterToPoints

library(raster)
r <- raster()
values(r) <- 1:ncell(r)

xyz <- rasterToPoints(r)

head(xyz)
           x    y layer
#[1,] -179.5 89.5     1
#[2,] -178.5 89.5     2
#[3,] -177.5 89.5     3
#[4,] -176.5 89.5     4
#[5,] -175.5 89.5     5
#[6,] -174.5 89.5     6

但请注意,该函数仅返回非NA的单元格的值 而且这会返回一个矩阵;不是清单。但这可能更实际。否则请参阅@ Val的解决方案...

答案 1 :(得分:2)

有几种方法可以做到这一点,但这对我来说似乎很直接:

基本上,您使用xyFromCell包中的函数raster来获取单元格的坐标,然后将它们绑定到您想要的列表。

library(raster)

# testraster
r <- raster()
r[] <- runif(ncell(r))

#coordinates
coords <- xyFromCell(r,1:ncell(r))

#create list
xyzlist <- list(x=coords[,'x'],y=coords[,'y'],z=as.matrix(r))

这给了你:

> str(xyzlist)
List of 3
 $ x: num [1:64800] -180 -178 -178 -176 -176 ...
 $ y: num [1:64800] 89.5 89.5 89.5 89.5 89.5 89.5 89.5 89.5 89.5 89.5 ...
 $ z: num [1:180, 1:360] 0.786 0.867 0.0361 0.0605 0.7276 ...

答案 2 :(得分:0)

我尝试了上述建议,但没有得到答案。所以,这是一个小调整和测试它的工作原理:

library(raster) 
xy <- xyFromCell(dem,1:ncell(dem))

lns <- contourLines(x=sort(unique(xy[,1])), y=sort(unique(xy[,2])), z=t(as.matrix(dem)))

plot(dem)
for (i in 1:length(lns)) lines(lns[[i]]$x, lns[[i]]$y)