QGISのプラグイン作成 インターセクトによる地物選択


はじめに

調査ツールの「場所による選択」と同じような、選択したオブジェクトに交差するオブジェクトを抽出するプラグインのサンプルを作成しました。


このサンプルの使い方

ここからzipファイルをダウンロードしてインストールします。インストールできたら、intersectselect_sample.pyの以下の部分を変更します。

        selectLayer = QgsProject.instance().mapLayersByName('〇〇')[0]
        intersectLayer = QgsProject.instance().mapLayersByName('〇〇')[0]

1行目の〇〇には、抽出したいオブジェクトのレイヤ名を設定してください。
2行目の〇〇には、オブジェクトの抽出に使うオブジェクトのレイヤ名を設定してください。

f:id:Chiakikun:20200607141639p:plain

ポリゴンを選択した状態でプラグインを実行すると...

 

f:id:Chiakikun:20200607141651p:plain

選択したポリゴンに重なるポイントの地物が選択状態になります。


コード

~略~
    def intersectSelect1(self, selectLayer, intersectLayer):
        selectLayer.removeSelection()

        sel = []
        for feat in intersectLayer.selectedFeatures():
            geom = feat.geometry()

            cands = selectLayer.getFeatures(QgsFeatureRequest().setFilterRect(geom.boundingBox()))
            for sf in cands:
                if geom.intersects(sf.geometry()):
                    sel.append(sf.id())
            selectLayer.select(sel)
~略~

    def start(self):
        selectLayer = QgsProject.instance().mapLayersByName('〇〇')[0]
        intersectLayer = QgsProject.instance().mapLayersByName('〇〇')[0]

        self.intersectSelect1(selectLayer, intersectLayer)
~略~

9行目 選択したオブジェクトの矩形で、抽出したいレイヤのオブジェクトを大雑把に抽出して...
11行目 矩形で抽出できたオブジェクトが、選択したオブジェクトに交差すれば、IDを取得して...
13行目 取得できたIDのレコードを選択状態にしています。
ソース全文


遅いので他の方法を...

「場所による選択」と比べると処理時間がとてもかかるので、プラグインから「場所による選択」を実行する方法も載せます。


コード2

~略~
    def intersectSelect2(self, selectLayer, intersectLayer):
        qgis.processing.run("native:selectbylocation",\
            {\
            'INPUT':selectLayer,\
            'PREDICATE':[0],\
            'INTERSECT':QgsProcessingFeatureSourceDefinition(intersectLayer.name(), selectedFeaturesOnly=True),\
            'METHOD':0\
            })


    def start(self):
        selectLayer = QgsProject.instance().mapLayersByName('〇〇')[0]
        intersectLayer = QgsProject.instance().mapLayersByName('〇〇')[0]

        self.intersectSelect2(selectLayer, intersectLayer)
~略~

インストールした状態では、intersectselect_sample.pyの62行目(上のコードでは16行目)が「self.intersectSelect1」になっているので、「self.intersectSelect2」に変更すると、「場所による選択」をプラグインで実行するメソッドが呼ばれます。


ここではprocessingのselectbylocationというアルゴリズムを使いました。その他どのようなアルゴリズムがあるのか調べたい場合は、pythonコンソールで以下のコードを入力してください。

from qgis import processing
for algorithm in QgsApplication.processingRegistry().algorithms():
        print(algorithm.id() + "@" + algorithm.displayName())

また、アルゴリズムの詳細な使い方は、pythonコンソールで以下のコードを入力すれば表示することができます。

processing.algorithmHelp("アルゴリズム名")

参考にしたサイト

stackoverflow.com

gis.stackexchange.com


最後までご覧頂き、ありがとうございました