Points, linestrings and polygons that represent a spatial feature are commonly referred to as geometries. In QGIS they are represented with the QgsGeometry class.
時には1つのジオメトリは実際に単純な(シングルパート)ジオメトリの集合です。このような幾何学的形状は、マルチパートジオメトリと呼ばれています。単純ジオメトリが1種類だけ含まれている場合は、マルチポイント、マルチラインまたはマルチポリゴンと呼んでいます。例えば、複数の島からなる国は、マルチポリゴンとして表現できます。
ジオメトリの座標値はどの座標参照系(CRS)も利用できます。レイヤーから地物を持ってきたときに、ジオメトリの座標値はレイヤーのCRSのものを持つでしょう。
Description and specifications of all possible geometries construction and relationships are available in the OGC Simple Feature Access Standards for advanced details.
There are several options for creating a geometry:
座標から
gPnt = QgsGeometry.fromPoint(QgsPoint(1,1))
gLine = QgsGeometry.fromPolyline([QgsPoint(1, 1), QgsPoint(2, 2)])
gPolygon = QgsGeometry.fromPolygon([[QgsPoint(1, 1), QgsPoint(2, 2),
QgsPoint(2, 1)]])
Coordinates are given using QgsPoint class.
Polyline (Linestring) is represented by a list of points. Polygon is represented by a list of linear rings (i.e. closed linestrings). First ring is outer ring (boundary), optional subsequent rings are holes in the polygon.
マルチパートジオメトリはさらに上のレベルです: マルチポイントはポイントのリストで、マルチラインストリングはラインストリングのリストで、マルチポリゴンはポリゴンのリストです。
well-knownテキスト(WKT)から
gem = QgsGeometry.fromWkt("POINT(3 4)")
Well-Knownバイナリ(WKB)から
>>> g = QgsGeometry()
>>> wkb = '010100000000000000000045400000000000001440'.decode('hex')
>>> g.fromWkb(wkb)
>>> g.exportToWkt()
'Point (42 5)'
First, you should find out geometry type, wkbType() method is the one to use — it returns a value from QGis.WkbType enumeration
>>> gPnt.wkbType() == QGis.WKBPoint
True
>>> gLine.wkbType() == QGis.WKBLineString
True
>>> gPolygon.wkbType() == QGis.WKBPolygon
True
>>> gPolygon.wkbType() == QGis.WKBMultiPolygon
False
As an alternative, one can use type() method which returns a value from QGis.GeometryType enumeration. There is also a helper function isMultipart() to find out whether a geometry is multipart or not.
To extract information from geometry there are accessor functions for every vector type. How to use accessors
>>> gPnt.asPoint()
(1, 1)
>>> gLine.asPolyline()
[(1, 1), (2, 2)]
>>> gPolygon.asPolygon()
[[(1, 1), (2, 2), (2, 1), (1, 1)]]
ノート
The tuples (x,y) are not real tuples, they are QgsPoint objects, the values are accessible with x() and y() methods.
For multipart geometries there are similar accessor functions: asMultiPoint(), asMultiPolyline(), asMultiPolygon().
QGIS uses GEOS library for advanced geometry operations such as geometry predicates (contains(), intersects(), ...) and set operations (union(), difference(), ...). It can also compute geometric properties of geometries, such as area (in the case of polygons) or lengths (for polygons and lines)
Here you have a small example that combines iterating over the features in a given layer and performing some geometric computations based on their geometries.
# we assume that 'layer' is a polygon layer
features = layer.getFeatures()
for f in features:
geom = f.geometry()
print "Area:", geom.area()
print "Perimeter:", geom.length()
Areas and perimeters don’t take CRS into account when computed using these methods from the QgsGeometry class. For a more powerful area and distance calculation, the QgsDistanceArea class can be used. If projections are turned off, calculations will be planar, otherwise they’ll be done on the ellipsoid.
d = QgsDistanceArea()
d.setEllipsoid('WGS84')
d.setEllipsoidalMode(True)
print "distance in meters: ", d.measureLine(QgsPoint(10,10),QgsPoint(11,11))
QGISに含まれているアルゴリズムの多くの例を見つけて、これらのメソッドをベクターデータを分析し変換するために使用できます。ここにそれらのコードのいくつかへのリンクを記載します。
Additional information can be found in following sources: