news 2026/3/28 12:17:27

GDAL 实现矢量数据读写

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GDAL 实现矢量数据读写

GIS 数据的读写作为一个基础操作,是每一个GISer的必修课。在使用GDAL读取矢量数据时,需要掌握其基本的数据结构与类型,了解常用的数据读取方法,这样开发时才会起到事半功倍的效果。

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

  • GDAL 简介
  • GDAL 下载安装
  • GDAL 开发起步
  • GDAL 实现 GIS 数据读取转换(全)

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

1. 开发环境

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

时间:2025年

系统:Windows 11

Python:3.11.7

GDAL:3.11.1

2. 矢量数据读取接口

GDAL中,矢量数据模型遵循下图所示结构。从数据驱动->数据源->图层->属性。

2.1. 获取数据源

GDAL中可以使用Open方法直接打开数据源,进而读取图层数据。在GDAL Python API中,DriverDataset类在Raster API文档中,既适用于矢量数据,也适用于栅格数据。

"""
说明:用于打开数据源
参数:
-utf8_path:字符串,数据源路径
-update:布尔值类型,默认值False,是否以更新模式打开数据集(默认为只读模式)
返回值:返回数据集或者None
"
""
def Open(utf8_path,update=False)

如下以只读模式打开Shp数据源。

dataSource = ogr.Open(shpPath,False)# False表示只读,True表示可写

除了ogrOpen方法之外,也可以使用gdal模块的打开方法

2.2. 获取图层

GDAL获取图层的常用方法为GetLayer,该方法只有一个参数。iLayer值固定为0,对shapefile图层来说是可选项。

"""
说明:从数据集获取图层
参数:
-iLayer:整型或字符串,图层名称或者基于0的图层索引值。
返回值:返回图层或者None
"
""
def GetLayer(iLayer=0)

获取数据集中索引值为0的图层。

# 获取图层
layer = dataSource.GetLayer(0)

除了GetLayer方法之外,还有一个GetLayerByIndex方法用于获取图层。

"""
说明:根据索引获取图层
参数:
-index:整型,图层索引值。
返回值:返回图层或者None
"
""
def GetLayerByIndex(index)

图层索引值处于0GetLayerCount() - 1之间。最后还有个GetLayerCount方法用于获取图层数量。从数据集中获取图层数量。

# 获取图层数量
layerCount = dataset.GetLayerCount()
print(f"图层数量:{layerCount}")

2.3. 获取投影信息

GetProjectionGetProjectionRef方法都可以用于读取坐标系统,两者都返回一个字符串类型WKT格式的数据集空间参考信息。从图层获取投影信息。

# 图层投影
projectionRef = layer.GetProjectionRef()
print(f"空间参考:{projectionRef}")

此外还有一个方法GetSpatialRef也可用于获取数据集空间参考信息。从图层获取空间参考信息。

# 图层空间参考
spatialRef = layer.GetSpatialRef()
print(f"空间参考:{spatialRef}")

2.4. 获取要素

在知道FId(要素编号)的情况下,可以直接使用GetFeature方法获取要素。

# 获取指定要素
feature = layer.GetFeature(0)

也可以通过GetNextFeature方法遍历要素特征,并且返回一个要素Feature。此方法适用于少数几个OGRLayer.GetNextFeature()效率不高的驱动程序,但总体而言,OGRLayer.GetNextFeature()是一个更自然的API。从图层读取要素特征。

# 获取要素
feature = layer.GetNextFeature()
limitCount = 0
# 限制打印前十个要素
whilefeature and limitCount < 10:
print(f"打印第【{limitCount+1}】个要素")

GetFeatureCount方法用于获取图层要素数量。

# 获取图层要素数量
layerFeatureCount = layer.GetFeatureCount()
print(f"要素数量:{layerFeatureCount}")

2.5. 获取属性结构

GetLayerDefn方法用于获取图层属性表,返回要素定义信息。获取图层属性。

# 获取图层属性
layerProperty = layer.GetLayerDefn()

GetFieldCount方法用于获取字段数量。读取图层要素数量。

# 获取图层名称
layerName = layer.GetName()
# 获取图层要素数量
layerFeatureCount = layer.GetFeatureCount()

GetFieldDefn用于获取字段定义信息,其中包括字段名称,字段类型。读取属性表结构。

# 获取图层属性
layerProperty = layer.GetLayerDefn()
# 获取图层字段数量
fieldCount = layerProperty.GetFieldCount()
print(f"字段数量:{fieldCount}")

# 获取字段信息
forjinrange(fieldCount):
# 获取字段属性对象
fieldProperty = layerProperty.GetFieldDefn(j)
# 获取字段属性名称
fieldName = fieldProperty.GetName()
# 获取字段属性类型
fieldType = fieldProperty.GetTypeName()

print(f"第 【{j}】 个字段名称:{fieldName},字段类型:{fieldType}")

GetField用于获取属性字段值,参数可以是字符串字段名,也可以是字段索引值。GetGeometryRef方法用于获取要素几何对象信息。读取几何对象。

# 读取几何属性
geom = feature.GetGeometryRef()

2.6. 获取图层范围

GetExtent获取图层四至范围。

# 获取范围
extent = layer.GetExtent()

3. 矢量数据修改接口

Driver(驱动程序)是一个知道如何执行特定功能的对象与某种数据类型(如shapefile),为了读写数据,就需要一个合适的驱动程序。本文以下的数据修改都已shapefile驱动为例进行讲解。

3.1. 获取目标数据驱动

首先需要导入ogr模块用于处理矢量数据。GetDriverByName方法可以根据名称获取数据驱动。

from osgeo import ogr,osr

# 获取Shp数据驱动
shpDriver = ogr.GetDriverByName('ESRI Shapefile')

3.2. 创建数据源

CreateDataSource方法根据文件路径创建数据源。

# 创建Shp数据源
shpDataSource = shpDriver.CreateDataSource(shpPath)

3.3. 创建图层

通过CreateLayer方法创建图层,该方法具有四个参数,图层名称、坐标系统以及几何类型是必传。

# 创建点图层
layer = shpDataSource.CreateLayer("points",srs,ogr.wkbPoint)

3.4. 创建属性字段

通过CreateField方法创建属性字段。

iffield notin[lonField, latField]:
# 创建字段定义
fieldDefn = ogr.FieldDefn(field, ogr.OFTString)
fieldDefn.SetWidth(254)
# 直接创建字段,不要存储 FieldDefn 对象
layer.CreateField(fieldDefn)

3.5. 创建几何对象

要素对象方法SetGeometry可以创建几何对象。

# 创建几何对象
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(lon,lat)
feature.SetGeometry(point)

3.6. 创建要素

通过图层方法CreateFeature创建要素。

# 创建要素
feature = ogr.Feature(layer.GetLayerDefn())

# 设置属性
forfieldinfieldnames:
iffield notin[lonField, latField]:
feature.SetField(field, str(row[field]))
# 创建几何
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(lon,lat)
feature.SetGeometry(point)

# 保存要素
layer.CreateFeature(feature)

4. 关闭数据源

为了防止内存泄露问题发生,在确定数据读取完成后需要关闭数据源。

# 关闭数据源
dataSource = None

# 关闭要素
feature.Destroy()
# feature = None

小提示

GDAL中的方法采用大驼峰命名法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 10:58:59

将HunyuanOCR集成进企业OA系统:实现合同自动归档与审批

将HunyuanOCR集成进企业OA系统&#xff1a;实现合同自动归档与审批 在一家中型制造企业的法务部门&#xff0c;每天要处理超过50份来自不同国家的采购与销售合同。这些文件格式五花八门——有的是扫描件模糊不清&#xff0c;有的是PDF嵌套多语言内容&#xff0c;还有的包含复杂…

作者头像 李华
网站建设 2026/3/25 4:08:36

【数学建模】基于模型的预测控制的建筑热环境多模型对比Matlab仿真,通过 5 种不同的热模型(参考模型、简化电容模型、墙体模型、空气模型、空气 - 墙体耦合模型)仿真建筑室内温度

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1…

作者头像 李华
网站建设 2026/3/17 0:27:26

xhEditor pdf导入识别表格和图表

企业网站Word粘贴与导入功能解决方案 作为山西IT行业的PHP工程师&#xff0c;我最近正在评估如何为企业网站后台管理系统集成Word粘贴和文档导入功能。以下是针对这一需求的详细技术分析方案。 需求分析 客户需要实现两个核心功能&#xff1a; Word粘贴功能&#xff1a;从W…

作者头像 李华
网站建设 2026/3/27 0:37:59

文件自动化管理方案技术文章大纲

临时文件自动化管理方案技术文章大纲背景与需求分析临时文件的定义与常见类型&#xff08;缓存、日志、下载文件等&#xff09;未自动化管理的痛点&#xff1a;磁盘空间占用、安全风险、性能影响自动化管理的核心目标&#xff1a;清理效率、资源优化、安全合规技术实现方案文件…

作者头像 李华
网站建设 2026/3/14 4:17:31

跨境电商适用:HunyuanOCR多语言商品标签识别与翻译一体化

跨境电商中的多语言商品标签智能解析&#xff1a;HunyuanOCR的端到端实践 在跨境电商平台上&#xff0c;用户上传一张日本护肤品的包装照片&#xff0c;几秒钟后&#xff0c;原本看不懂的日文成分表和保质期信息就以清晰的中文结构化文本呈现出来——这背后并非多个模型接力工…

作者头像 李华
网站建设 2026/3/15 17:50:01

基于vLLM加速的腾讯混元OCR API服务部署实践(支持高并发请求)

基于vLLM加速的腾讯混元OCR API服务部署实践&#xff08;支持高并发请求&#xff09; 在企业数字化转型不断深入的今天&#xff0c;文档自动化处理已成为金融、政务、教育和跨境电商等领域的核心需求。传统OCR系统虽然成熟&#xff0c;但在面对复杂版式、多语言混合、高并发访问…

作者头像 李华