R sf包合并LINESTRING/MULTILINESTRING线要素失败排查
LINESTRING海岸要素合并异常解决方案
问题复现
需求为合并两段LINESTRING类型的海岸矢量要素(西班牙海岸段、法国巴纽尔斯海岸段),生成完整的连续海岸地图。
初始数据导入与初步叠加绘图代码如下,单段显示、叠加校验均正常:
frenchCoast_CoteBanyuls <- st_read("coasts_subnational/coasts_subnational.shp") %>% st_geometry() plot(frenchCoast_CoteBanyuls) spainCoast_CoteBanyuls <- st_read("coasts_subnational SPAIN/coasts_subnational.shp")%>% st_geometry() spainCoast_CoteBanyuls <- st_cast(x = spainCoast_CoteBanyuls, to = "LINESTRING") plot(spainCoast_CoteBanyuls, add = T)
先后尝试c()、rbind()、st_union()、bind()等方法做要素合并,测试代码如下:
CoteBanyuls_c <- c(frenchCoast_CoteBanyuls, spainCoast_CoteBanyuls) # CoteBanyuls_rbind <- rbind(frenchCoast_CoteBanyuls, spainCoast_CoteBanyuls) # CoteBanyuls <- st_union(CoteBanyuls) # CoteBanyuls <- union(CoteBanyuls) # CoteBanyuls <- bind(CoteBanyuls) plot(CoteBanyuls)
合并结果异常:
c()生成的空间要素维度不符合预期- 其余方法输出的对象绘图时仅显示西班牙海岸段,无法展示完整的两段海岸轮廓
失效原因
c()直接拼接sfc几何对象时不会自动做几何类型、坐标系一致性校验,会生成混合几何类型的GEOMETRY集合,因此维度不符合预期。- 其余方法仅显示单段要素的核心原因:
- 几何类型不统一:仅对西班牙段数据做了
st_cast转LINESTRING操作,法国段读取后未做同类型转换,默认是MULTILINESTRING类型,跨几何类型合并时会出现要素兼容性问题导致丢失。 - 坐标系(CRS)不匹配:两份shapefile若未做坐标系统一,合并时默认采用第一个输入对象的坐标系,另一部分要素会因坐标参考偏差偏移到绘图视窗范围外,视觉上呈现为仅显示单段要素。
- 几何类型不统一:仅对西班牙段数据做了
修复代码
library(sf) library(dplyr) # 读取原始数据 frenchCoast <- st_read("coasts_subnational/coasts_subnational.shp") spainCoast <- st_read("coasts_subnational SPAIN/coasts_subnational.shp") # 统一几何类型为LINESTRING,统一坐标系(以法国段CRS为基准) frenchCoast_line <- frenchCoast %>% st_geometry() %>% st_cast("LINESTRING") spainCoast_line <- spainCoast %>% st_geometry() %>% st_cast("LINESTRING") %>% st_transform(st_crs(frenchCoast_line)) # 强制坐标系对齐 # 合并生成标准sfc矢量对象 CoteBanyuls <- c(frenchCoast_line, spainCoast_line) %>% st_sfc(crs = st_crs(frenchCoast_line)) # 如需将相邻端点拼接为单条连续LINESTRING,可追加执行以下代码 # CoteBanyuls <- CoteBanyuls %>% st_line_merge() # 验证绘图 plot(CoteBanyuls)
排错提示:若执行上述代码后仍仅显示单段要素,可分别运行
st_bbox(frenchCoast_line)、st_bbox(spainCoast_line)查看两个要素的边界范围,若两者坐标量级差超过10倍,说明其中一份数据的坐标系定义错误,需先给对应数据设置正确CRS后再做转换合并。
内容的提问来源于stack exchange,提问作者CharlotteS.
相关产品推荐
相关产品推荐

