求助:st_intersection仅返回相交线几何的部分内容
问题原因与解决方案
问题根源
你用st_intersection(line_df, st_buffer(point, .1))得到裁剪后的线段,核心原因是对st_intersection的用途理解偏差:这个函数的作用是返回两个几何对象的重叠区域。你用了仅0.1单位的极小缓冲区,它只会截取道路和这个小缓冲区重合的局部片段,而非整条与点相交的道路。
解决方案
要提取与目标点相交的完整道路段,应该用空间筛选类方法,而非交集运算。以下是两种可行实现方式:
方法1:使用st_filter直接筛选
st_filter会保留符合空间关系的完整几何对象,不会截取交集部分:
# 筛选与点相交的完整道路 sin_test <- line_df %>% st_filter(point, .predicate = st_intersects) %>% select(id) plot(sin_test) # 现在会显示完整的道路段
方法2:通过空间关系索引提取
用st_intersects生成布尔判断结果,以此筛选目标道路:
# 判断道路是否与点相交 intersect_flag <- st_intersects(line_df, point, sparse = FALSE)[, 1] # 提取完整道路 sin_test <- line_df[intersect_flag, ] %>% select(id) plot(sin_test)
完整工作流程示例
结合你最初的500米缓冲区需求,完整流程如下:
# 1. 创建500米缓冲区 buffer_500 <- st_buffer(point, 500) # 2. 裁剪道路到缓冲区范围内 clipped_roads <- st_intersection(line_df, buffer_500) # 3. 筛选出与点相交的完整道路段 target_road <- clipped_roads %>% st_filter(point, .predicate = st_intersects) # 4. 计算弯曲度(道路实际长度 / 起点到终点的直线距离) sinuosity <- as.numeric(st_length(target_road)) / as.numeric(st_distance(st_startpoint(target_road), st_endpoint(target_road)))
内容的提问来源于stack exchange,提问作者Chad Apol
相关产品推荐
相关产品推荐

