GDAL 创建矢量图层的两种方式

^ 关注我,带你一起学GIS ^

前言

矢量数据的读写效率是决定生产质量的关键指标,如何选择高效且准确的的方法需要开发者根据实际需求进行选择。

由于本文由一些前置知识,在正式开始之前,需要你掌握一定的Python开发基础和GDAL的基本概念。在之前的文章中讲解了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数据转换为Shp格式,可以作为基础入门学习。本篇教程在之前一系列文章的基础上讲解如何使用GDAL 创建矢量图层的两种方式

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

1. 开发环境

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

时间:2025年

系统:Windows 11

Python:3.11.7

GDAL:3.11.1

2. 要素结构创建

根据要素结构创建这种方式,在获取到属性域之后直接根据字段定义创建字段结构。使用图层方法CreateField写入属性字段。

ini 复制代码
# 获取源数据结构
featureDefn = sourceLayer.GetLayerDefn()
# 获取源数据字段数量
fieldCount = featureDefn.GetFieldCount()

# 添加属性结构
for i in range(fieldCount):
    fieldDefn = featureDefn.GetFieldDefn(i)
    # 添加字段
    targetLayer.CreateField(fieldDefn)

之后遍历图层要素,使用图层方法CreateFeature写入要素数据。

yaml 复制代码
# 添加要素
for feature in sourceLayer:    
    targetLayer.CreateFeature(feature)   

3. 遍历属性创建

直接遍历属性这种方式的话,首先需要根据源数据属性域使用ogr.Feature(featureDefn)方法创建一个空要素,然后向该目标要素写入几何对象和属性字段以及对应的属性值。要素对象方法SetGeometry可用于赋值几何对象,SetField方法用于添加属性字段,该方法的第一个参数具有两种形式,可以传入字段索引值或者字段名称。最后调用图层方法CreateFeature创建要素。

ini 复制代码
# 获取源数据结构
featureDefn = sourceLayer.GetLayerDefn()
# 获取源数据字段数量
fieldCount = featureDefn.GetFieldCount()

# 写入图层数据
for feature in sourceLayer:
   # 创建投影要素
   tarFeature = ogr.Feature(featureDefn)

   # 添加几何对象
   geom = feature.GetGeometryRef()
   tarFeature.SetGeometry(geom)

   # 添加属性字段
   for i in range(fieldCount):
       # 获取字段信
       fieldDefn = featureDefn.GetFieldDefn(i)
       fieldName = fieldDefn.GetName()
       fieldValue = feature.GetField(i)

       # print(f"字段域:{fieldDefn}")
       # print(f"字段名:{fieldName}")
       # print(f"字段值:{fieldValue}")

       # 写入字段对象
       # tarFeature.SetField(i,fieldValue)
       tarFeature.SetField(fieldName,value)

    targetLayer.CreateFeature(tarFeature)    

4. 注意事项

windows开发环境中同时安装GDALPostGIS,其中投影库PROJ的环境变量指向PostGIS的安装路径,在运行GDAL程序时,涉及到要素、几何与投影操作时会导致异常。具体意思为GDAL不支持PostGIS插件中的投影库版本,需要更换投影库或者升级版本。

RuntimeError: PROJ: proj_identify: D:Program FilesPostgreSQL13sharecontribpostgis-3.5projproj.db contains DATABASE.LAYOUT.VERSION.MINOR = 2 whereas a number >= 5 is expected. It comes from another PROJ installation.

解决办法为修改PROJ的环境变量到GDAL支持的版本或者在GDAL程序开头添加以下代码:

python 复制代码
os.environ['PROJ_LIB'] = r'D:\Programs\Python\Python311\Libsite-packages\osgeo\data\proj'

OpenLayers示例数据下载,请在公众号后台回复:ol数据

全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试

GIS之路 公众号已经接入了智能 助手,可以在对话框进行提问,也可以直接搜索历史文章进行查看。

都看到这了,不要忘记点赞、收藏 + 关注

本号不定时更新有关 GIS开发 相关内容,欢迎关注


GeoTools 开发合集(全)

OpenLayers 开发合集

GDAL 实现矢量数据转换处理(全)

GDAL 实现投影转换

国产版的Google Earth,吉林一号卫星App"共生地球"来了

2026年全国自然资源工作会议召开

日本欲打造"本土版"星链系统

吉林一号国内首张高分辨率彩色夜光卫星影像发布

2025 年度信创领军企业名单出炉!

相关推荐
小目标一个亿2 小时前
Windows平台Nginx配置web账号密码验证
linux·前端·nginx
rocky1912 小时前
网页版时钟
前端·javascript·html
Aotman_3 小时前
Element-UI Message Box弹窗 使用$confirm方法自定义模版内容,修改默认样式
linux·运维·前端
计算机程序设计小李同学3 小时前
基于SSM框架的动画制作及分享网站设计
java·前端·后端·学习·ssm
一只小阿乐3 小时前
vue-web端实现图片懒加载的方
前端·javascript·vue.js
牛马1113 小时前
Flutter 多语言
前端·flutter
by————组态3 小时前
集成详细说明
前端·物联网·信息可视化·组态·组态软件
我是小疯子664 小时前
jQuery快速入门指南
前端
傻啦嘿哟4 小时前
Python中的@property:优雅控制类成员访问的魔法
前端·数据库·python