GeoJSON 转 shp(Shapefile)完整指南
GeoJSON 转 shp 最常用两种方式:QGIS 右键导出(图形化),或命令行 ogr2ogr。转换时重点处理三件事——字段名截断、中文乱码、混合几何类型。本文给出完整命令与避坑清单,坐标可选 WGS84 或 CGCS2000。
为什么要转成 shp?两种格式的区别
GeoJSON 面向 Web 与开发,Shapefile 是桌面 GIS 与单位交付的传统标准。先看清差异再决定是否转换。
| 对比项 | GeoJSON | Shapefile(shp) |
|---|---|---|
| 文件形态 | 单个 .geojson 文本文件,随 JSON 结构完整 | 由 .shp / .shx / .dbf / .prj 等多个文件组成,需整体拷贝 |
| 适用场景 | Web 地图、ECharts、Leaflet、Mapbox、Python 分析 | ArcGIS、QGIS 桌面分析,期刊投稿、单位交接的标准格式 |
| 编码 | 固定 UTF-8,中文无压力 | DBF 属性表编码需显式指定(常见坑:中文乱码) |
| 字段限制 | 字段名长度宽松 | 字段名最长 10 个字符,超长会被截断 |
| 坐标系 | 通常 WGS84(EPSG:4326)经纬度 | 可含投影信息(.prj),支持 WGS84 / CGCS2000 / 投影坐标 |
用 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)有什么区别?▶
转出来的 shp 中文变乱码怎么办?▶
-lco ENCODING=UTF-8;用 QGIS 导出时在保存对话框选择编码 UTF-8。已乱码的文件可在 QGIS 图层属性里把数据源编码改为 GBK 或 UTF-8 重读。转成 shp 后字段名被截断了怎么解决?▶
可以用在线工具转吗?安全吗?▶
从哪获取可靠的行政区划边界 GeoJSON?▶
需要现成的行政区划边界数据?
省、市、区县边界可 地图分区下载省市区县边界;乡镇边界与全国整级打包请在 整级打包页 选购;村界数据请在 村级边界页 按省获取。统一 WGS84 坐标、含行政区划代码,买断永久有效。若要把代码用于统计挂接,可参考 行政区划代码查询与统计挂接指南。