几何处理¶

Docs in progress for 'QGIS testing'. Visit https://docs.qgis.org/3.4 for QGIS 3.4 docs and translations.

如果您在Pyqgis控制台之外,则此页上的代码段需要以下导入:

from qgis.core import (
  QgsGeometry,
  QgsPoint,
  QgsPointXY,
  QgsWkbTypes,
  QgsProject,
  QgsFeatureRequest,
  QgsDistanceArea
)

表示空间特征的点、线串和多边形通常称为几何图形。在QGIS中,它们用 QgsGeometry 班级。

有时一个几何体实际上是简单(单部分)几何体的集合。这样的几何体称为多部分几何体。如果它只包含一种简单的几何图形,我们称之为多点、多线串或多多边形。例如,由多个岛屿组成的国家可以表示为多多边形。

几何图形的坐标可以在任何坐标参考系(CRS)中。从图层中提取特征时,关联的几何图形将在图层的CRS中具有坐标。

所有可能的几何结构和关系的描述和规范可在 OGC Simple Feature Access Standards 有关高级详细信息。

几何构造

PYQGIS为创建几何图形提供了几个选项:

访问几何图形

首先,您应该找到几何类型。这个 wkbType() 方法就是要使用的方法。它返回 QgsWkbTypes.Type 枚举

gPnt.wkbType() == QgsWkbTypes.Point
# output: True
gLine.wkbType() == QgsWkbTypes.LineString
# output: True
gPolygon.wkbType() == QgsWkbTypes.Polygon
# output: True
gPolygon.wkbType() == QgsWkbTypes.MultiPolygon
# output: False

作为一种选择,人们可以使用 wkbType() 返回值的方法 QgsWkbTypes.GeometryType 枚举。

您可以使用func:`wkbtype()<qgis.core.qgswkbtypes.displayString>`函数获取人类可读的几何类型。

gPnt.wkbType()
# output: 1
QgsWkbTypes.displayString(int(gPnt.wkbType()))
# output: 'Point'

还有一个助手函数 isMultipart() 以确定几何体是否为多部分。

要从几何图形中提取信息,每个向量类型都有访问函数。下面是如何使用这些访问器的示例:

gPnt.asPoint()
# output: <QgsPointXY: POINT(1 1)>
gLine.asPolyline()
# output: [<QgsPointXY: POINT(1 1)>, <QgsPointXY: POINT(2 2)>]
gPolygon.asPolygon()
# output: [[<QgsPointXY: POINT(1 1)>, <QgsPointXY: POINT(2 2)>, <QgsPointXY: POINT(2 1)>, <QgsPointXY: POINT(1 1)>]]

注解

元组(x,y)不是真的元组,它们是 QgsPoint 对象,可以使用 x() ()和 y() 方法。

对于多部分几何图形,有类似的访问函数: asMultiPoint()asMultiPolyline()asMultiPolygon()

qgis.core.qgsgeometry.asmultipoint.。索引::几何体;谓词和操作

几何谓词和运算

qgis使用geos库进行高级几何操作,如几何谓词( contains()intersects() ,…)和设置操作( combine()difference() ,……)它还可以计算几何图形的几何特性,例如面积(对于多边形)或长度(对于多边形和直线)

让我们来看一个例子,它结合了对给定层中的特征进行迭代,并根据它们的几何图形执行一些几何计算。下面的代码将计算并打印 countries 我们的QGIS教程项目中的图层。

以下代码假定 layer 是一个 QgsVectorLayer 具有多边形功能类型的对象。

# let's access the 'countries' layer
layer = QgsProject.instance().mapLayersByName('countries')[0]

# let's filter for countries that begin with Z, then get their features
query = '"name" LIKE \'Z%\''
features = layer.getFeatures(QgsFeatureRequest().setFilterExpression(query))

# now loop through the features, perform geometry computation and print the results
for f in features:
  geom = f.geometry()
  name = f.attribute('NAME')
  print(name)
  print('Area: ', geom.area())
  print('Perimeter: ', geom.length())

现在,您已经计算并打印了几何图形的面积和周长。不过,您可能很快就会注意到这些值是奇怪的。这是因为面积和周长在使用 area()length() 方法来自 QgsGeometry 班级。对于更强大的面积和距离计算, QgsDistanceArea 可以使用类,它可以执行基于椭圆体的计算:

以下代码假定 layer 是一个 QgsVectorLayer 具有多边形功能类型的对象。

d = QgsDistanceArea()
d.setEllipsoid('WGS84')

layer = QgsProject.instance().mapLayersByName('countries')[0]

# let's filter for countries that begin with Z, then get their features
query = '"name" LIKE \'Z%\''
features = layer.getFeatures(QgsFeatureRequest().setFilterExpression(query))

for f in features:
  geom = f.geometry()
  name = f.attribute('NAME')
  print(name)
  print("Perimeter (m):", d.measurePerimeter(geom))
  print("Area (m2):", d.measureArea(geom))

  # let's calculate and print the area again, but this time in square kilometers
  print("Area (km2):", d.convertAreaMeasurement(d.measureArea(geom), QgsUnitTypes.AreaSquareKilometers))

或者,您可能想知道两点之间的距离和方位。

d = QgsDistanceArea()
d.setEllipsoid('WGS84')

# Let's create two points.
# Santa claus is a workaholic and needs a summer break,
# lets see how far is Tenerife from his home
santa = QgsPointXY(25.847899, 66.543456)
tenerife = QgsPointXY(-16.5735, 28.0443)

print("Distance in meters: ", d.measureLine(santa, tenerife))

您可以找到许多包含在QGIS中的算法示例,并使用这些方法来分析和转换矢量数据。下面是一些链接到它们的代码。