使用sf与ggplot2识别并绘制两个shapefile的差异
新旧市政边界差异可视化方案
直接给你一套能整合所有差异到单张图的实操步骤,用R的sf包就能搞定:
1. 先搞定数据基础
读入两个shapefile,必须先统一坐标系,不然所有空间运算都白搭:
library(sf) # 替换成你的文件路径 old_shp <- st_read("old_municipalities.shp") new_shp <- st_read("new_municipalities.shp") # 把新图层转成和旧图层一致的坐标系 new_shp <- st_transform(new_shp, st_crs(old_shp))
2. 转成边界线(关键)
因为你要展示的是边界变化而非填充区域,所以把多边形转成线要素:
old_lines <- st_cast(old_shp, "MULTILINESTRING") new_lines <- st_cast(new_shp, "MULTILINESTRING")
3. 拆分三类边界
用空间运算把边界拆成你需要的三类:
# 未变化的边界(新旧图层共有的部分) unchanged <- st_intersection(old_lines, new_lines) # 已移除的边界(旧图层有、新图层已删除的部分) removed <- st_difference(old_lines, new_lines) # 新增的边界(新图层有、旧图层没有的部分) added <- st_difference(new_lines, old_lines)
4. 画图整合
用ggplot2分层绘制,注意层级顺序(先画不变的,再画移除的,最后画新增的):
library(ggplot2) # 过滤空几何对象,避免绘图报错 removed <- st_filter(removed, !st_is_empty(removed)) added <- st_filter(added, !st_is_empty(added)) ggplot() + # 未变化边界:黑色 geom_sf(data = unchanged, color = "black", linewidth = 1) + # 已移除边界:蓝色 geom_sf(data = removed, color = "blue", linewidth = 1) + # 新增边界:红色 geom_sf(data = added, color = "red", linewidth = 1) + theme_minimal() + labs(title = "市政边界变化对比", caption = "黑色=未变化 | 蓝色=已移除 | 红色=新增")
额外优化技巧
- 如果出现细碎重复的线段,用
st_union()合并:unchanged <- st_union(unchanged) removed <- st_union(removed) added <- st_union(added) - 要是想同时展示区域填充效果,保留原始多边形图层:给未变化区域填充浅灰,移除区域填充蓝灰色,新增区域填充红灰色,再叠加上面的边界线即可。
内容的提问来源于stack exchange,提问作者iunda
相关产品推荐
相关产品推荐

