GeoPandas dissolve 聚合出错:分组字段、统计规则与几何合并检查

Python
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

GeoPandas dissolve 聚合出错:分组字段、统计规则与几何合并检查

按行政区汇总网格指标时,dissolve 一跑就少了记录、数值翻倍,或生成一个看似正确但包含空洞的 MultiPolygon。问题通常不在函数本身,而在分组字段、统计规则和几何关系没有被显式说明。本文用一个可复核的聚合框架,避免把“合并面”和“汇总属性”混成黑盒。

GeoPandas dissolve 聚合:先把问题拆成可验证的环节

GIS 工具往往能在几秒内给出一个结果,但“工具成功运行”并不等于结果可用。处理前先固定 数据版本、CRS、几何类型、字段语义和容差/尺度;处理后再核对数量、范围、面积或统计量。把这两组检查写进流程,问题才不会在交付阶段才暴露。

dissolve 同时做两件事

GeoPandas dissolve 会按 by 字段分组,几何通常做 union,非几何字段依据 aggfunc 汇总。一个字段是求和、平均还是取首值,取决于它表示总量、比率还是分类标签;默认规则并不替你理解业务语义。

比例字段不能直接求和

人口、面积可以 sum;密度、比例、均价通常应按分母重算或加权平均。把各网格的百分比相加是最常见的“数值成功、业务失败”。

邻接与重叠会改变 union 结果

同组面不相邻会成为 MultiPolygon;彼此重叠会在 union 后消重。聚合前要区分这是正常的离散辖区,还是编码错误造成的错组。

可执行实操流程

  1. 复制原始 GeoDataFrame,明确 CRS,并用 is_valid、is_empty、duplicated 检查几何和主键。
  2. 检查 group 字段的空值、前后空格、大小写和编码;先输出 value_counts,不要直接聚合。
  3. 为每个属性写出统计规则:总量用 sum,比率按分子/分母重算,类别字段用众数或保留独立表。
  4. 在一个行政区样本上 dissolve,比较合并前后面积、要素数和指标;确认预期是否允许 MultiPolygon。
  5. 将结果导出 GeoPackage,重新读取后核对行数、字段类型和空间范围,再进入制图或入库。
out = gdf.dissolve(
    by='district_id',
    aggfunc={'pop':'sum', 'income':'mean', 'name':'first'}
)
out['density'] = out['pop'] / out.geometry.area

项目避坑与质量检查

曾见过区划代码 “01” 被读成整数 1,而另一批是字符串 “1”;视觉上都像同一个区,实际却聚成两行。处理前强制统一字段类型,并在聚合后把 group 数与预期行政区清单做集合比对,是低成本且很有效的质检。

检查项 合格信号 异常时优先排查
输入一致性 范围、CRS、字段含义可解释 数据源、坐标定义、空值
处理结果 数量与关键统计量符合预期 参数、分组条件、单位
空间抽检 边界与典型位置无明显异常 容差、精度、几何有效性

建议把“处理前后要比什么”写入项目 README。 这比保存一串截图更能让同事复跑,也能在数据更新时迅速判断差异究竟来自源数据还是算法。

FAQ

dissolve 后为什么少了行?

同一分组值本来就会合成一行;若少得异常,检查空值、编码清洗和分组字段是否被错误截断。

面积应该如何汇总?

面积字段可求和,但应同时比较 union 后 geometry.area;两者差异能暴露重叠面或投影问题。

能否在经纬度坐标中计算密度?

不能直接用度单位面积。先投影到适合研究区的平面 CRS,再计算面积和密度。

总结

dissolve 的价值在于把空间单元和业务指标按同一规则聚合;先明确字段语义,再让代码执行,才能得到可解释的区域统计。真正可靠的 GIS 成果不是某一次按钮点击后的图层,而是一套知道输入边界、参数理由和复核证据的可复现流程。