怎么把JSON文件转为SHP:完整流程与工具指南
在地理信息系统(GIS)数据处理中,经常需要将不同格式的数据相互转换,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,常用于存储结构化数据(如坐标点、区域边界等),而SHP(Shapefile)是ESRI公司开发的矢量数据格式,是GIS软件(如ArcGIS、QGIS)的通用格式,将JSON转为SHP,能更好地兼容GIS工具,实现空间数据的可视化、分析和制图,本文将详细介绍JSON文件转为SHP的完整流程,包括格式解析、工具选择、操作步骤及注意事项。
理解JSON与SHP的核心差异
在转换前,需明确两者的数据结构差异,避免转换后信息丢失:
-
JSON:是一种文本格式,用键值对(Key-Value)存储数据,支持嵌套结构,空间数据通常以“坐标数组”形式存储,例如点数据为
[longitude, latitude],线/面数据为坐标数组集合。
示例(点数据JSON):{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "name": "北京", "population": 2154 }, "geometry": { "type": "Point", "coordinates": [116.4074, 39.9042] } } ] } -
SHP:是一种矢量数据格式,由多个文件组成(如
.shp存储几何数据,.dbf存储属性数据,.shx存储索引),仅支持“几何+属性”的扁平化结构,无嵌套,几何类型包括点(Point)、线(LineString)、面(Polygon)等,需符合OGC(开放地理空间信息联盟)标准。
转换前的准备工作
确认JSON的空间参考(坐标系)
JSON本身不包含坐标系信息,需提前确认数据的坐标系(如WGS84 EPSG:4326,或CGCS2000 EPSG:4490),若坐标系不明确,转换后可能导致地理定位错误,需通过元数据或数据来源确认。
检查JSON的几何结构
JSON中的几何数据需符合GeoJSON规范(推荐)或类似结构,常见类型包括:
- 点(Point):
"type": "Point", "coordinates": [x, y] - 线(LineString):
"type": "LineString", "coordinates": [[x1,y1], [x2,y2], ...] - 面(Polygon):
"type": "Polygon", "coordinates": [[[x1,y1], [x2,y2], ..., [x1,y1]]](闭合环)
若JSON为非GeoJSON格式(如纯坐标数组),需先通过代码或工具将其整理为GeoJSON结构,否则转换工具可能无法识别。
确保属性数据完整
SHP的属性数据存储在.dbf文件中,JSON中的properties字段需为“键值对”且数据类型一致(如字符串、数字、日期),避免嵌套属性(如"properties": {"address": {"city": "北京"}}),需提前扁平化处理(如改为"properties": {"city": "北京"})。
JSON转SHP的常用方法
根据数据量和技术基础,可选择以下三种主流方法:GIS软件工具法(适合无编程基础)、编程代码法(适合批量/自动化处理)、在线转换工具(适合小数据量)。
GIS软件工具法(以QGIS为例)
QGIS是免费开源的GIS软件,支持直接导入JSON并导出SHP,操作简单,适合新手。
操作步骤:
- 安装QGIS:从官网(https://qgis.org/)下载并安装对应版本。
- 导入JSON文件:
- 打开QGIS,点击菜单栏“图层 → 添加图层 → 添加 delimited text layer”(添加分隔文本图层)。
- 在弹窗中点击“文件”选择JSON文件,勾选“点坐标”“线坐标”或“面坐标”(根据JSON几何类型选择),并设置X/Y字段对应JSON中的坐标字段(如
coordinates[0]为经度,coordinates[1]为纬度)。 - 若JSON为标准GeoJSON,可直接通过“图层 → 添加图层 → 添加矢量图层”导入,QGIS会自动识别几何和属性。
- 检查数据:导入后,JSON的几何和属性会显示在QGIS图层中,可通过“属性”工具点击要素查看信息,确保坐标和属性正确。
- 导出为SHP:
- 右键点击图层,选择“导出 → 要素另存为…”。
- 在“格式”下拉菜单选择“Shapefile”,设置输出路径和文件名。
- 点击“OK”完成导出,生成
.shp、.dbf、.shx等文件。
优点:无需编程,可视化操作;缺点:处理大数据量时效率较低。
编程代码法(以Python为例)
Python是GIS自动化的常用语言,通过geopandas和fiona库可实现JSON与SHP的高效转换,适合批量处理或集成到其他流程中。
环境准备:
安装必要库:
pip install geopandas fiona
操作步骤:
-
读取JSON文件:
若JSON为GeoJSON格式,可直接用geopandas.read_file()读取:import geopandas as gpd # 读取JSON文件(支持路径或字符串) gdf = gpd.read_file("data.geojson") print(gdf.head()) # 查看前5行数据若JSON为非GeoJSON格式(如嵌套结构),需先转换为GeoJSON:
import json from shapely.geometry import Point, shape # 示例:非GeoJSON格式的点数据 json_data = [ {"name": "北京", "population": 2154, "coords": [116.4074, 39.9042]}, {"name": "上海", "population": 2487, "coords": [121.4737, 31.2304]} ] # 转换为GeoJSON格式 features = [] for item in json_data: geom = Point(item["coords"]) # 创建点几何对象 feature = { "type": "Feature", "geometry": geom.__geo_interface__, # 转为GeoJSON接口 "properties": {k: v for k, v in item.items() if k != "coords"} # 属性(排除坐标) } features.append(feature) geojson = {"type": "FeatureCollection", "features": features} # 保存为临时GeoJSON文件 with open("temp.geojson", "w") as f: json.dump(geojson, f) # 用geopandas读取 gdf = gpd.read_file("temp.geojson") -
设置坐标系(关键步骤):
若JSON未定义坐标系,需手动设置(如WGS84 EPSG:4326):if gdf.crs is None: gdf.set_crs("EPSG:4326", inplace=True) # 设置坐标系 -
导出为SHP:
output_shp = "output.shp" gdf.to_file(output_shp, encoding="utf-8") # 保存为SHP,指定编码避免中文乱码 print(f"SHP文件已保存至:{output_shp}")
注意事项:
- 中文路径或属性需设置
encoding="utf-8",避免乱码。 - 若JSON几何类型复杂(如含“MultiPoint”),需确保
shapely库支持(新版已支持)。 - 大数据量(百万级坐标)时,建议分块处理或使用
dask库加速。
在线转换工具法
若数据量小(如MB级)且无需本地处理,可使用在线工具快速转换。
推荐工具:
- Mapshaper(https://mapshaper.com/):支持JSON、GeoJSON转SHP,操作简单。
- Aconvert(https://www.aconvert.com/geojson/):支持多种地理格式互转,无需注册。
操作步骤(以Mapshaper为例):
- 打开Mapshaper网站,点击“导入”按钮上传JSON文件。
- 在工具栏选择“导入 → GeoJSON”或直接拖拽文件(若



还没有评论,来说两句吧...