R中st_intersection无法识别线图层与派生随机点图层的交集问题
问题原因与解决办法
核心问题:坐标顺序颠倒
你在将st_sample生成的点转换为sf对象时,错误地颠倒了坐标的对应关系:
st_sample返回的点坐标顺序和原线图层一致,是**(utme, utmn)**(对应X1=utme,X2=utmn)- 但你代码里把
X1重命名为utmn,X2重命名为utme,直接导致所有随机点的坐标被反转,位置完全偏离原线图层,自然无法检测到交集。
修正后的代码
library(sf) library(tidyverse) # 创建点数据框 data <- data.frame( utme = c(294118.5, 294930.8, 333526.0, 334487.1, 317332.2, 288261.3), utmn = c(4951635, 4952285, 4975957, 4976818, 4967509, 4945264), id = c(1,1,2,2,3,3) ) # 转换为线图层 lines <- data %>% st_as_sf(coords = c("utme", "utmn"), na.fail = FALSE, crs = "epsg:26920") %>% group_by(id) %>% summarize() %>% st_cast("LINESTRING") # 沿线路随机采样点 random_points <- st_sample(lines, size = 800) # 转换为sf点对象(修正坐标对应关系) random_points <- do.call(rbind, random_points) %>% data.frame() %>% dplyr::rename(utme = X1, utmn = X2) %>% # 修正命名顺序 st_as_sf(coords = c("utme", "utmn"), crs = "epsg:26920") # 执行交集操作 intersection <- st_intersection(random_points, lines) # 验证结果 nrow(intersection) # 此时会返回800,所有点都能匹配到对应线路
额外优化建议
其实不需要手动拆分rbind再重命名,st_sample返回的是sfc_POINT类型的对象,可以直接转换为sf数据框,更简洁且不易出错:
random_points <- st_sf(geometry = random_points, crs = st_crs(lines))
内容的提问来源于stack exchange,提问作者Chad Apol
相关产品推荐
相关产品推荐

