st_network_blend未包含全部点,如何实现所有点与网络融合?
解决st_network_blend融合点与网络时部分点丢失的问题
可能的原因及对应解决方案
1. 检查并统一CRS
CRS不匹配会导致距离计算失真,点可能被误判为离网络过远而丢弃。
# 验证网络与点数据的CRS是否一致 all.equal(st_crs(Riv), st_crs(df)) # 若不一致,将点数据转换为网络的CRS if (!all.equal(st_crs(Riv), st_crs(df))) { df <- st_transform(df, st_crs(Riv)) }
2. 显式设置最大融合距离
st_network_blend默认会过滤掉距离所有网络边过远的点,通过max_dist参数设置一个足够覆盖所有点的距离值(数值单位需匹配数据的CRS,比如米、度等):
library(sfnetworks) # 注意as_sfnetwork属于sfnetworks包 net <- as_sfnetwork(Riv) |> st_network_blend(df, max_dist = 500) # 示例值,根据你的数据实际调整
3. 可视化排查丢失点的位置
先定位丢失的点,直观查看它们与网络的空间关系,确认是否在网络覆盖范围外:
# 筛选出丢失的38、120号点 missing_points <- df[df$N %in% c(38, 120), ] # 绘图查看 plot(st_geometry(Riv), col = "lightgray", main = "丢失点与网络位置") plot(st_geometry(missing_points), col = "red", pch = 19, cex = 1.5, add = TRUE)
4. 强制保留所有点(含孤立节点)
如果需要强制保留所有点,哪怕是离网络极远的点,可以先将这些点作为孤立节点添加到网络中,再完成融合:
# 将丢失的点转为独立的sfnetwork missing_net <- as_sfnetwork(missing_points, directed = FALSE) # 合并原网络与丢失点网络 base_net <- net_combine(as_sfnetwork(Riv), missing_net) # 融合剩余的点 final_net <- base_net |> st_network_blend(df[!df$N %in% c(38, 120), ])
内容的提问来源于stack exchange,提问作者C. Guff
相关产品推荐
相关产品推荐

