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

使用sf+ggplot绘制美国1900-1920年州界变化地图遇问题求助

解决美国历史州界变化区域可视化问题

问题原因

直接对分属两个时期的州要素集合调用st_difference会导致错误结果:因为每个1900年的州要素会被减去1920年所有州的要素,最终得到的是1900年每个州与1920年所有州不重叠的部分——这几乎涵盖了全部区域,因为州界调整后每个州的边界都存在细微差异,所以整个地图被蓝色覆盖。

修正方案

核心思路是先将两个时期的州界分别合并为单一的美国全域多边形,再通过对称差(st_sym_difference)提取两个时期的差异区域,最后叠加到1900年的底图上。

完整修正代码

library(tidyverse)
library(sf)
library(lubridate)

# 读取shapefile
states <- st_read("/US_HistStateTerr_Gen01_Shapefile/US_HistStateTerr_Gen01.shp") %>%
  rename_all(tolower)

# 筛选1900年和1920年的有效州界
state_map_1900 <- states %>% 
  filter(ymd(19000101) %within% interval(start_date, end_date))
state_map_1920 <- states %>% 
  filter(ymd(19201231) %within% interval(start_date, end_date))

# 合并每个时期的所有州为单一多边形(确保CRS一致)
us_1900_union <- state_map_1900 %>% 
  st_union() %>% 
  st_sf()  # 转换为sf对象以便后续处理
us_1920_union <- state_map_1920 %>% 
  st_union() %>% 
  st_sf()

# 计算两个时期的对称差异区域(即所有边界变化的部分)
map_change <- st_sym_difference(us_1900_union, us_1920_union)

# 绘图
ggplot() +
  # 1900年底图:白色填充,黑色边界
  geom_sf(data = state_map_1900, fill = "white", color = "black", linewidth = 0.2) +
  # 差异区域:蓝色填充,无边界
  geom_sf(data = map_change, fill = "blue", color = NA, alpha = 0.7) +
  labs(title = "1900-1920年美国州界变化区域", subtitle = "蓝色区域为边界调整部分") +
  theme_minimal() +
  theme(axis.text = element_blank(), axis.title = element_blank())

关键说明

  • st_union():将每个时期的所有州要素合并为一个整体,消除单个州要素的干扰,确保我们对比的是两个时期的全域边界。
  • st_sym_difference():提取两个多边形之间所有不重叠的区域,这正是我们需要的边界变化部分(既包括1900年有但1920年消失的区域,也包括1920年新增的区域)。
  • 增加alpha参数:让蓝色差异区域更柔和,避免完全覆盖底图的边界线。

内容的提问来源于stack exchange,提问作者匿名用户

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:33:18