空間的な特徴を表すポイント、ライン、ポリゴンは一般的にジオメトリと呼ばれています。QGISでは QgsGeometry クラスで代表されます。すべてのジオメトリタイプは JTS discussion page でよく示されています。
時には1つのジオメトリは実際に単純な(シングルパート)ジオメトリの集合です。このような幾何学的形状は、マルチパートジオメトリと呼ばれています。単純にジオメトリのちょうど1種類が含まれている場合は、マルチポイント、マルチラインまたはマルチポリゴンと呼んでいます。例えば、複数の島からなる国は、マルチポリゴンのように表すことができます。
ジオメトリの座標値はどの座標参照系(CRS)も利用できます。レイヤーからフィーチャを持ってきたときに、ジオメトリの座標値はレイヤーのCRSのものを持つでしょう。
ジオメトリの作成にはいくつかのオプションがあります。
from coordinates:
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) ] ] )
座標値は QgsPoint クラスを使って与えられます。
ポリライン(ラインストリング)はポイントのリストで表現されます。ポリゴンは線形の輪(すなわち閉じたラインストリング)のリストで表現されます。最初の輪は外輪(境界)で、オプションとして続く輪がポリゴン内の穴となります。
マルチパートジオメトリはさらに上のレベルです: マルチポイントはポイントのリストで、マルチラインストリングはラインストリングのリストで、マルチポリゴンはポリゴンのリストです。
from well-known text (WKT):
gem = QgsGeometry.fromWkt("POINT (3 4)")
from well-known binary (WKB):
g = QgsGeometry()
g.setWkbAndOwnership(wkb, len(wkb))
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
他の手段として、 QGis.GeometryType 列挙型から一つの値を返す type() メソッドも使えます。さらに isMultipart() というジオメトリがマルチパートなのかどうかを調べてくれるヘルパー関数もあります。
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)]]
注意: このタプル (x, y) は本当のタプルではなく、これらは QgsPoint のオブジェクトで、この値は x() メソッド及び y() メソッドでアクセスできるようになっています。
マルチパートジオメトリ同士で似たようなアクセサ関数があります: asMultiPoint(), asMultiPolyline(), asMultiPolygon() です。
QGISはジオメトリ述部(contains(), intersects(), ...) や操作設定(union(), difference(), ...)のような上級のジオメトリ操作でGEOS ライブラリを使います。また、(ポリゴンの)面積や(ポリゴンや線などの)長さのようなジオメトリの幾何学的なプロパティを計算できます。
Here you have a small example that combines iterating over the features in a given layer and perfoming 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()
QgsGeometry クラスのこれらのメソッドを使って計算するとき、面積と周長はCRSを考慮しません。より強力な面積と距離計算のために、 QgsDistanceArea クラスが使うことができます。投影法が切り替わったら計算は平面的に行われます。そうでないと楕円体上で計算されます。楕円体がはっきりとセットされないとき、WGS84パラメータが計算のために使われます。
d = QgsDistanceArea()
d.setProjectionsEnabled(True)
print "distance in meters: ", d.measureLine(QgsPoint(10,10),QgsPoint(11,11))
あなたは、QGISに含まれているアルゴリズムの多くの例を見つけて、ベクタデータを分析し、変換するためにこれらのメソッドを使用することができます。ここにはそれらのいくつかのコードへのリンクを記載します。
距離と面積は QgsDistanceArea class: Distance matrix algorithm を使ってます。