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为创建几何图形提供了几个选项:
从坐标系
gPnt = QgsGeometry.fromPointXY(QgsPointXY(1,1))
gLine = QgsGeometry.fromPolyline([QgsPoint(1, 1), QgsPoint(2, 2)])
gPolygon = QgsGeometry.fromPolygonXY([[QgsPointXY(1, 1),
QgsPointXY(2, 2), QgsPointXY(2, 1)]])
坐标使用 QgsPoint
类或 QgsPointXY
班级。这些课程的区别在于 QgsPoint
支撑M和Z尺寸。
折线(linestring)由点列表表示。
多边形由一系列线性环(即闭合线串)表示。第一个环是外环(边界),可选的后续环是多边形中的孔。请注意,与某些程序不同,QGIS将为您关闭环,因此无需将第一个点复制为最后一个点。
多部分几何更进一步:多点是点列表,多线字符串是线字符串列表,多多边形是多边形列表。
来自已知文本(WKT)
gem = QgsGeometry.fromWkt("POINT(3 4)")
来自已知二进制(WKB)
g = QgsGeometry()
wkb = bytes.fromhex("010100000000000000000045400000000000001440")
g.fromWkb(wkb)
# print WKT representation of the geometry
print(g.asWkt())
首先,您应该找到几何类型。这个 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)>]]
对于多部分几何图形,有类似的访问函数: 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中的算法示例,并使用这些方法来分析和转换矢量数据。下面是一些链接到它们的代码。