按单元格编号勾画栅格单元的轮廓线

5

如果我有一个绘图中的单元格编号,我希望能够勾勒出该栅格单元。我制作了一个简化的示例,使用PowerPoint制作,但可能会更难以处理(720 x 360 vs 3 x 5)。 生成样本数据的方法如下:

library(raster)
x = raster(matrix(seq(1,15), nrow = 3))
plot(x)

我希望可以对plot命令进行修改,使得当我选择第5个单元格时,结果类似于下图: enter image description here
2个回答

5

这里有一个通用的方法,我们根据感兴趣单元格的行和列绘制一个extent

library(raster)
r <- raster(matrix(1:15, nrow=3))
plot(r)
rc <- rowColFromCell(r, 5)
plot(extent(r, rc[1], rc[1], rc[2],  rc[2]), add=TRUE, col='red', lwd=3)

fig1

extent函数的第二到第四个参数决定了用于计算extent的行(参数2和3)和列(参数4和5)的跨度。

如果我们想要突出显示单元格3、4、8和9,我们可以这样做:

plot(r)
rc <- rowColFromCell(r, c(3, 4, 8, 9))
plot(extent(r, min(rc[, 1]), max(rc[, 1]), 
            min(rc[, 2]),  max(rc[, 2])), add=TRUE, col='red', lwd=3)

fig2

对于连续单元格周围的矩形范围,这样做很好用。如果您想要概述任意选择的单元格,则可以考虑使用rasterToPolygons。例如,对于单元格2、8、9、11和14:

plot(r)
r2 <- r
r2[setdiff(seq_len(ncell(r2)), c(2, 8, 9, 11, 14))] <- NA
r2[!is.na(r2)] <- 1
plot(rasterToPolygons(r2, dissolve=TRUE), add=TRUE, border='red', lwd=2)

在这里,我们创建了光栅的一个副本,将所有其他单元格设置为NA,然后将焦点单元格设置为一个公共值(在这种情况下为1)。然后,rasterToPolygons将非NA单元格转换为多边形,并根据需要合并接触的多边形。 fig3

2
这段代码应该能够满足你的需求。
plot(raster(matrix(seq(1,15), nrow = 3)))

gridx = 5
gridy = 3
dx = 1/gridx #resolution of the grid 
dy = 1/gridy

# if you want to specify the cell number (cell 1 is bottom left):

cell = 15
ny = floor(cell/gridx - dx)+1
nx = cell-gridx*(ny-1)

# if you want to give cell positions, just edit nx, ny

x1 = c(nx-1,nx-1,nx-1,nx)*dx
y1 = c(ny-1,ny,ny-1,ny-1)*dy
x2 = c(nx,nx,nx-1,nx)*dx
y2 = c(ny-1,ny,ny,ny)*dy

segments(x1,y1,x2,y2,col=2,lwd=2)

谢谢 - 通过单元格编号并不完全行得通 - 但是很容易根据单元格编号确定行和列(nx和ny)的值。 - Sarah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接