QGIS API: Shapelyを利用するには

ShapelyGEOSを利用して図形操作などを行うPythonライブラリです。
QGISにはfToolsがあるので大体はこれで事足りますが、自作のプラグインで利用したい場合に重宝することがあるかもしれません。

Shapelyのインストールは、WindowsならばOSGeo4Wから行うことができます。

プラグインからの利用法

要はQgsGeometry型とShapelyのデータ型との間で相互変換出来ればいいということになるかとおもいます。
ここで採用する方法の順番としては、QgsGeometryからShapelyのデータ型に変換 => 何か操作 => ShapelyからQgsGeometryへ、という流れになります。

なお、1.8のAPIドキュメントにはasGeos()fromGeos()なる関数があるので、これを利用できる可能性があります。
その場合はShapelyのloads()dumps()を使わずに直接変換することができそうですが、
手元のQGIS 1.8ではそんな関数は無いといって怒られたのでこのようにしています。

例として、id=0のポリゴンをやや縮小して新しい要素として登録するコードを示します。

   1: from PyQt4.QtCore import *
   2: from qgis.core import *
   3: 
   4: from shapely.geometry import polygon
   5: from shapely.wkb import dumps, loads
   6: 
   7: 
   8: 	def erodePoly(self):
   9: 		layer = self.iface.activeLayer()
  10: 		provider = layer.dataProvider()
  11: 		feat = QgsFeature()
  12: 		provider.featureAtId(0, feat, True)
  13: 		geometry = feat.geometry()
  14: 
  15: 		# QgsGeometryからWKBをエクスポートしてShapelyにロード
  16: 		sh_poly = loads(geometry.asWkb())
  17: 		
  18: 		# ポリゴンを縮小
  19: 		sh_poly_eroded = sh_poly.buffer(-1.0)
  20: 		
  21: 		# ShapelyからWKBをエクスポートしてQgsGeometryにセット
  22: 		newGeom = QgsGeometry()
  23: 		newGeom.fromWkb(dumps(sh_poly_eroded))
  24: 		
  25: 		# QgsFeatureにQgsGeometryをセット
  26: 		newFeat = QgsFeature()
  27: 		newFeat.setGeometry(newGeom)
  28: 		
  29: 		# この例は属性は適当です
  30: 		newFeat.addAttribute(0, QVariant(2))
  31: 		
  32: 		# レイヤーに作成した要素を追加
  33: 		layer.startEditing()
  34: 		layer.addFeature(newFeat)
  35: 		layer.commitChanges()
アーカイブ