如何用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
相关产品推荐
相关产品推荐

