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

相关推荐
Surmon15 分钟前
基于 Cloudflare 生态的 AI Agent 实现
前端·人工智能·架构
六月June June5 小时前
自定义调色盘组件
前端·javascript·调色盘
SY_FC5 小时前
实现一个父组件引入了子组件,跳转到其他页面,其他页面返回回来重新加载子组件函数
java·前端·javascript
糟糕好吃5 小时前
我让 AI 操作网页之后,开始不想点按钮了
前端·javascript·后端
陈天伟教授6 小时前
人工智能应用- 天文学家的助手:08. 星系定位与分类
前端·javascript·数据库·人工智能·机器学习
VaJoy6 小时前
给到夯!前端工具链新标杆 Vite Plus 初探
前端·vite
小彭努力中7 小时前
191.Vue3 + OpenLayers 实战:可控化版权信息(Attribution)详解与完整示例
前端·javascript·vue.js·#地图开发·#cesium
奇舞精选7 小时前
用去年 github 最火的 n8n 快速实现自动化推送工具
前端·agent
奇舞精选7 小时前
实践:如何为智能体推理引入外部决策步骤
前端·agent
无限大68 小时前
AI实战02:一个万能提示词模板,搞定90%的文案/设计/分析需求
前端·后端