行政区划边界:我不想再手扒地图数据了

手扒边界总差几百米?省市区县三级一键出 WGS84 GeoJSON,自动纠偏、同名消歧。

做区域分析的人大概都经历过这一幕:为了给图配一个「研究区范围」,去网上搜边界文件,下下来的要么是截图配准的,要么是手工描的,顶点忽多忽少;省界勉强能用,一到区县就开始飘。

我也这么干过。最崩溃的一次是把一份边界拿去和 DEM、河网叠加,整条河和区界齐刷刷错开了几百米——不是分析写错了,是坐标系没对上。

这个技能就是从那几次返工里长出来的。它是「技能上架」系列的第 1 篇,我把这半年陆续上架到 WorkBuddy 的 11 个技能一个个讲清楚,这篇先讲中国行政区划边界(v1.1.0)。

一、为什么要做

先说三个我实实在在踩过的坑。

坑一,手扒数据不可复现。手工描的边界没有版本、没有来源、没有获取时间,换个人、换台机器就复现不出来。更麻烦的是没法追溯:半年后回头看那份文件,我已经说不清它到底是哪来的、什么时候下的、准不准。这在需要写进报告的分析里是硬伤。

坑二,坐标系偏移。国内不少公开地图服务返回的是 GCJ-02(俗称火星坐标),相对 WGS84 有约 300~600 米的偏移,而且方向随位置变化。这个量级在只看全国轮廓时几乎看不出来,可一旦和 DEM、遥感影像、河网、OpenStreetMap 这些 WGS84 数据叠加,几百米的错位足以让流域边界和河道完全对不上。更隐蔽的是:一个标注 EPSG:4326 的文件,坐标仍然可能是 GCJ-02,凭标签判断根本不靠谱。

文档里给了一条可核对的基线:万州区的一个顶点,换算前是 108.034787, 30.574187,换算后是 108.030250, 30.576658,位移约 515 米。这个数字很能说明问题——它不是舍入误差,是坐标系本身的系统性偏差。

坑三,同名行政区。朝阳区不止一个——北京市朝阳区是 110105,吉林省长春市朝阳区是 220104。类似的还有一批「和平区」「城关区」「高新区」。按名字抓数据,很容易抓错一个还浑然不觉,等出图才发现研究区跑到了另一个省。

三个坑的共同点是:它们都不是「写代码」的问题,而是数据准备阶段的流程问题。所以我把整套流程固定成一个技能:解析、消歧、下载、换算、清理、输出,一次做对,下次还能照着复现。

二、能做什么

我把能力归成五件事,都是「输入什么、输出什么」的形式。

解析名称。输入「万州区」这样的名称,返回 adcode、层级、完整层级路径和中心点坐标。它是后面所有步骤的入口,也是防止抓错数据的第一道闸门。

同名消歧。这是一条强制步骤:当名称匹配到多个行政区时,技能必须停下来把候选列表摆出来,由我确认,严禁自动挑一个。比如「朝阳区」会同时返回 110105 和 220104,各自带上「中华人民共和国 / 北京市 / 朝阳区」和「中华人民共和国 / 吉林省 / 长春市 / 朝阳区」这样的层级路径,一眼就能分辨。

下载边界。省、市、县三级,共 3238 个行政区单元,输出标准 GeoJSON 的 FeatureCollection。可以只下一个区县,也可以下一个省并附带下级。

坐标纠偏。默认把源数据的 GCJ-02 迭代反解成 WGS84,往返误差小于 1 微米。每个要素里同时保留 center_gcj02 与 center_wgs84,方便核对差异。

几何清理。Douglas-Peucker 简化可以按容差压顶点,0.001 度大约相当于 100 米,多数制图够用;碎斑剔除能把面积占比过小的零散多边形去掉,文件体积下来得很明显。前端加载和出静态图这两类场景,我都用这套参数。

附带下级原始数据。加 --with-children 时,除了目标边界,还会另存一份下级行政区的原始数据(未做坐标转换),方便自己再加工或核对。

另外还有两个自检命令:version 打印版本与依赖,self-check 做一键健康检查(索引行数、同名消歧样本、坐标往返),退出码为 0 就说明技能可以调用。审核期间我自己也拿它当冒烟测试用,比人工点一遍省事。

图

三、怎么调用

在 WorkBuddy 上,技能安装之后直接用自然语言说就行。技能的 description 里写清了用途和触发词,AI 会据此判断要不要调用。我实际用下来,这三种问法都能命中:

  • 「把重庆市万州区的行政边界导出成 GeoJSON」

  • 「我要做长三角的区域统计,把上海的区县边界都下下来,简化到能塞进前端加载」

  • 「朝阳区有好几个,我要长春那个,adcode 是多少」

用起来没什么前置步骤:在技能市场点右上角的加号安装,装完不用背命令,直接在对话里提需求就行。技能包本身也很轻,只有 SKILL.md、references 和 scripts 三部分,没有服务端依赖。

命令行侧,它在技能包里就是一个脚本加几个子命令。下面这些都可以直接复制:

# 1) 名称 → adcode(返回层级路径与中心点) python scripts/admin_vector.py resolve --name "万州区" # 2) 下载边界,输出 WGS84 GeoJSON python scripts/admin_vector.py fetch --code 500101 --output "./wanzhou.geojson" # 3) 带简化与碎斑剔除(适合制图或前端加载) python scripts/admin_vector.py fetch --code 500000 --simplify 0.002 --drop-tiny-parts 0.0005 --output "./cq.geojson" # 4) 打印版本与依赖 python scripts/admin_vector.py version # 5) 一键健康检查(索引、同名消歧样本、GCJ-02→WGS84 往返) python scripts/admin_vector.py self-check

有一个习惯值得养成:一旦确认了 adcode,后面就不要再回到 --name,全部用 --codefetch 还支持 --source-crs 指定源坐标系、--with-children 附带保存下级原始数据。

图

四、产物长啥样

输出是一个标准 GeoJSON FeatureCollection,任何支持 GeoJSON 的工具都能直接读,不需要额外的 GIS 环境。

每个要素的 properties 分三类。标识类:adcode、name、level、parent_adcode、path(完整层级路径)。坐标类:center_gcj02、center_wgs84、vertex_count。溯源类:source、source_url、retrieved_at、coordinate_semantics、disclaimer。文件级的 metadata 则记着生成器、CRS、要素数、被剔除的碎斑数、简化容差和数据来源与限制说明。

这些字段不是摆设。我做区域统计时习惯直接拿 adcode 当分组键;做制图底图时,简化参数决定文件大小;而 source 和 retrieved_at 是我半年后还能说清「这张图的数据从哪来、什么时候下的」的唯一依据。

输出路径的父目录会自动创建,不用先手动建文件夹。几何是每次按 adcode 实时向数据源请求的,本地那份索引只负责名称解析与消歧,这也是它体积很小、还能保持时效的原因。

我自己的两个主要用法:一是当制图底图,出研究区范围、做区位图;二是当空间统计的边界输入,把点位或栅格汇总到区县一级。再往下的流域分析、水文拓扑、成图排版不在这条链路里,我也不建议把它当成一个 GIS 工具箱。

图

五、边界与合规

这一节我写得比功能细,因为它比功能重要。

层级边界。只覆盖省、市、县三级。乡镇、街道、村级没有。这不是参数没调对,而是数据源在区县级就终止了:区县级要素的 childrenNum 为 0,对应的下级接口直接返回 404。我没有用 OSM 关系或者点位去「补」一个乡镇级实现,因为那样的边界质量不可控,会污染下游分析;真需要乡镇边界时,应该去找有合法授权的矢量文件。

不做的判定。历史沿革边界、争议地区判定、法定界线测绘成果,这些都不在范围内。某个行政区在数据源里缺失时,如实报告缺失,不从上级边界机械切割替代。

数据版权。这一点必须说清楚:数据来自阿里云 DataV.GeoAtlas 公开服务,官方声明其数据来自高德开放平台,仅供学习交流使用,不得用于商业目的;商业用途须自行向高德开放平台获取授权数据。如果确实要商用,文档里给的替代源是 OpenStreetMap(ODbL 许可,需署名)与 geoBoundaries(CC BY 4.0)。我自己对这份输出的定位很明确:做分析、做内部图、做学习练手可以,不用于商业或公开出版。

合规底线。这份数据不能替代法定行政区域界线或测绘成果,不得用于公开出版地图。绘制中国地图时必须遵守国家地图编制规范,正确处理国界、未定界与南海诸岛。输出文件里的 source、retrieved_at、disclaimer 字段请保留,不要在二次加工时删掉,它们是下游追溯的依据。

运行环境。零第三方依赖,只用 Python 标准库(urllib、json、csv、math),Python 3.9 及以上直接跑,不需要 pip install,也不需要 geopandas、pyproj 或任何 GIS 环境;首次运行也不需要额外准备。只有真正要下载边界时,机器才需要能访问数据源域名。

时效与报错。随技能附带的 adcode 索引(3238 条)截至 2025 年 12 月编制,只用于名称解析与消歧,几何一律实时请求,区划调整以最新官方公告为准。遇到 HTTP 404,用 resolve 重新核对 adcode;下载超时脚本内置 3 次重试,持续失败就是网络问题了。

如果你的需求落在这几条线之外,那这个技能确实帮不上忙。我宁可它把「不支持」讲清楚,也不想给一个看起来能用、实际会把分析做歪的结果。


我是文茂,热衷于分享 AI 工具与开发者生态观察。觉得有用欢迎点赞、在看、转发三连。


行政区划边界:我不想再手扒地图数据了
https://maoyu92.github.io/2026/09/16/07 AI笔记/AI写作与发布/a009_行政区划边界:我不想再手扒地图数据了/
作者
陈文茂
发布于
2026年9月16日
许可协议