Outdated version of the documentation. Find the latest one here.

ジオメトリの操作

空間的な特徴を表すポイント、ライン、ポリゴンは一般的にジオメトリと呼ばれています。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に含まれているアルゴリズムの多くの例を見つけて、ベクタデータを分析し、変換するためにこれらのメソッドを使用することができます。ここにはそれらのいくつかのコードへのリンクを記載します。