本文介绍如何使用PySAL的spopt.maxp模块,对GeoDataFrame中的多边形进行智能合并,确保每个新区域人口不低于指定阈值,同时最大化区域数量并保持空间连续性与高分辨率。
本文介绍如何使用PySAL的`spopt.maxp`模块,对GeoDataFrame中的多边形进行智能合并,确保每个新区域人口不低于指定阈值,同时最大化区域数量并保持空间连续性与高分辨率。
在人口统计、公共卫生规划或选举区划等场景中,常需将细粒度地理单元(如普查区块、乡镇)聚合成满足最低人口规模的连续区域——这并非简单按面积或邻接关系分组,而是一个典型的空间约束优化问题。直接迭代合并邻近单元易导致碎片化、几何退化或逻辑死循环(如反复拆分-重聚),而Max-P Regionalization(最大P区域化)正是为此类“下限驱动型聚合”量身设计的成熟方法。
该算法核心思想是:在保证每个区域人口 ≥ 阈值 x 的前提下,尽可能多地生成空间连续、属性同质的区域(即最大化区域总数 p)。它天然规避了固定分区数(如K-means)的主观性,也优于贪心合并策略——因其通过整数规划或启发式搜索(如禁忌搜索)全局优化目标函数,并显式建模空间邻接性(contiguity)与属性约束。
✅ 推荐工具:PySAL + spopt.maxp
目前最成熟、可直接落地的开源实现来自地理空间分析权威库 PySAL 的子项目 spopt。其 MaxP 类已封装边界约束、空间权重构建、邻接验证与高效求解器,支持百万级单元规模。
▶ 基础实现示例
import geopandas as gpd
import numpy as np
from spopt.region import MaxP
from libpysal.weights import Queen
# 1. 加载数据(假设gdf含'geometry'和'population'列)
gdf = gpd.read_file("regions.geojson")
gdf = gdf.to_crs(epsg=3857) # 推荐转为投影坐标系以保障邻接计算精度
# 2. 构建空间邻接权重矩阵(Queen邻接:共享边或顶点即视为相邻)
w = Queen.from_dataframe(gdf)
# 3. 定义人口阈值(例如:每个新区至少5万人)
threshold = 50000
# 4. 执行Max-P区域化
maxp = MaxP(
gdf[["population"]].values, # 目标属性(列必须为二维数组)
w, # 空间权重
threshold, # 人口下限
verbose=True # 输出迭代日志
)
gdf["region_id"] = maxp.labels # 分配区域ID(从0开始)
# 5. 合并同属一区的多边形(保持拓扑正确性)
aggregated = gdf.dissolve(by="region_id", aggfunc="sum").reset_index()
aggregated["population"] = aggregated["population"].round(0).astype(int)
print(f"原始单元数: {len(gdf)}, 合并后区域数: {len(aggregated)}")⚠ 关键注意事项与最佳实践
- 空间参考系统(CRS):务必使用投影坐标系(如EPSG:3857 或区域UTM带),避免经纬度下 Queen/Rook 邻接计算失真;
- 邻接定义选择:Queen(共享顶点即邻接)比 Rook(仅共享边)更鲁棒,尤其适用于不规则边界;若需更强连续性,可预处理生成图结构权重(如 WSP);
- 属性标准化:若人口差异极大(如跨3个数量级),建议对 population 列做对数变换或Z-score归一化,提升聚类稳定性;
- 性能优化:对超大数据集(>10万单元),启用 w.sparse = True 并配合 scipy.sparse 存储权重;也可先用 geopandas.sindex 进行空间粗筛,再局部构建子图;
- 结果验证:务必检查 aggregated.geometry.is_valid.all() 及最小人口 aggregated.population.min() >= threshold;
- 进阶扩展:spopt.maxp 支持多属性加权(如“人口+老龄化率”复合指标)、边界约束(如不得跨行政区界)及自定义目标函数——参见论文 Boundary-Constrained Max-p-Regions Problem(2024)。
? 提示:若需进一步控制形状紧凑性(避免狭长区域),可在 MaxP 初始化时传入 inertia=True 启用惯性惩罚项;若业务强依赖行政边界,应结合 gpd.overlay() 预裁剪或使用 spopt 的 boundary_constraint 参数。
Max-P 不仅解决“够不够人”的硬性门槛,更通过空间优化赋予聚合结果统计稳健性与地理合理性——这正是从原始地图迈向可决策空间单元的关键跃迁。