GIS 数据转换:使用 GDAL 将 Shp 转换为 GeoJSON 数据

前言

GeoJSON 作为一种通用的地理数据格式,可以很方便地用于共享交换。在 GIS 开发中,经常需要进行数据的转换处理,其中常见的便是将 Shp 转换为 GeoJSON 数据进行展示。

有关GeoJSON数据的详细介绍,请参考往期文章:GeoJSON 数据简介

在之前的文章中讲了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数据转换为Shp格式,本篇教程在之前一系列文章的基础上讲解如何使用GDALShp转换为GeoJSON数据。

  • GDAL 简介
  • GDAL 下载安装
  • GDAL 开发起步

如果你还没有看过,建议从以上内容开始。

1. 开发环境

本文使用如下开发环境,以供参考。

时间:2025年

系统:Windows 11

Python:3.11.7

GDAL:3.11.1

2. 数据准备

如下是本文选取的世界边界范围的Shp数据结构:

3. 导入依赖

Shp作为一种矢量数据格式,可以使用矢量库OGR进行处理,以实现Shp数据转换为GeoJSON格式。还需要引入osr模块用于坐标定义以及json模块用于几何数据转换。

javascript 复制代码
from osgeo import ogr,osr
import os
import json

4. 数据读取与转换

定义一个方法Shp2GeoJSON(shpPath,jsonPath)用于将Shp数据转换为GeoJSON数据。

python 复制代码
"""
说明:将 GeoJSON 文件转换为 Shapfile 文件
参数:
    -shpPath:Shp 文件路径
    -jsonPath:GeoJSON 文件路径
"""
def Shp2GeoJSON(shpPath,jsonPath):

在进行GeoJSON数据格式转换之前,需要检查Shp数据路径是否存在。

lua 复制代码
# 检查文件是否存在
if os.path.exists(shpPath):
    print("shp 文件存在。")
else:
    print("shp 文件不存在,请检查数据路径!")
    return

打开Shp数据源。

ini 复制代码
# 读取Shp文件
shpDataSource = ogr.Open(shpPath)
shpLayer = shpDataSource.GetLayer()

首先构造一个GeoJSON空数据结构,用于填充Shp属性数据。

makefile 复制代码
# 构造GeoJSON对象
geoJSON = {
    "type":"FeatureCollection",
    "features":[]
}

读取并遍历Shp图层,将几何对象以及属性对象复制到GeoJSON对象中。使用ExportToJson方法将几何数据转换为JSON格式,然后使用json.loads方法进行加载,属性读取完成之后,将要素添加到要素集合中。

ini 复制代码
# 遍历所有要素
for feature in shpLayer:
    # 几何对象
    geom = feature.GetGeometryRef()
    # 构造GeoJSON Feature对象
    featureJSON = {
        "type":"Feature",
        "geometry":json.loads(geom.ExportToJson()),
        "property":{}
    }

    # 获取属性
    fieldCount = feature.GetFieldCount()
    for i in range(fieldCount):
        fieldName = feature.GetFieldDefnRef(i).GetName()
        fieldValue = feature.GetField(i)
        featureJSON["property"][fieldName] = fieldValue

    # 添加要素
    geoJSON["features"].append(featureJSON)

Shp数据读取完成之后,将其保存到GeoJSON文件中,并关闭数据源。

ini 复制代码
# 写入文件
with open(jsonPath,"w",encoding="UTF-8") as f:
    json.dump(geoJSON,f,ensure_ascii=False, indent=2)

# 关闭数据源
shpDataSource = None
相关推荐
崔庆才丨静觅3 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60614 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅4 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅4 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅5 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊5 小时前
jwt介绍
前端
爱敲代码的小鱼5 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax