如何使用terra/sf R软件包创建到最近要素的距离栅格?

hgtggwj0  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(127)

我有一个由线(道路)组成的简单要素对象,我想从中创建一个栅格,每个单元代表到最近的线的距离。在我的例子中,栅格与最近的道路的距离。
下面是一个简单的多行sf对象:

library(sf)

#Code for multi-line string creation in sf
s1 <- rbind(c(0,3),c(0,4),c(1,5),c(2,5))
s2 <- rbind(c(0.2,3), c(0.2,4), c(1,4.8), c(2,4.8))
s3 <- rbind(c(0,4.4), c(0.6,5))

#sf multi-line string 
mls <- st_multilinestring(list(s1,s2,s3))

字符串
然而,我有额外的标准,我想留在terrasf生态系统中,因为我已经在使用这些生态系统,我试图限制我的依赖数量。我已经找到了a solution using starsExtra,但我怀疑这个问题在terrasf中是完全可能的,它可能会更有效一点,因为我的实际多线对象是巨大的。
以下是starsExtra解决方案:

library(sf)
library(stars)
library(starsExtra)

# Make grid
r <- make_grid(mls, res = 0.01)
d <- dist_to_nearest(r, mls, progress = FALSE)

# Plot
plot(d, breaks = "equal", axes = TRUE, reset = FALSE)
plot(st_geometry(mls), add = TRUE)


sfterra中有starsExtra::dist_to_nearest的同义词吗?或者有其他方法来完成同样的事情吗?

c86crjj0

c86crjj01#

下面是使用Terra实现这一点的方法

s1 <- rbind(c(0,3),c(0,4),c(1,5),c(2,5))
s2 <- rbind(c(0.2,3), c(0.2,4), c(1,4.8), c(2,4.8))
s3 <- rbind(c(0,4.4), c(0.6,5))

library(terra)
v <- vect(list(s1,s2,s3), "lines", crs="local") |> aggregate()

r <- rast(v, res = 0.01)
r <- rasterize(v, r)
d <- distance(r)

plot(d)
lines(v, col="blue", lwd=2, xpd=TRUE)

字符串
x1c 0d1x的数据
在经度/纬度栅格上计算距离比在平面栅格上慢得多。所以如果你有一个大的经度/纬度栅格,你可以考虑先把它投影到平面CRS上。

相关问题