如何计算德国邮编区在各选区的面积占比?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
相关产品推荐
相关产品推荐

