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

如何计算德国邮编区在各选区的面积占比?sf包技术求助

解决方案

步骤1:计算每个邮编区的总面积

先单独算出每个邮编区的完整面积,后续用来计算占比:

# 计算邮编区总面积,保留邮编标识列(替换成你实际的邮编列名,比如plz)
plz_total_area <- shape_PLZ %>%
  mutate(total_area = st_area(.)) %>%
  st_drop_geometry() %>%  # 去掉几何列,只保留属性数据
  select(plz, total_area)

步骤2:计算交集区域并关联总面积

用st_intersection得到所有重叠区域后,关联邮编区的总面积,计算占比:

# 计算交集并生成占比数据
overlap_data <- st_intersection(shape_wahl, shape_PLZ) %>%
  mutate(overlap_area = st_area(.)) %>%  # 计算交集区域面积
  st_drop_geometry() %>%  # 移除几何列,转为普通数据框
  # 关联邮编区总面积,替换成对应的列名
  left_join(plz_total_area, by = "plz") %>%
  # 计算占比,保留两位小数
  mutate(percentage = as.numeric(overlap_area / total_area * 100) %>% round(2)) %>%
  # 筛选需要的列:邮编、选区、占比(替换成你实际的选区列名,比如wahlkreis)
  select(plz, wahlkreis, percentage)

步骤3:验证结果

运行后overlap_data就是你需要的表格:完全包含的邮编区会显示percentage = 100,跨选区的邮编区会按实际占比分条展示。


解决绘图全红的问题

你当前的代码把所有交集区域(包括完全被选区包含的邮编区)都填充红色,所以全图变红。如果只想突出显示跨多个选区的邮编区部分,可以过滤出占比不等于100%的交集区域来绘制:

pi <- st_intersection(shape_wahl, shape_PLZ) %>%
  mutate(overlap_area = st_area(.)) %>%
  left_join(plz_total_area, by = "plz") %>%
  mutate(percentage = as.numeric(overlap_area / total_area * 100)) %>%
  filter(percentage != 100)  # 只保留非完全包含的区域

ggplot() +
  geom_sf(data = shape_PLZ, aes(fill = category), color = "lightgrey") +
  geom_sf(data = shape_wahl, color = "black", fill = NA)+
  geom_sf(data = pi, fill = "red", alpha = 0.7)  # 加透明度避免遮挡底层图形

注意事项

  • 替换代码中的plz和wahlkreis为你实际数据中的邮编列名和选区列名
  • st_area返回的是带单位的面积值,计算占比时单位会自动抵消,无需额外转换
  • 如果数据量很大,st_intersection运行较慢,可以先用st_simplify简化图形后再处理

内容的提问来源于stack exchange,提问作者mf_uni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:07:34