ジオメトリの操作

空間的な特徴を表すポイント、ライン、ポリゴンは一般的にジオメトリと呼ばれています。QGISでは:class:QgsGeometry クラスで代表されます。すべてのジオメトリタイプは `JTS discussion page <http://www.vividsolutions.com/jts/discussion.htm#spatialDataModel>`_でよく示されています。

Sometimes one geometry is actually a collection of simple (single-part) geometries. Such a geometry is called a multi-part geometry. If it contains just one type of simple geometry, we call it multi-point, multi-linestring or multi-polygon. For example, a country consisting of multiple islands can be represented as a multi-polygon.

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

ジオメトリの構成

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

  • 座標値から:

    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 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)

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

#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. When an ellipsoid is not set explicitly, WGS84 parameters are used for calculations.

d = QgsDistanceArea()
d.setProjectionsEnabled(True)

print "distance in meters: ", d.measureLine(QgsPoint(10,10),QgsPoint(11,11))

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