Skip to content

为什么是 v2

背景:官方活源消失

原数据源国家统计局 stats.gov.cn(统计用区划代码和城乡划分代码)自 2024 年起停止公开发布2026 年起统一转向「国家地名信息库」dmfw.mca.gov.cn),全量五级数据已无官方活源。

v1 的做法是「镜像一个源」——直接爬 stats.gov.cn 并固化。源一旦冻结/下线,整套方案随之失效。

v2:从镜像一个源 → 基线 + 增量 + 多源合成

因此 v2 架构从「镜像一个源」转为 「2023 基线快照 + 社区 Patch 增量 + 多源合成」,并把数据与代码彻底解耦:

构建期(维护者)                     分发                用户运行期
历史源/dmfw/镜像 → 合成 → SQLite → NPM @cndiv/source-YYYY → cndiv hydrate → ~/.cndiv/cache.db
                                  + GitHub Release 归档        + patches/*.json  → cndiv apply-patch

关键取舍:

  • 用户侧零爬虫:只从 NPM 拉取数据包注水到本地 SQLite,不依赖任何在线源可用性。
  • 大数据不进 git:仓库历史曾因 GB 级 SQLite 膨胀并被迫 git-filter-repo 清理;现以 .gitignore(内容型规则)+ pre-commit 钩子杜绝复发。数据走 NPM / GitHub Release 分发。
  • 来源可追溯:置信度分 4 档 official_nbs > mca_decree > community > shadow_map,每条数据可回答「它从哪来、可信度多高」。

三条数据源替代路线

来源角色
基线NBS 2023 五级全量(冷母本 SQLite)不可变基准,村级 620,572 条冻结
增量主源国家地名信息库 dmfw(79 号令年更 + xzqh 事件流)@cndiv/crawler 逐层 BFS 差分产出 Patch
参考镜像modood/Administrative-divisions-of-China(WTFPL)等交叉校验、历史补全

数据闭环

crawler 抓取 → patches/<YYYY>/ → apply-patch(克隆到目标年)
             → backfill 导回 source-<year>/divisions.csv → 重建数据包

为什么必须版本化:总数稳定,结构在变

外界常以为「行政区划一直在扩张」,真实数据恰恰相反——县级总数四十年几乎不动,真正频繁的是结构性调整(撤县设区、县改市),它不改变总量却改变了每个码的归属与语义。

1980–2020 · GB2260 三级 · source-history
县级行政区划总数四十年稳定在 ~3,200——变的是结构(撤县设区),不是数量
3,1003,1503,2001980 · 3,1062004 · 3,226 峰值19801990200020102020
纵轴放大到 3,080–3,240:四十年净变化 <120(<4%)。总量的平稳掩盖了底层大量「撤县设区/县改市」的结构调整——这正是需要按 (code, year) 版本化、而非只存一版全量的原因。2021 为残缺年(仅 21 条)故止于 2020。

这正是 v2 用复合主键 (code, year) 逐年版本化、而非只存一版全量的根因:只有把「同一个码在不同年份的不同含义」都留存,才能回答时点查询。

与旧库的差异化

相比只提供「某一版全量」的社区库,v2 的核心价值是:

  • 历年版本化:复合主键 (code, year),同一区划码可跨年份并存,支持「2015 年的 310115 是什么」这类时点查询。
  • 后统计局时代仍可更新:官方停更后,仍能通过 dmfw 事件流 + 社区 Patch 持续维护。
  • 完整性可校验:数据包 manifest.json 带 SHA-512,快照 Release 带逐文件 SHA-256。

下一步 → 快速上手

数据来源于公开政府网站(国家统计局、民政部国家地名信息库),仅供学习与研究使用。代码以 MIT 许可。