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

5

有没有一种方法可以计算空间线周围缓冲区内的道路密度(km/km²)?这些道路由光栅中的像素表示(1像素=625平方米)。因此,我开始使用函数rasterToContour (包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)

4
重复问题:http://gis.stackexchange.com/questions/177869/calculate-line-density-within-a-buffer-in-r计算 R 中缓冲区内的线密度。 - Robert Hijmans
2个回答

5
您需要计算道路长度(公里)除以缓冲区面积(平方公里),对吗?要计算道路长度,您可以使用您提供的方法中的 rasterToContour(),但该方法在您提供的示例中无法重现。
但是,要计算缓冲区的面积(平方公里),您可以执行以下操作:n <- length(extract(r, line2_buff)) 以获取缓冲区中像素的数量 n,每个像素为625平方米。您需要的转换因子是1 km² = 1,000,000平方米。缓冲区的面积总和为:
length(extract(r, line2_buff)) * 625 / 1000000

非常感谢rsoren。特别是,我有一个问题需要计算道路长度(公里),因为函数rasterToContour()给出的道路边缘有左侧和右侧的边缘。我希望有一条穿过道路的线(即穿过道路像素中心的线)。 - Marine
你能不能直接除以2来计算一条边的长度? - rsoren
你如何区分缓冲区内部的道路和缓冲区边缘的道路?在一种情况下,你需要将其除以2,在另一种情况下则不行。 - Carlos Alberto

4
您要查找线和多边形之间的交点函数是gIntersection(请参见此链接http://robinlovelace.net/r/2014/07/29/clipping-with-r.html)。然而,如果将穿过缓冲区的道路边界相加,则会计算两次道路长度(道路左侧+右侧)。
问题在于将栅格转换为道路地图(线)不像将其转换为多边形(使用rasterToContour获得的结果)那样直接。而且转换为多边形不会给出您要查找的结果(如先前所述)。因此,您必须手动完成或投入一些额外的时间进行编码(例如搜索“骨架化栅格”Identify a linear feature on a raster map and return a linear shape object using R)。

我认为通常的做法是按区域(km2/km2)进行工作,你可以在栅格格式上很容易地完成它。如果你的分辨率足够好,你可以稍后尝试使用(道路面积)/(平均道路宽度)/(缓冲区面积)来近似计算值为 km/km2。


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