R语言sf包rbind合并shapefile后无法生成正确多边形问题
目标
制作韦尔梅耶海岸(Vermeille Coast)地图,用于计算两个采样点之间不穿越陆地的路径距离。
规划实现步骤
- 获取两份海岸shapefile数据
- 拼接两个MULTILINESTRING/LINESTRING线要素
- 基于拼接后的线要素生成对应闭合多边形
操作过程与问题
线要素合并
首先读取两份海岸数据,使用rbind直接合并,代码如下:
frenchCoast_CoteBanyuls <- st_read("coasts_subnational/coasts_subnational.shp") spainCoast_CoteBanyuls <- st_read("coasts_subnational SPAIN/coasts_subnational.shp") combined_coast <- rbind(spainCoast_CoteBanyuls, frenchCoast_CoteBanyuls) plot(combined_coast$geometry)
运行后绘图显示拼接后的海岸线要素显示正常,结果如下:
合并后多边形生成失败
基于合并后的线要素,尝试用边界框切割提取陆地区域多边形,代码如下:
bbox_combined_coast <- st_bbox(combined_coast) %>% st_as_sfc() polygon_combined_coast <- bbox_combined_coast %>% lwgeom::st_split(combined_coast) %>% st_collection_extract("POLYGON") par(mfrow = c(2,4), mar = c(0,0,0,0)) for(i in 1:8){ plot(polygon_combined_coast[i], col = 'steelblue') }
运行后共提取出8个多边形,无任何一个与拼接后的海岸轮廓匹配,结果不符合预期:
单文件多边形生成对照测试
对两份原始shapefile单独执行完全相同的多边形生成操作,代码如下:
par(mfrow = c(1,2), mar = c(0,0,0,0)) bbox_frenchCoast_CoteBanyuls <- st_bbox(frenchCoast_CoteBanyuls) %>% st_as_sfc() polygon_frenchCoast_CoteBanyuls <- bbox_frenchCoast_CoteBanyuls %>% lwgeom::st_split(frenchCoast_CoteBanyuls) %>% st_collection_extract("POLYGON") plot(polygon_frenchCoast_CoteBanyuls[1], col = 'steelblue') bbox_spainCoast_CoteBanyuls <- st_bbox(spainCoast_CoteBanyuls) %>% st_as_sfc() polygon_spainCoast_CoteBanyuls <- bbox_spainCoast_CoteBanyuls %>% lwgeom::st_split(spainCoast_CoteBanyuls) %>% st_collection_extract("POLYGON") plot(polygon_spainCoast_CoteBanyuls[3], col = 'steelblue')
运行得到的两个多边形均与单份shapefile对应的海岸轮廓完全匹配,结果正确:
目前判断rbind合并两个shapefile的过程存在非预期问题,需要定位错误原因,获取可行解决方案。
内容的提问来源于stack exchange,提问作者CharlotteS.
相关产品推荐
相关产品推荐

