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

前言

❝

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

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

在之前的文章中讲了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数据转换为Shp格式,本篇教程在之前一系列文章的基础上讲解如何使用GDAL将Shp转换为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
相关推荐
鬼手点金5 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
蛋蛋的就会顺顺的5 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday6 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室6 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
码艺-Alimjan6 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床6 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
子非鱼a8 小时前
【文件上传】一个普普通通的edu16
前端
美狐美颜SDK开放平台8 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
pride.li9 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
屏什么录9 小时前
电脑如何录屏幕视频和声音?从工具到代码,7 种方案帮你彻底搞定
前端·音视频开发