今回は、指定レイヤの中で最も近い地物の取得方法を紹介します。
次回は、最も近い点の取得方法にしようと考えています。
最近点は何回か使用しているのですが、完璧とはいえない感じだったので
バージョンアップで改善されてると、うれしいです。
プラグインで最近点を使う時には、先に最近地物を取得する必要があります。
最近点を取得する時に、必要なものはQgsGeometry,Pointが必要だからです。
最近点取得の第一歩の最近地物を取得していきます。
最近地物は、QgsSpatialIndexを使えば簡単に取得できます。
point = QgsPoint(0, 0) # 適当なポイント layer = iface.activeLayer() features = layer.getFeatures() spatial = QgsSpatialIndex(features) spatial_ids = spatial.nearestNeighbor(point, 1) # spatialにある地物の中で、ポイントに近い地物を1つ取得 # 重なっている場合は、1つ以上になる # 返り値は, featureidのリストになっている request = QgsFeatureRequest() request = request.setFilterFids(spatial_ids) features = layer.getFeatures(request) # QgsFeatureを取得したいなら、requestでfeatureidでフィルターをかけて取得する
以下は、マップをクリックすると、レイヤの最近地物を選択する簡単なプラグインです。
# -*- coding: utf-8 -*- from PyQt4.QtGui import QAction, QIcon import os from qgis.core import QgsSpatialIndex from qgis.gui import QgsMapToolEmitPoint class plugin(object): def __init__(self, iface): self.iface = iface self.canvas = iface.mapCanvas() self.layer = None self.map_tool = QgsMapToolEmitPoint(self.canvas) self.spatial = None def initGui(self): icon_path = os.path.dirname(__file__) + u'/icon/qgis-icon.png' self.action = QAction(QIcon(icon_path), u'最近地物', self.iface.mainWindow()) self.action.triggered.connect(self.run) self.iface.addToolBarIcon(self.action) self.map_tool.canvasClicked.connect(self.select_near_feature) def unload(self): self.iface.removeToolBarIcon(self.action) if self.map_tool == self.canvas.mapTool(): self.canvas.setMapTool(self.iface.actionPan()) def run(self): self.layer = self.iface.activeLayer() features = self.layer.getFeatures() self.spatial = QgsSpatialIndex(features) self.canvas.setMapTool(self.map_tool) def select_near_feature(self, point): spatial_ids = self.spatial.nearestNeighbor(point, 1) self.layer.setSelectedFeatures(spatial_ids) return