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

相关推荐
于慨20 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
石小石Orz20 小时前
油猴脚本实现生产环境加载本地qiankun子应用
前端·架构
从前慢丶20 小时前
前端交互规范(Web 端)
前端
CHU72903521 小时前
便捷约玩,沉浸推理:线上剧本杀APP功能版块设计详解
前端·小程序
GISer_Jing21 小时前
Page-agent MCP结构
前端·人工智能
王霸天21 小时前
💥别再抄网上的Scale缩放代码了!50行源码教你写一个永不翻车的大屏适配
前端·vue.js·数据可视化
小领航21 小时前
用 Three.js + Vue 3 打造炫酷的 3D 行政地图可视化组件
前端·github
@大迁世界21 小时前
2026年React大洗牌:React Hooks 将迎来重大升级
前端·javascript·react.js·前端框架·ecmascript
PieroPc21 小时前
一个功能强大的 Web 端标签设计和打印工具,支持服务器端直接打印到局域网打印机。Fastapi + html
前端·html·fastapi
悟空瞎说21 小时前
深入 Vue3 响应式:为什么有的要加.value,有的不用?从设计到源码彻底讲透
前端·vue.js