ShapelyはGEOSを利用して図形操作などを行う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()