如何生成与原始LINESTRING等距的3个右侧副本(间距2.5)
生成LINESTRING右侧偏移副本的实现方案
需求描述
现有一段LINESTRING(代码示例如下),需要生成3个位于其右侧的副本,每个副本与原始LINESTRING的垂直间距依次为2.5、5、7.5(相邻副本间的间距也为2.5)。
原始代码
ID <- c(1:5) long <- c(1,2,3,5,7) lat <- c(1,4,6,8,9) a <- data.frame(cbind(ID, long, lat)) line <- a %>% st_as_sf(coords = c("long", "lat")) %>% dplyr::summarize(do_union=FALSE) %>% st_cast("LINESTRING")
实现步骤与代码
- 加载依赖包:需要
sf处理空间数据,lwgeom提供线偏移功能,dplyr用于数据整合
library(sf) library(lwgeom) library(dplyr)
- 生成偏移线:使用
lwgeom::st_offsetcurve()函数,正数距离表示向线的右侧偏移(方向由线的顶点顺序决定),依次生成三个不同偏移量的副本
# 生成三个右侧偏移副本,距离原始线分别为2.5、5、7.5 line_offset_2.5 <- st_offsetcurve(line, distance = 2.5) line_offset_5 <- st_offsetcurve(line, distance = 5) line_offset_7.5 <- st_offsetcurve(line, distance = 7.5)
- 整合所有线到一个SF对象:将原始线和偏移副本合并为单个空间数据框,方便后续查看与处理
# 构建带类型标识的线列表 line_list <- list( 原始线 = line, 偏移2.5 = line_offset_2.5, 偏移5 = line_offset_5, 偏移7.5 = line_offset_7.5 ) # 合并为统一的sf数据框 all_lines <- bind_rows( lapply(names(line_list), function(label) { st_sf(类型 = label, geometry = line_list[[label]]) }) )
- 可视化验证:直观查看原始线与偏移副本的位置关系
plot(all_lines$geometry, col = c("black", "red", "blue", "green"), lwd = 2, main = "原始线与右侧偏移副本") legend("topleft", legend = all_lines$类型, col = c("black", "red", "blue", "green"), lwd = 2)
注意事项
- 偏移方向由原始LINESTRING的顶点顺序决定,若偏移方向不符合预期,可通过
st_reverse(line)反转线的顶点顺序后再执行偏移 - 若未安装
lwgeom包,可通过install.packages("lwgeom")完成安装
内容的提问来源于stack exchange,提问作者BosBas
相关产品推荐
相关产品推荐

