news 2026/1/27 23:47:17

GDAL 实现创建几何对象

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GDAL 实现创建几何对象

前言

几何对象作为图层要素对象,具有点、线、面、多点、多线、多线等多种类型。每种类型都有自己独特的结构,在GIS开发中,需要掌握其组成结构和创建方式。

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

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

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

1. 开发环境

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

时间:2025年

系统:Windows 11

Python:3.11.7

GDAL:3.11.1

2. 创建点几何对象

定义一个方法CreatePoint用于创建点Shp图层,接收一个参数pointPath指向点文件路径。

"""
说明:创建点Shp图层
参数:
-pointPath:点文件路径
"
""
def CreatePoint(pointPath):

GDAL中使用Geometry方法创建点几何对象,需要传入一个几何对象类型参数,创建点时该参数为ogr.wkbPointGeometryTypeToName方法可以获取几何对象类型名称,如下输出“Point”。接着使用AddPoint将坐标点添加到点对象中。

# 创建点几何对象
pointGeometry = ogr.Geometry(ogr.wkbPoint)
geomeTypeName = ogr.GeometryTypeToName(pointGeometry.GetGeometryType())
# print(f"几何对象名称:{geomeTypeName}")
# 添加坐标点
pointGeometry.AddPoint(100.225207,27.665721)

如下为创建点Shp图层完整方法。

"""
说明:创建点几何对象
参数:
-pointPath:点文件路径
"
""
def CreatePoint(pointPath):
print("开始创建点对象")

# 添加shp数据驱动
shpDriver = gdal.GetDriverByName("ESRI Shapefile")

checkShpPath(pointPath,shpDriver)

# 创建shp数据源
shpDataSource = shpDriver.CreateDataSource(pointPath)
ifshpDataSource is None:
print("无法创建点Shp数据源,请检查文件!")
returnFalse

# 创建点数据图层
pointLayer = shpDataSource.CreateLayer("point",geom_type=ogr.wkbPoint)

# 添加id字段
fieldDefn = ogr.FieldDefn("id",ogr.OFTInteger)
pointLayer.CreateField(fieldDefn)

# 获取要素结构
featureDefn = pointLayer.GetLayerDefn()

# 创建要素对象
pointFeature = ogr.Feature(featureDefn)

points = [
"100.225207,27.665721",
"105.330257,29.948948",
"105.848739,23.856316",
"99.567134,23.892995"
]
# pointGeometry.AddPoint(100.225207,27.665721)
fori,pointinenumerate(points):
# print(f"点:{point}")
res = point.split(",")
# print(f"点:{res}")

# 创建点几何对象
pointGeometry = ogr.Geometry(ogr.wkbPoint)
geomeTypeName = ogr.GeometryTypeToName(pointGeometry.GetGeometryType())
# print(f"几何对象名称:{geomeTypeName}")

pointGeometry.AddPoint(float(res[0]),float(res[1]))

pointFeature.SetGeometry(pointGeometry)
pointFeature.SetField("id",i)
pointLayer.CreateFeature(pointFeature)

3. 创建线几何对象

定义一个方法CreatePolyline用于创建点Shp图层,接收一个参数polylinePath指向线文件路径。

"""
说明:创建线Shp图层
参数:
-polylinePath:线文件路径
"
""
def CreatePolyline(polylinePath):

使用Geometry方法创建线几何对象,将几何对象类型改为ogr.wkbLineString。接着使用AddPoint将坐标点添加到线对象中。

# 创建线几何对象
polylineGeometry = ogr.Geometry(ogr.wkbLineString)
geomeTypeName = ogr.GeometryTypeToName(polylineGeometry.GetGeometryType())
# 添加坐标点
polylineGeometry.AddPoint(100.225207,27.665721)
polylineGeometry.AddPoint(105.330257,29.948948)
polylineGeometry.AddPoint(105.848739,23.856316)
polylineGeometry.AddPoint(99.567134,23.892995)

如下为创建线Shp图层完整方法。

"""
说明:创建线Shp图层
参数:
-polylinePath:线文件路径
"
""
def CreatePolyline(polylinePath):
print("开始创建线对象")

# 添加shp数据驱动
shpDriver = gdal.GetDriverByName("ESRI Shapefile")

checkShpPath(polylinePath,shpDriver)

# 创建shp数据源
shpDataSource = shpDriver.CreateDataSource(polylinePath)
ifshpDataSource is None:
print("无法创建点Shp数据源,请检查文件!")
returnFalse

# 创建线数据图层
polylineLayer = shpDataSource.CreateLayer("polyline",geom_type=ogr.wkbLineString)

# 添加id字段
fieldDefn = ogr.FieldDefn("id",ogr.OFTInteger)
polylineLayer.CreateField(fieldDefn)

# 获取要素结构
featureDefn = polylineLayer.GetLayerDefn()

# 创建要素对象
pointFeature = ogr.Feature(featureDefn)
points = [
"100.225207,27.665721",
"105.330257,29.948948",
"105.848739,23.856316",
"99.567134,23.892995",
"100.225207,27.665721"
]
# pointGeometry.AddPoint(100.225207,27.665721)
# 创建线几何对象
polylineGeometry = ogr.Geometry(ogr.wkbLineString)
geomeTypeName = ogr.GeometryTypeToName(polylineGeometry.GetGeometryType())
polylineGeometry.AddPoint(100.225207,27.665721)
polylineGeometry.AddPoint(105.330257,29.948948)
polylineGeometry.AddPoint(105.848739,23.856316)
polylineGeometry.AddPoint(99.567134,23.892995)
# print(f"几何对象名称:{geomeTypeName}")
fori,pointinenumerate(points):
# print(f"点:{point}")
res = point.split(",")
# print(f"点:{res}")

polylineGeometry.AddPoint(float(res[0]),float(res[1]))

pointFeature.SetGeometry(polylineGeometry)
pointFeature.SetField("id",1)

polylineLayer.CreateFeature(pointFeature)

4. 创建面几何对象

定义一个方法CreatePolygon用于创建面Shp图层,接收一个参数polygonPath指向线文件路径。

"""
说明:创建面Shp图层
参数:
-polygonPath:面文件路径
"
""
def CreatePolygon(polygonPath):

在创建面几何对象之前需要先创建环形几何对象,类型参数为ogr.wkbLinearRing

# 创建一个环形Geometry
ringGeometry = ogr.Geometry(ogr.wkbLinearRing)
geomeTypeName = ogr.GeometryTypeToName(ringGeometry.GetGeometryType())

ringGeometry.AddPoint(100.225207,27.665721)
ringGeometry.AddPoint(105.330257,29.948948)
ringGeometry.AddPoint(105.848739,23.856316)
ringGeometry.AddPoint(99.567134,23.892995)

然后使用Geometry方法创建线面何对象,将几何对象类型改为ogr.wkbPolygon。接着使用AddGeometry将环形对象添加到面中。

# 创建面几何对象
polygonGeometry = ogr.Geometry(ogr.wkbPolygon)
# 添加环形对象
polygonGeometry.AddGeometry(ringGeometry)

此外还有一种带有孔洞的多边形需要注意一下,此时环形几何对象分为内环和外环两种类型。

# 创建一个外环Geometry
outRingGeometry = ogr.Geometry(ogr.wkbLinearRing)

outRingGeometry.AddPoint(100.225207,27.665721)
outRingGeometry.AddPoint(105.330257,29.948948)
outRingGeometry.AddPoint(105.848739,23.856316)
outRingGeometry.AddPoint(99.567134,23.892995)
outRingGeometry.AddPoint(100.225207,27.665721)
# 关闭环状几何
# outRingGeometry.CloseRings()

# 创建一个内环Geometry
inRingGeometry = ogr.Geometry(ogr.wkbLinearRing)

inRingGeometry.AddPoint(100.415207,27.665721)
inRingGeometry.AddPoint(104.550257,27.665721)
inRingGeometry.AddPoint(104.550257,24.456316)
inRingGeometry.AddPoint(100.415207,24.456316)
inRingGeometry.AddPoint(100.415207,27.665721)
# 关闭环状几何
# inRingGeometry.CloseRings()

# 创建面几何对象
polygonGeometry = ogr.Geometry(ogr.wkbPolygon)
polygonGeometry.AddGeometry(outRingGeometry)
polygonGeometry.AddGeometry(inRingGeometry)

对于面几何对象创建完成后需要关闭环状几何,可以调用几何对象CloseRings()或者在最后添加与第一个坐标相同点进行关闭。

outRingGeometry.CloseRings()
inRingGeometry.CloseRings()

如下为创建面Shp图层完整方法。

"""
说明:创建面Shp图层
参数:
-polygonPath:面文件路径
"
""
def CreatePolygon(polygonPath):
print("开始创建面对象")

# 添加shp数据驱动
shpDriver = gdal.GetDriverByName("ESRI Shapefile")

checkShpPath(polygonPath,shpDriver)

# 创建shp数据源
shpDataSource = shpDriver.CreateDataSource(polygonPath)
ifshpDataSource is None:
print("无法创建点Shp数据源,请检查文件!")
returnFalse

# 创建面数据图层
polygonLayer = shpDataSource.CreateLayer("polygon",geom_type=ogr.wkbPolygon)

# 添加id字段
fieldDefn = ogr.FieldDefn("id",ogr.OFTInteger)
polygonLayer.CreateField(fieldDefn)

# 获取要素结构
featureDefn = polygonLayer.GetLayerDefn()

# 创建要素对象
polygonFeature = ogr.Feature(featureDefn)

points = [
"100.225207,27.665721",
"105.330257,29.948948",
"105.848739,23.856316",
"99.567134,23.892995",
"100.225207,27.665721"
]
# pointGeometry.AddPoint(100.225207,27.665721)
# 创建一个环形Geometry
ringGeometry = ogr.Geometry(ogr.wkbLinearRing)
geomeTypeName = ogr.GeometryTypeToName(ringGeometry.GetGeometryType())

# print(f"几何对象名称:{geomeTypeName}")
fori,pointinenumerate(points):
print(f"点:{point}")
res = point.split(",")
print(f"点:{res}")

ringGeometry.AddPoint(float(res[0]),float(res[1]))

# 关闭环状几何
# or ringGeometry.CloseRings()

# 创建面几何对象
polygonGeometry = ogr.Geometry(ogr.wkbPolygon)
polygonGeometry.AddGeometry(ringGeometry)

polygonFeature.SetGeometry(polygonGeometry)
polygonFeature.SetField("id",1)

polygonLayer.CreateFeature(polygonFeature)

5. 总结

创建图层前第一步都是要需要获取数据驱动,如Shp数据驱动为"ESRI Shapefile"

# 添加shp数据驱动
shpDriver = gdal.GetDriverByName("ESRI Shapefile")

然后便可以创建数据源,并检查数据源是否创建成功。

# 创建shp数据源
shpDataSource = shpDriver.CreateDataSource(polygonPath)
ifshpDataSource is None:
print("无法创建点Shp数据源,请检查文件!")
returnFalse

创建目标图层,"polygon"为自定义参数,geom_type为图层几何类型,可以根据实际需求进行修改。此外,创建图层方法还可以传入一个坐标系参数,例子中就不展示了。

# 创建面数据图层
polygonLayer = shpDataSource.CreateLayer("polygon",geom_type=ogr.wkbPolygon)

图层创建完成之后,便可以添加一些属性表结构。通过ogr.FieldDefn创建字段域,并通过图层方法CreateField创建字段,使用方法GetLayerDefn()获取要素域。

# 添加id字段
fieldDefn = ogr.FieldDefn("id",ogr.OFTInteger)
polygonLayer.CreateField(fieldDefn)

# 获取要素结构
featureDefn = polygonLayer.GetLayerDefn()

# 创建要素对象
polygonFeature = ogr.Feature(featureDefn)

创建几何对象。

ringGeometry = ogr.Geometry(ogr.wkbLinearRing)
geomeTypeName = ogr.GeometryTypeToName(ringGeometry.GetGeometryType())

fori,pointinenumerate(points):
# print(f"点:{point}")
res = point.split(",")
# print(f"点:{res}")

ringGeometry.AddPoint(float(res[0]),float(res[1]))

# 关闭环状几何
# or ringGeometry.CloseRings()

# 创建面几何对象
polygonGeometry = ogr.Geometry(ogr.wkbPolygon)
polygonGeometry.AddGeometry(ringGeometry)

将几何对象和属性字段添加到要素中,之后使用图层方法CreateFeature创建图层要素。

polygonFeature.SetGeometry(polygonGeometry)
polygonFeature.SetField("id",1)

polygonLayer.CreateFeature(polygonFeature)

至此,大功告成。在ArcMap中打开成果显示如下。

小提示:

  1. 例子中创建的数据图层并未加上坐标信息,有兴趣的读者可以自行实现。
  2. 文中只实现了点、线、面对象,对于多点、多线和多面几何类型也留给感兴趣的读者自行实现!

对于GDAL中几何对象类型不太了解的同学可以参考文章:14、GDAL 数据类型大全[1]

参考资料
[1]

14、GDAL 数据类型大全:https://www.yuque.com/u37362584/pg4zca/rgnavd9498ca5gzg

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

vm3dum_loader.dll文件问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/1/24 10:51:14

vds_ps.dll文件损坏丢失找不到 下载方法免费分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/1/27 7:28:35

【Spring源码】getBean源码实战总结

getBean源码实战总结 代码仓库:Gitee 仓库链接 本文档是对 getBean 源码实战系列文章的总结,建议先阅读完整的系列文章后再阅读本文。 回顾整个系列 从getBean源码实战(一)开始,我们一步步深入 Spring 的 getBean() 方…

作者头像 李华
网站建设 2026/1/14 18:31:31

增强提示词套件核心板

💡为大语言模型安装人工智能操作系统 🌐人工智能探索系统:连续场运算提示词探索问题 请根据任务语义密度自动适配处理深度:简单任务快捷响应完整结果,复杂问题自动整合全网络状态演化输出,默认隐藏中间过程…

作者头像 李华