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

如何划分属性统计相似且保持地理连通性的区域分组?

带地理连通约束的属性平衡区域化解决思路

你的需求本质是空间硬约束下的平衡反聚类问题:核心目标是让指定数量分组的多属性统计特征(均值、方差等)尽可能趋同,同时必须满足每个分组内地理单元邻接连通、无空间交错飞地。以下是可直接落地的实现路径:

方案1:启用anticlust内置的邻接硬约束

你之前的代码提前将sf空间对象转为普通数据框丢失了几何信息,把坐标、距离作为属性加入特征集属于软优化目标,不是强制连通的硬约束,自然无法得到空间连续的分组。anticlust本身支持邻接约束配置,实现步骤如下:

  • 保留sf对象的空间几何信息,用spdep包计算地理单元间的邻接关系:
library(sf)
library(spdep)
library(anticlust)

# 读取空间数据时不要提前转普通数据框,保留几何信息
geo_sf <- read_sf(dsn = getwd(), layer = "geolayer", stringsAsFactors = FALSE)
# 计算面单元邻接关系,queen=TRUE为共享边/顶点即邻接,可改为queen=FALSE使用仅共享边的Rook邻接
nb <- poly2nb(geo_sf, queen = TRUE, zero.policy = TRUE)
# 转换为anticlust支持的邻接矩阵
adj_matrix <- nb2mat(nb, style = "B", zero.policy = TRUE)
  • 调用反聚类函数时传入邻接约束参数,通过惩罚项强制分组连通:
geo_sf$class <- anticlustering(
  geo_sf[, c("A1", "A2", "A3", "An")],
  K = 5,
  objective = "variance",
  standardize = TRUE,
  cannot_link_adj = adj_matrix, # 传入邻接约束
  adj_cost = 100 # 惩罚系数,数值越大对非连通分配的惩罚越强,可根据结果调优
)

方案2:两阶段分区+反聚类校准

如果直接加邻接约束后的属性平衡效果达不到预期,可以用两阶段法兼顾连通性和属性相似度:

  • 第一阶段做纯空间连通的初始过分区:用SKATER(基于最小生成树的空间聚类)或REDCAP区域化算法,将研究区切分为数量远大于目标组数的空间连通小斑块,比如目标分5组就先切50~100个小斑块,保证每个小斑块内部100%邻接连通。
  • 第二阶段以连通小斑块为最小分配单元做反聚类:因为最小分配单元本身是连通的,后续组合时只把相邻的小斑块归为同一组,就能保证最终5个大组的空间连通性,同时反聚类算法的优化目标会自动平衡各组的属性均值、方差,平衡效果比直接加单元级约束更稳定。
  • R实现提示:spdep包内置skater函数,regional包可实现REDCAP初始分区,第二阶段将小斑块的属性聚合后直接传入anticlustering()即可,分配完成后做一次邻接校验,调整个别孤立斑块即可。

方案3:使用专门的空间平衡分区工具

如果前两种方法的效果达不到要求,可以直接选用为空间约束平衡场景设计的工具:

  • 选用redist包的分区算法:这类算法原本服务于选区划分场景,原生支持分组连通硬约束、多属性平衡优化目标,可直接自定义需要平衡的A1~An属性,算法会自动迭代调整分组边界,在保证无飞地的前提下最小化组间属性统计特征差异,完全匹配你的需求。
  • 快速实现可选spatialsample包的空间平衡块采样功能,本质也是连通约束下的特征平衡分组,适合对精度要求不高的快速场景。

所有方案跑完后必须做连通性校验:对每个分组单独生成邻接表,检查组内单元是否属于同一个连通分量,将孤立的飞地单元调整到相邻组别后,再做一次小范围的属性平衡微调即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:54:18