R运行lixelize_lines处理路网时coordinates行数不匹配报错如何解决
问题原因
这个报错是由输入道路网络的几何数据异常导致的,lixelize_lines要求输入为仅包含二维LINESTRING类型的sf对象,你导入的GPKG数据大概率存在以下几类问题:
- 同时存在二维线(XY坐标,2列坐标值)和三维/四维线(带Z高程/M测量值,3/4列坐标值),导致
coordinates函数计算时行列数不匹配 - 混合了
MULTILINESTRING多段线和普通LINESTRING单段线 - 包含零长度线段、自相交等无效几何
修复步骤
- 第一步:统一坐标维度,移除多余的Z/M维度
library(sf) library(dplyr) # 移除坐标中的Z和M维度,统一为二维XY线 mtl_2008network_clean <- st_zm(mtl_2008network, drop = TRUE, what = "ZM")
- 第二步:拆分多段线为单段线
# 检查几何类型,如果存在MULTILINESTRING则拆分 geom_types <- table(st_geometry_type(mtl_2008network_clean, by_geometry = TRUE)) if ("MULTILINESTRING" %in% names(geom_types)) { mtl_2008network_clean <- st_cast(mtl_2008network_clean, "LINESTRING") }
- 第三步:修复无效几何,过滤零长度线段
# 修复无效几何 mtl_2008network_clean <- st_make_valid(mtl_2008network_clean) # 过滤长度大于0的线段 mtl_2008network_clean <- mtl_2008network_clean %>% filter(st_length(.) > units::set_units(0, "m"))
- 第四步:重新运行lixelize代码
lixels2008 <- lixelize_lines(mtl_2008network_clean, 150, mindist = 50)
附加说明
清理完成后同步生成的50+警告也会一并消失,如果仍有警告可运行warnings()查看具体内容,大概率是剩余长度不足150m的短线段自动跳过的提示,属于正常逻辑。
内容的提问来源于stack exchange,提问作者ge jin
相关产品推荐
相关产品推荐

