行政区划边界数据库
矢量格式转换 · QGIS / ogr2ogr

GeoJSON 转 shp(Shapefile)完整指南

GeoJSON 转 shp 最常用两种方式:QGIS 右键导出(图形化),或命令行 ogr2ogr。转换时重点处理三件事——字段名截断、中文乱码、混合几何类型。本文给出完整命令与避坑清单,坐标可选 WGS84 或 CGCS2000。

格式差异

为什么要转成 shp?两种格式的区别

GeoJSON 面向 Web 与开发,Shapefile 是桌面 GIS 与单位交付的传统标准。先看清差异再决定是否转换。

对比项GeoJSONShapefile(shp)
文件形态单个 .geojson 文本文件,随 JSON 结构完整由 .shp / .shx / .dbf / .prj 等多个文件组成,需整体拷贝
适用场景Web 地图、ECharts、Leaflet、Mapbox、Python 分析ArcGIS、QGIS 桌面分析,期刊投稿、单位交接的标准格式
编码固定 UTF-8,中文无压力DBF 属性表编码需显式指定(常见坑:中文乱码)
字段限制字段名长度宽松字段名最长 10 个字符,超长会被截断
坐标系通常 WGS84(EPSG:4326)经纬度可含投影信息(.prj),支持 WGS84 / CGCS2000 / 投影坐标
提示:仅做可视化或 Python 分析时,GeoJSON 往往更顺手;需要进 ArcGIS、投稿制图或按单位格式交付时,再转 shp。
方法一

用 QGIS 图形化导出 shp

不写命令,鼠标点几下即可完成,适合零散文件。

① 打开文件

打开 QGIS,菜单「图层」→「添加图层」→「添加矢量图层」,选择你的 .geojson 文件,确定后地图画布即显示边界。

② 右键导出

在图层面板右键该图层 →「导出」→「另存为」,格式选择 ESRI Shapefile,并勾选"将文件保存为 UTF-8"(避免中文乱码)。

③ 指定坐标系

在"CRS"下拉选择目标坐标系:WGS84(EPSG:4326)或 CGCS2000(EPSG:4490)。点击确定即生成 .shp 全套文件。

方法二

用 ogr2ogr 命令行转换(可批量)

GDAL 自带的 ogr2ogr 是命令行转换标准工具,一条命令即可完成格式转换、坐标重投影与编码处理,适合批量。

# 基础转换
ogr2ogr -f "ESRI Shapefile" out.shp in.geojson

# 转 shp 同时指定输出坐标系(如 CGCS2000 / WGS84)
ogr2ogr -f "ESRI Shapefile" -t_srs EPSG:4326 out.shp in.geojson

# 解决中文乱码:属性表强制 UTF-8 编码
ogr2ogr -f "ESRI Shapefile" -lco ENCODING=UTF-8 out.shp in.geojson

# 混合 Polygon / MultiPolygon 时统一提升为 MultiPolygon
ogr2ogr -f "ESRI Shapefile" -nlt PROMOTE_TO_MULTI out.shp in.geojson

参数说明:-t_srs 指定目标坐标系;-lco ENCODING 控制 DBF 属性表编码;-nlt PROMOTE_TO_MULTI 统一几何类型避免转换报错。需要安装 GDAL(Windows 可用 OSGeo4W 或 conda 安装)。

避坑清单

转换常见的 5 个坑与解决

以下问题覆盖绝大多数 shp 转换事故,逐一对照检查。

① 中文乱码

GeoJSON 是 UTF-8,若生成 DBF 时用了系统默认编码(中文 Windows 常为 GBK),属性表中文会乱码。转换时指定 -lco ENCODING=UTF-8,或在 QGIS 导出时勾选 UTF-8。

② 字段名截断

DBF 字段名上限 10 个字符,population_density 会被截成 population。转换前把字段名改短,是唯一稳妥做法。

③ 混合几何类型

一个文件同时含 Polygon 与 MultiPolygon 时,shp 只能存单一类型。加 -nlt PROMOTE_TO_MULTI 统一为 MultiPolygon。

④ 面积计算偏差

WGS84 经纬度算面积会偏小;需要精确面积时,先投影到合适坐标系(如 CGCS2000 高斯投影或 UTM),再量算。

⑤ 漏拷文件

shp 由 .shp/.shx/.dbf/.prj 等组成,拷贝或上传时缺一个就打开失败。建议整体打包后传输。

常见问题

GeoJSON 转 shp 常见问题

GeoJSON 和 Shapefile(shp)有什么区别?
GeoJSON 是 JSON 文本格式,一个 .geojson 文件即完整数据,适合 Web 与开发场景;shp 是 Shapefile,由 .shp/.shx/.dbf/.prj 等多个文件组成,是桌面 GIS(ArcGIS、QGIS)与单位交付的传统标准。两者都可表示点、线、面,按需转换即可。
转出来的 shp 中文变乱码怎么办?
乱码通常因编码不一致:GeoJSON 是 UTF-8,而部分工具默认用本地编码(如 GBK)写 DBF。用 ogr2ogr 时加 -lco ENCODING=UTF-8;用 QGIS 导出时在保存对话框选择编码 UTF-8。已乱码的文件可在 QGIS 图层属性里把数据源编码改为 GBK 或 UTF-8 重读。
转成 shp 后字段名被截断了怎么解决?
Shapefile 的 DBF 属性表限制字段名最长 10 个字符,GeoJSON 里较长的字段名会被截断或加后缀。转换前把属性名改短(不超过 10 个字符)是最稳妥的做法,例如 population_density 改为 pop_density。
可以用在线工具转吗?安全吗?
可以。在线转换(如 geojson.io、地图数据工具)适合小文件与临时转换;边界数据涉及坐标与字段,建议本地用 QGIS 或 ogr2ogr 转换,避免上传大文件与数据泄露风险,也便于批量处理。
从哪获取可靠的行政区划边界 GeoJSON?
若需要可直接使用的省、市、区县、乡镇、村五级边界 GeoJSON(WGS84 坐标、含行政区划代码字段),可在行政区划边界数据库按区域选购或整级打包下载,无需自行爬取与整理。

需要现成的行政区划边界数据?

省、市、区县边界可 地图分区下载省市区县边界;乡镇边界与全国整级打包请在 整级打包页 选购;村界数据请在 村级边界页 按省获取。统一 WGS84 坐标、含行政区划代码,买断永久有效。若要把代码用于统计挂接,可参考 行政区划代码查询与统计挂接指南