从栅格计算缓冲区内的线密度

Calculate line density within a buffer from a raster

有没有办法计算空间线周围缓冲区内的道路密度 (km/km²)?道路由栅格中的像素(1 像素 = 625 平方米)表示。于是我开始使用函数rasterToContour(package raster)将道路像素转换成折线。然后,我正在考虑计算缓冲区内的线路总长度(以公里为单位)和缓冲区(以平方公里为单位)。

r <- raster(rast_path)
x <- rasterToContour(r)

这是一个可重现的例子:

## To create raster:
library(raster)
library(rgeos)
r <- raster(ncols=90, nrows=50)
values(r) <- sample(1:10, ncell(r), replace=TRUE)

## Road raster
r[r[] < 10] <- 0
r[r[] >= 10] <- 1
plot(r)

## To create spatial lines 
line1 <- rbind(c(-125,0), c(0,60))
line2 <- rbind(c(0,60), c(40,5))
line3 <- rbind(c(40,5), c(15,-45))
line1_sp <- spLines(line1)
line2_sp <- spLines(line2)
line3_sp <- spLines(line3)

## To create buffer around lines
line2_buff <- gBuffer(line2_sp, width=20)
plot(line2_sp,add=T)
plot(line2_buff,add=T)

您要获取直线和多边形之间的交点的函数是 gIntersection(请参阅此 link http://robinlovelace.net/r/2014/07/29/clipping-with-r.html)。但是,如果您对穿过缓冲区的道路的边界求和,您将计算道路长度的两倍(道路的左侧 + 右侧)。

问题是将栅格转换为道路图(线)不如将其转换为多边形(您将使用 rasterToContour 获得的内容)那么简单。转换为多边形不会给您想要的结果(如前所述)。因此,您将不得不手动完成或投入一些额外的时间进行编码(搜索 "skeletonizing raster",例如 Identify a linear feature on a raster map and return a linear shape object using R)。

我认为通常的方法是在区域基础上工作 (km2/km2),您可以在光栅格式上很容易地做到这一点。如果你的分辨率足够好,你可以稍后做(道路面积)/(道路平均宽度)/(缓冲区)来尝试将值近似为km/km2。

您正在寻找道路长度(公里)除以缓冲区面积(平方公里),对吗?要计算道路长度,您可以将您的方法与 rasterToContour() 结合使用,尽管这在您提供的示例中无法重现。

但是要计算以平方公里为单位的缓冲区面积,您可以执行以下操作:n <- length(extract(r, line2_buff)) 以获得缓冲区中的 n 个像素,每个像素为 625 m^2。您需要的换算系数是 1 km^2 = 1,000,000 m^2。总之,以 km^2 为单位的缓冲区面积由下式给出:

length(extract(r, line2_buff)) * 625 / 1000000