村界里的飞地与洞:MultiPolygon 解剖实测
技术专栏 · 数据处理 · 2026-10-17
上一篇讲点在面内判定时踩过 MultiPolygon 的坑,这篇干脆把全国六份村界包(成都、重庆、广州、武汉、宜春、铜鼓,合计 21,781 个村级面)全部解剖了一遍:MultiPolygon 到底多不多、有没有真的飞地、内环「洞」里装的是什么。结论有三条,其中一条——最大的洞是 16.32 平方公里的长江水面——值得单独讲。
普查表:六份包的几何形态
逐面统计几何类型、面件数与内环数量,六份包的账如下:
| 样本 | 村级面 | MultiPolygon 占比 | 多件面(真飞地) | 内环(洞) |
|---|---|---|---|---|
| 成都市 | 2,816 | 1.1% | 0 | 39 |
| 重庆市 | 10,847 | 5.6% | 0 | 811 |
| 广州市 | 2,631 | 6.2% | 0 | 296 |
| 武汉市 | 2,639 | 8.3% | 0 | 299 |
| 宜春市 | 2,751 | 0.8% | 0 | 26 |
| 铜鼓县 | 97 | 0% | 0 | 0 |
三条读法。第一,没有任何一个真正的多件面——六份包 21,781 个面逐个拆开,每个 MultiPolygon 里都只有一个面件。第二,MultiPolygon 类型的占比随城市化程度爬升(铜鼓 0%、武汉 8.3%),说明这是清洗管线对某些面做的类型归一,而不是几何事实。第三,洞在山地库区城市明显更多:重庆 811 个对宜春 26 个,三峡库区的水域岸线贡献了大头。
最大的洞:一条叫「长江」的村
把面积超过 0.05 平方公里的 1,031 个洞按大小排队,冠军在广州龙穴街道——30.19 平方公里的洞,质心落在伶仃洋水域;亚军在武汉,一个村名就叫「天兴乡长江」的面,挖掉了 16.32 平方公里的长江主槽。把它的村级面画出来:
洞里装的是谁,验证方法是把洞的质心坐标拿回同一份包里再做一遍点在面内判定。本文对 1,031 个大洞逐一验证:质心几乎全部无面覆盖——水域、独立图斑或未划归的线状地物。这不是数据缺陷,而是「村级管理边界止于水岸」口径的正确表达;反过来,若某个洞的质心落进了另一个村的面里,那就是「村中村」图斑,需要按上级单元的口径处理。
解析时的三件事
统计与解析村界几何,按这三步走就不会栽。第一步按类型摊环:Polygon 的坐标是一层环列表,MultiPolygon 是「面→环」两层,先摊平再处理——上一篇的 0 命中 bug 就是栽在这里。第二步数内环从每面第二个环起:每个面的第一个环是外环,其余是洞;洞的存在完全正常,别当成自相交去修。第三步算面积外环加、内环减:漏掉内环,天兴乡长江这样的水面村会凭空多出十几平方公里。三步的完整代码在《把1.4万座山峰落到村界:网格索引快了102倍》与《村界面积怎么算才准:三种公式的实测差距》里各有一份。
想亲手拆一份村界包看看自己的数据长什么样,按市、按县的包在村界数据 · 按市页按需取用;拆完的几何体检(缝隙、重叠、自相交)直接复用《边界数据拓扑检查:一段脚本查出缝隙与重叠》的脚本。
常见问题
- 村界数据里有飞地吗?MultiPolygon 多不多?
- 类型标注上有——本文六份包 21,781 个村级面里,0.8% 到 8.3% 被标为 MultiPolygon;但逐个拆开看,全部只含一个面件,没有一个真正的多件飞地面。MultiPolygon 在这里是类型层的写法差异,不是几何层的飞地事实,解析器按两层结构兼容即可,不必当异常处理。
- 村级面里的「洞」是什么?数据错了吗?
- 洞是面内不属于该村的外部区域,最常见的是水域。本文实测六份包共 1,471 个内环,最大的洞在广州龙穴街道(30.19 平方公里,伶仃洋水域)和武汉天兴乡长江(16.32 平方公里,长江主槽)——村界沿水岸走、水面不属任何村,洞正是这种口径的几何表达,不是数据错误。
- 怎么确认洞里装的是别的单元?
- 取洞的质心坐标,回到同一份包里做一遍点在面内判断。本文对超过 0.05 平方公里的洞逐一验证:绝大多数洞的质心不被任何村级面覆盖,对应水域或独立图斑;若洞内发现了其他村级面,说明存在真正的「村中村」图斑,此时按洞所属的上级单元处理即可。
- 解析村界数据时,几何类型要注意什么?
- 三件事:按 geometry.type 分支处理 Polygon 与 MultiPolygon,MultiPolygon 要把「面→环」两层摊平到环一级;统计内环时从每面第二个环数起;面积计算要区分外环与内环的符号。任何一步按固定层数硬编码,换一份来源就会静默出错。
- 洞会影响面积统计吗?
- 会,而且是往小里算——洞不属于该村,村界面积必须扣掉洞。实测武汉天兴乡长江的村级面挖掉长江主槽后仅剩岸线条带;若解析时忽略内环,该村的面积会凭空多出 16 平方公里的水面。本文的球面面积脚本对每个外环加、每个内环减,洞的扣除是自动的。