You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R语言的terra/sf包生成最近要素距离栅格?

基于terra/sf生成到最近道路的距离栅格

问题描述

我有一个由线(道路)组成的simple feature对象,想要生成一个栅格,其中每个单元格代表到最近线的距离(即到最近道路的距离)。测试用多线sf对象代码如下:

library(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多线字符串对象
mls <- st_multilinestring(list(s1,s2,s3))

已知starsExtra有对应实现方案,但因实际数据量庞大,希望仅使用terra或sf包生态(已在项目中使用,减少额外依赖)替代starsExtra::dist_to_nearest。

解决方案

方法1:使用terra包(高效适配大数据量)

terra的distance()函数原生支持栅格到矢量要素的最近距离计算,底层优化较好,适合处理大规模数据。

library(sf)
library(terra)

# 将sf多线对象转换为terra矢量格式
v <- vect(mls)

# 创建覆盖要素范围的空栅格,设置分辨率为0.01
ext <- ext(v)
r <- rast(ext, res = 0.01, crs = crs(v))

# 计算每个栅格单元到最近线的距离
dist_rast <- distance(r, v)

# 可视化结果
plot(dist_rast, breaks = "equal", axes = TRUE)
lines(v, col = "red")

方法2:纯sf生态实现(适合小数据量场景)

如果依赖严格限制为sf,可以通过生成栅格中心点、计算点到线的距离,再转换为栅格的方式实现,大数据量下效率低于terra。

library(sf)

# 创建覆盖要素边界的栅格中心点网格
bbox <- st_bbox(mls)
grid_centers <- st_make_grid(
  x = bbox,
  cellsize = 0.01,
  what = "centers"
) %>% st_sfc() %>% st_sf()

# 计算每个中心点到最近线的距离
grid_centers$distance <- st_distance(grid_centers, st_sfc(mls), by_element = TRUE)

# 将点数据转换为栅格(借助terra完成格式转换)
library(terra)
dist_rast <- rast(grid_centers, type = "distance")

# 可视化
plot(dist_rast, breaks = "equal", axes = TRUE)
plot(st_geometry(mls), add = TRUE, col = "red")

内容的提问来源于stack exchange,提问作者André.B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:21:29