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 年度信创领军企业名单出炉!

相关推荐
rosmis20 小时前
地铁病害检测系统软件改进记录-2-02
开发语言·前端·javascript
css趣多多20 小时前
解决ui组件flex1容器底部被撑开的问题
前端
乔江seven21 小时前
【python轻量级Web框架 Flask 】2 构建稳健 API:集成 MySQL 参数化查询与 DBUtils 连接池
前端·python·mysql·flask·web
Alaaaaaaan21 小时前
[DevOps]使用github-action工具部署docker容器(实现提交代码一键推送部署到服务器)
服务器·前端·docker·容器·github
摇滚侠21 小时前
css 设置边框
前端·css
星爷AG I1 天前
9-24 视觉叙事(AGI基础理论)
前端·人工智能
2501_940007891 天前
Flutter for OpenHarmony三国杀攻略App实战 - 鸿蒙适配与打包发布
前端·flutter
css趣多多1 天前
跨域问题及Vue项目中本地/线上解决方法核心总结
前端
光影少年1 天前
前端 AIGC
前端·aigc
启山智软1 天前
供应链商城核心功能模块清单
java·前端·开源