You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:07:48