ジオメトリの操作

空間的な特徴を表すポイント、ライン、ポリゴンは一般的にジオメトリと呼ばれています。QGISでは QgsGeometry クラスで代表されます。すべてのジオメトリタイプは JTS discussion page でよく示されています。

時には1つのジオメトリは実際に単純な(シングルパート)ジオメトリの集合です。このような幾何学的形状は、マルチパートジオメトリと呼ばれています。単純にジオメトリのちょうど1種類が含まれている場合は、マルチポイント、マルチラインまたはマルチポリゴンと呼んでいます。例えば、複数の島からなる国は、マルチポリゴンのように表すことができます。

ジオメトリの座標値はどの座標参照系(CRS)も利用できます。レイヤーからフィーチャを持ってきたときに、ジオメトリの座標値はレイヤーのCRSのものを持つでしょう。

ジオメトリの構成

ジオメトリの作成にはいくつかのオプションがあります。

  • 座標値から:

    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 クラスを使って与えられます。

    ポリライン(ラインストリング)はポイントのリストで表現されます。ポリゴンは線形の輪(すなわち閉じたラインストリング)のリストで表現されます。最初の輪は外輪(境界)で、オプションとして続く輪がポリゴン内の穴となります。

    マルチパートジオメトリはさらに上のレベルです: マルチポイントはポイントのリストで、マルチラインストリングはラインストリングのリストで、マルチポリゴンはポリゴンのリストです。

  • well-known text (WKT) から:

    gem = QgsGeometry.fromWkt("POINT (3 4)")
    
  • well-known binary (WKB) から:

    g = QgsGeometry()
    g.setWkbAndOwnership(wkb, len(wkb))
    

ジオメトリにアクセス

まずはじめにジオメトリの種類を調べましょう、 wkbType() メソッドは一つの方法です — これは QGis.WkbType 列挙型から一つの値を返します:

>>> gPnt.wkbType() == QGis.WKBPoint
True
>>> gLine.wkbType() == QGis.WKBLineString
True
>>> gPolygon.wkbType() == QGis.WKBPolygon
True
>>> gPolygon.wkbType() == QGis.WKBMultiPolygon
False

他の手段として、 QGis.GeometryType 列挙型から一つの値を返す type() メソッドも使えます。さらに isMultipart() というジオメトリがマルチパートなのかどうかを調べてくれるヘルパー関数もあります。

全てのベクタータイプにジオメトリから情報を展開するのに使えるアクセサ関数があります。アクセサはこのように使います:

>>> 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 ライブラリを使います。また、(ポリゴンの)面積や(ポリゴンや線などの)長さのようなジオメトリの幾何学的なプロパティを計算できます。

ここでは、与えられたレイヤ内の地物を繰り返し処理し、そのジオメトリに基づいていくつかの幾何学的な計算を組み合わせた簡単な例があります。

# 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に含まれているアルゴリズムの多くの例を見つけて、ベクタデータを分析し、変換するためにこれらのメソッドを使用することができます。ここにはそれらのいくつかのコードへのリンクを記載します。

追加の情報はfollowinf sourcesで見つけることができます: