天地图行政区划数据下载与mapshaper格式转换:解决中文乱码 📅 发布时间:2026/9/19 12:31:13 👁 浏览次数: 行政区划数据是很多项目的底座——做数据可视化要给省份上色做物流系统要算配送范围做地图应用要按城市聚合点位。但真到动手找数据的时候很多人会卡在两个地方一是不知道去哪拿权威、完整、免费的边界数据二是拿到数据之后格式不对、中文乱码折腾半天用不了。这篇就围绕天地图下载行政区划数据 mapshaper 做格式转换这条链路把从取数到落地的完整过程讲清楚尤其是中文乱码这个高频坑我会把成因和几种解法都摊开说。不管你是刚接触 GIS 的新手还是已经用过 ArcGIS、QGIS 的老手只要涉及行政区划边界数据的获取和转换这篇都能直接抄作业。1. 为什么行政区划数据总在下载和转换两步翻车1.1 数据源的三种常见来源与各自的坑先理清楚行政区划边界数据一般从哪来。市面上常见的有三类第一类是官方地理信息服务平台比如天地图。它的优势是权威、边界相对准确、更新有保障而且提供标准的服务接口可以按需拉取。缺点是接口调用有门槛需要申请 key返回的数据格式和坐标系需要自己处理。第二类是开源社区整理的数据集比如一些 GitHub 仓库维护的全国省市区 GeoJSON。优点是拿来即用、格式规整缺点是版本参差、边界精度不一有些还停留在好几年前的行政区划调整之前比如某些地方撤县设区之后老数据里还是旧的分区。第三类是商业地图厂商的开放数据精度高、更新快但往往有授权限制不能随便用于对外发布的产品。我个人的建议是做正式项目优先用天地图这类官方源因为边界权威性和合规性最有保障做快速原型或者内部演示开源数据集够用。但无论用哪种你都会遇到同一个问题——下载下来的格式往往不是你要的格式。1.2 格式转换为什么成了必经之路GIS 领域的数据格式多到让人头大常见的有 Shapefile.shp、GeoJSON、KML、TopoJSON、MBTiles 等等。不同工具吃不同的格式ArcGIS / ArcGIS Pro原生吃 Shapefile也能读 GeoJSON但对坐标系和编码敏感。Web 前端地图库如 Leaflet、Mapbox GL、ECharts基本都吃 GeoJSON尤其是 ECharts 的 map 系列几乎只认 GeoJSON。数据库PostGIS、MySQL 空间扩展导入时对格式和编码都有要求。所以从天地图拿到的数据大概率要转成 GeoJSON 才能喂给前端或者转成 Shapefile 才能进 ArcGIS。这一步转换就是乱码和坐标错位的高发区。1.3 中文乱码到底乱在哪很多人第一次遇到乱码会懵明明文件能打开属性表里的地名却变成了一堆问号或者锟斤拷。这不是数据坏了而是编码不一致。Shapefile 这个格式有个历史遗留问题它的属性表.dbf 文件在早期规范里对字符编码的支持很弱默认走的是系统本地编码。中文 Windows 环境下常见的是 GBK/GB2312而现代工具比如很多在线转换器、Node.js 生态的库默认按 UTF-8 读写。一边按 GBK 存一边按 UTF-8 读中文自然就花了。GeoJSON 本身规范要求用 UTF-8所以从 Shapefile 转 GeoJSON 时如果转换工具没正确处理源文件的编码乱码就会被固化进新文件里。这就是为什么很多人转完之后乱码反而更严重了。理解了这三层后面的操作就有了方向取数要选对源转换要选对工具编码要显式指定。2. 从天地图取行政区划数据的完整路径2.1 申请 key 与接口调用的前置准备天地图的服务需要先注册账号、申请 key也叫 tk。申请流程不复杂登录官网后在控制台创建应用选择浏览器端或服务端类型拿到一串 key 就行。这里有个高频报错要提前说返回 code 301001 / 非法 key。这个错误基本就三个原因key 没申请对类型比如服务端接口用了浏览器端的 keykey 拼写错误或者带了多余空格调用频率超限或者 key 被禁用。排查的时候先确认 key 类型和接口匹配再检查请求 URL 里 key 参数有没有拼错。我见过有人把 key 复制到代码里时末尾多带了一个换行符结果一直报非法 key找了半天。2.2 行政区划数据的获取方式天地图本身提供的是地图服务瓦片、矢量、注记等行政区划边界数据通常通过它的行政区划查询接口或者矢量数据服务来拿。具体来说可以按行政区划代码adcode查询某个省、市、区的边界。调用逻辑大致是传入行政区划名称或代码接口返回该区域的边界坐标串。返回的坐标一般是经纬度坐标系需要留意——天地图用的是CGCS2000和常见的 WGS84 在精度要求不高的场景下可以近似等同但严格来说有细微差异。如果你不想写代码调接口也可以用天地图坐标拾取工具辅助确认点位或者用一些在线的行政区划数据下载页面按省市区勾选后导出。导出格式常见的是 GeoJSON 或 JSON。提示下载时尽量按最小行政单元区/县分别下载再按需合并。一次性拉全国数据容易超时也不利于后续按需加载。2.3 下载下来的数据长什么样从天地图拿到的 GeoJSON结构一般是标准的 FeatureCollection每个 Feature 的 properties 里带着行政区划代码、名称等属性geometry 里是 Polygon 或 MultiPolygon 的坐标。这里要注意两点坐标精度有些接口返回的坐标精度较低做精细展示时边界会显得锯齿。如果对精度要求高要确认接口是否支持高精度返回。属性字段命名不同来源的字段名不一样有的是name有的是NAME有的是中文拼音。转换前先打开文件看一眼心里有数。我一般会先用文本编辑器或者geojson 用什么软件打开这个问题的答案——推荐用QGIS或者在线工具 geojson.io 快速预览一下确认数据完整、坐标正常再进入转换环节。3. mapshaper 做格式转换为什么选它怎么用3.1 mapshaper 解决了什么核心问题mapshaper 是一个基于 Node.js 的命令行 网页版工具专做矢量数据的格式转换、简化、裁剪。它最大的几个优势支持格式多Shapefile、GeoJSON、TopoJSON、CSV 等互转。能处理编码可以显式指定输入文件的编码这是解决中文乱码的关键。能简化几何-simplify命令可以在保持形状的前提下大幅减小文件体积对 Web 加载非常友好。命令行可脚本化适合批量处理一次转几十个文件不用手动点。相比 ArcGIS 那种重型工具mapshaper 轻量、免费、跨平台做格式转换这个单一任务它比大多数工具都顺手。3.2 命令行安装与基础转换命令先装 Node.js然后用 npm 全局安装npm install -g mapshaper装完之后验证一下mapshaper --version基础转换命令把 Shapefile 转成 GeoJSONmapshaper input.shp -o formatgeojson output.geojson如果源文件是 GBK 编码要显式告诉 mapshapermapshaper input.shp encodinggbk -o formatgeojson output.geojson这一步就是解决乱码的核心。encodinggbk让 mapshaper 按 GBK 去读源文件的属性表读进来之后内部统一按 UTF-8 处理输出 GeoJSON 时就是正确的 UTF-8 中文了。反过来如果要把 GeoJSON 转成 Shapefile并且希望属性表用 GBK 编码给某些老工具用mapshaper input.geojson -o formatshapefile encodinggbk output.shp3.3 网页版 mapshaper 的用法与适用场景不想装命令行的话mapshaper 有网页版。直接把文件拖进去就能预览、转换、简化。网页版同样支持编码设置在导入选项里可以选输入编码。网页版适合临时转一两个文件想先可视化确认数据对不对不熟悉命令行的新手。命令行适合批量处理集成到自动化流程需要精确控制参数。我的习惯是先用网页版快速验证一个文件确认编码和参数没问题再写成命令行脚本批量跑。这样既快又不容易出错。3.4 转换时的坐标系处理mapshaper 本身不做坐标系投影转换它只处理几何和属性。如果你的数据需要从 CGCS2000 转到 WGS84或者做投影得用别的工具比如 ogr2ogr、QGIS。不过对于大多数 Web 展示场景CGCS2000 和 WGS84 的差异可以忽略直接用就行。如果做精确测量或者叠加分析那就得老老实实做投影转换。4. 中文乱码的成因拆解与四种解法4.1 乱码的三种典型表现先学会看症状下药表现可能原因显示为锟斤拷UTF-8 和 GBK 反复转换导致的字符损坏显示为问号???目标编码无法表示该字符被替换显示为方块或乱码符号编码完全不匹配按错误编码解读锟斤拷是最经典的它是 UTF-8 的替换字符UFFFD被按 GBK 解读后的产物说明数据经历了至少两次错误的编码转换。4.2 解法一转换时显式指定编码首选这是最干净的做法。在 mapshaper 里用encodinggbk读源文件输出时默认 UTF-8。前面已经给过命令这里再强调一次顺序编码参数是加在输入侧的告诉工具源文件是什么编码而不是输出侧。mapshaper input.shp encodinggbk -o formatgeojson output.geojson如果源文件是 UTF-8 但被误读成 GBK那就去掉 encoding 参数或者显式写encodingutf8。4.3 解法二用 QGIS 中转修正编码如果手头没有命令行环境QGIS 是个好选择。QGIS 导入 Shapefile 时可以指定编码导入后属性表显示正常再导出为 GeoJSON编码就是对的。具体操作图层 → 添加图层 → 添加矢量图层 → 选择文件 → 在编码下拉框里选 GBK 或 GB2312 → 导入后检查属性表 → 右键导出 → 保存为 GeoJSON。QGIS 的好处是所见即所得导入时就能看到中文对不对不对就换个编码再试。4.4 解法三用 Python 脚本批量修正数据量大、要批量处理时写个 Python 脚本更省事。核心思路是用shapefile库或geopandas读取时指定编码import geopandas as gpd gdf gpd.read_file(input.shp, encodinggbk) gdf.to_file(output.geojson, driverGeoJSON, encodingutf-8)geopandas 底层依赖 GDAL读 Shapefile 时encoding参数会传给 GDAL 处理 .dbf 的编码。转 GeoJSON 时统一输出 UTF-8。注意如果读进来就已经是乱码说明源文件编码判断错了换个编码再试。GBK 和 GB2312 大部分情况通用但遇到生僻字可能有差异可以试 GB18030它兼容性更广。4.5 解法四直接改 .dbf 的编码声明Shapefile 的 .dbf 文件头部有一个字节记录编码信息LDID但很多工具不认这个字段。有个偏方是用工具直接改 .dbf 的编码比如用 LibreOffice 打开 .dbf 另存为指定编码或者用 Python 的dbf库读写。这个法子我不太推荐作为首选因为容易把文件改坏而且治标不治本。优先用解法一或解法三从读取环节就把编码定对。5. 转换后的数据校验与常见问题排查5.1 怎么确认转换结果没问题转完之后别急着用先做三步校验看属性表用 QGIS 或 geojson.io 打开确认中文地名正常显示没有问号或乱码。看几何确认边界形状正常没有坐标错位比如整个图形跑到海里去了。看体积如果文件特别大几十 MB 以上考虑用 mapshaper 的-simplify简化。简化命令示例mapshaper input.geojson -simplify 10% -o output.geojson10%表示保留 10% 的顶点具体比例按精度需求调。做全国地图展示简化到 5%~10% 通常够用体积能降一个数量级。5.2 坐标错位的排查坐标错位一般两个原因坐标系搞错了或者经纬度顺序反了。GeoJSON 规范里坐标顺序是[经度, 纬度]但有些数据源给的是 [纬度, 经度]。如果发现图形位置明显不对比如中国跑到南半球先检查坐标顺序。坐标系方面如果数据是投影坐标单位是米直接当经纬度用就会错得离谱。用 QGIS 看一下图层的坐标系信息确认是地理坐标度还是投影坐标米。5.3 属性字段丢失或错乱转换时偶尔会遇到属性字段丢失。常见原因是字段名超长或者含特殊字符Shapefile 对字段名有 10 字符限制。转 GeoJSON 时字段名会被截断导致后续按字段名取值取不到。解决办法转换前先把字段名改成简短的英文或者转换后用脚本重命名字段。5.4 大文件处理的内存问题全国级别的 GeoJSON 动辄上百 MB用网页工具打开容易卡死。这时候用命令行 mapshaper 处理它流式读取内存占用低先按省拆分再分别处理转成 TopoJSON它比 GeoJSON 体积小很多适合 Web 加载。TopoJSON 转换mapshaper input.geojson -o formattopojson output.topojson6. 从数据到落地几个实战场景的接法6.1 喂给 ECharts 做地图可视化ECharts 的 map 系列需要 GeoJSON而且要求注册地图名。流程是天地图取数 → mapshaper 转 GeoJSON注意编码→ 前端echarts.registerMap(china, geoJson)→ 配置 series。这里的关键是 GeoJSON 里的name字段要和 ECharts 配置里的数据 name 对应上否则上色对不上号。转换后检查一下 name 字段是不是中文正常。6.2 导入 PostGIS 做空间查询PostGIS 导入 GeoJSON 可以用ogr2ogrogr2ogr -f PostgreSQL PG:dbnamemydb userpostgres output.geojson -nln districts导入前确保 GeoJSON 是 UTF-8数据库也建 UTF-8 编码否则中文入库又乱。这一步和前面说的pythonsql 写入数据库中文是乱码是同一类问题根子都在编码不一致。6.3 在 ArcGIS Pro 里加载ArcGIS Pro 可以直接读 GeoJSON但要注意坐标系定义。如果 GeoJSON 没有 CRS 信息ArcGIS 可能默认按 WGS84 处理。加载后如果位置不对手动指定坐标系。另外ArcGIS Pro 加载在线天地图需要配置 WMTS 服务这个和本文的数据下载是两条线但经常一起用——底图用天地图在线服务业务图层用下载转换后的行政区划数据。6.4 批量处理多个省市的脚本化如果要处理全国 300 多个区县手动转不现实。写个 shell 脚本循环for f in ./raw/*.shp; do name$(basename $f .shp) mapshaper $f encodinggbk -simplify 10% -o formatgeojson ./out/$name.geojson done这样一次跑完每个文件都做了编码修正和简化。跑之前先拿一个文件测试参数确认没问题再全量跑。7. 几个我踩过的坑和对应经验第一个坑是编码参数加错位置。mapshaper 的encoding是输入侧参数我一开始以为是输出侧结果怎么转都是乱码。记住encoding 描述的是源文件是什么编码。第二个坑是GBK 和 GB2312 混用。大部分情况两者通用但遇到生僻地名比如一些带特殊字的地名GB2312 覆盖不全会丢字。统一用 GB18030 最稳它向下兼容 GBK 和 GB2312。第三个坑是简化过度导致边界变形。有次为了压体积把简化比例调到 1%结果海岸线变得像锯齿行政区边界也歪了。简化比例要根据展示层级定全国图可以狠一点市级图要保守。第四个坑是忘了检查坐标顺序。有批数据转完之后整个中国地图上下颠倒查了半天才发现源数据是 [纬度, 经度]。转换前先用 QGIS 看一眼能省很多事。第五个坑是key 的调用频率。天地图接口有频率限制批量拉数据时如果并发太高会被限流返回错误。加个延时或者分批拉别一次性怼上去。整体走下来这条链路的核心就三件事选对数据源、转换时显式指定编码、转完做校验。把这三件事做扎实行政区划数据的下载和格式转换基本不会再卡住你。mapshaper 这个工具值得花半小时熟悉一下命令行参数后面批量处理数据的时候会感谢自己。