ポリゴンのラスター統計を計算する方法は?


14

ベクターレイヤーのポリゴンごとにラスターポイント(マルチバンド)の合計、平均などを計算するにはどうすればよいですか。これは「ゾーン統計」と呼ばれると言われました。最初にQGISで試しました。

それを行う方法はありますが、それは非常に遅すぎます(ラスターをベクターに変換し、2番目のベクターレイヤーと交差し、ジオメトリを計算し、数値をエクスポートし、スプレッドシートまたは他のプログラムで統計を計算し、結果を再インポートし、永遠に時間がかかります350.000ラスターポイント)。

私はまた、サガギを使用するヒントを与えられました。これには「ゾーン統計」がありますが、これらはベクターレイヤーのポリゴンではなく、ラスターバンドのカテゴリに基づいています。したがって、これを使用するには、ベクターレイヤーをラスターに変換してから統計情報を計算する必要があります。

これはこれを解決する間違った方法のようです。2つ以上のポリゴンに属しているラスタポイントは、ポリゴン境界と交差しているため、それらを考慮する方法はありません。ポリゴンベースの統計でこれを処理できるはずだと思うので、正しいモジュールがまだ見つからなかったと思います。

Saga-gisには本当に多くのモジュールがあります。このアプリケーションに適したものを教えてください。


Rudivonstadenのソリューションを試しています。最後の2つのコマンドを入力すると、次のエラーメッセージが表示されます。>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer、rasterfile)Traceback(most recent call last):File "<input>" 、1行目の<module> AttributeError: 'module'オブジェクトには属性 'analysis'がありません>>> zonalstats.calculateStatistics(None)トレースバック(最後の最後の呼び出し):ファイル "<input>"、1行目、<module > NameError:name 'zonalstats'は定義されていませんコマンドが正しいのか、使用しているラスターファイルが正しい形式であるのか疑問に思っていますか?ありがとう!
ダン・ウルフ

こんにちはダン。Stackexchangeは、フォーラムとは少し異なります。目的は、継続的な議論ではなく、Q&Aタイプの対話を行うことです。元の質問への回答があなたが知る必要があるものを解決しない場合、コメントセクションで説明を求めるか、新しい質問をすることを検討すべきです。
ジェイ・グァルネリ

ダン、コメントありがとうございます。私の答えは、必要なimportステートメントが欠落していたため、修正する必要があります。
-rudivonstaden

回答:


22

私はまったく同じことをするのに苦労していましたが、さまざまな理由でQGISの使用に取り組んでいます。GRASSプラグインとSextanteプラグインを使用してv.rast.statsを使用してみました。後者のアプローチは、統計を一時的なベクターレイヤーに添付して削除するため、失敗しました。GRASSプラグインは機能しましたが、重複するポリゴンを処理しません。

(有望なZonalStatsプラグインのソースで)いくつか掘り下げた後、QGISには実際にAPIに組み込まれたゾーン統計メソッドがあり、これらにはPythonバインディングもあることがわかりました。したがって、ポリゴンフィーチャのcountsumおよびmean統計のみを探している限り、現在、Pythonコンソール([プラグイン]> [Pythonコンソール])は、統計をポリゴン属性テーブルにアタッチする最も簡単な方法です。

  1. TOCでラスターレイヤーを選択し、コンソールに次のように入力します(ラスターレイヤーのソースファイル名を取得します)

    >>> rasterfile = qgis.utils.iface.mapCanvas().currentLayer().source()

  2. ベクターレイヤーを選択し、コンソールで次のコマンドを実行します(ベクターレイヤー自体を取得します)

    >>> vectorlayer = qgis.utils.iface.mapCanvas().currentLayer()

  3. コンソールで次の3つのコマンドを実行します(ベクターレイヤーとラスターファイルをQGISの組み込みゾーン統計計算機に渡します)

    >>> import qgis.analysis

    >>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)

    >>> zonalstats.calculateStatistics(None)

結果は、ポリゴンレイヤーの追加フィールドとして追加されます。

ゾーン統計

新しいフィールドに接頭辞を追加する場合(合計、平均、およびカウントとしてではなく)、手順3の最初のコマンドを次のように置き換えます(「zonal_」を使用する場合)プレフィックス:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")

1
+1 qgis.analysis.QgsZonalStatistics()
アーロン

そこ帯状統計プラグインは、QGISであるので、おそらく自分で言及したコマンドを実行する必要はありません。docs.qgis.org/2.2/en/docs/user_manual/plugins/... かしら、計算の最大値と最小値の可能性がない理由値も。
マタンテッド

私はあなたのテクニックを使用しましたが、それはいくつかのポリゴンを削除します:(
niahoo

6

最後にそれを見つけました:Saga-GISでカテゴリポリゴンとデータグリッドを開いてから、シェイプ->グリッド->グリッド値->グリッドのグリッド統計を開きます



3

この問題は少し前にすでに解決されたようですが、最近自分でいくつかのラスター統計情報が必要になったので、スープにスプーンを追加します。

rudivonstadenによって記述されたQGIS方法論は、ヒントをありがとう、魅力のように機能しました。しかし、私の場合は、ポリゴン内のラスター値の最小値と最大値、およびQGISで見つけることができなかった機能も知りたいと思っていました。GMEのisectpolyrst関数を使用して解決策を見つけましたが、これはGISの問題を解決するための私のお気に入りであり、この関数は必要な統計だけでなく、かなり迅速に提供してくれました。

PS。GMEには少し不幸な依存関係があります(ArcGIS)。そのため、プログラム自体は誰でも無料で利用できますが、実行するにはArcGISが必要です。ただし、ArcGIS(あらゆるレベルのライセンス)をお持ちの場合は、試してみることをお勧めします。

編集:

必要な統計を入手しましたが、実際の数値を見て少し急いで結論に飛び込んだことがわかりました。統計を取得します、はい、ただしラスターの最初のバンドについてのみです。そのため、3バンドラスターイメージで操作する場合、統計は不完全です。元の投稿でチャンネルの数を指摘する必要がありました。マルチバンドラスターイメージで作業する場合は、上記で提案したstnのようなSAGA-GISを使用するのが最適です。


3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

デフォルトでは、Count、Sum、Meanのみを計算します(Raster -> Zonal StatisticsQGIS Desktop からわかるように、さらに多くのことができます)。

たとえば、使用する必要がある平均値のみを計算する場合:

zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer, rasterfile, QgsZonalStatistics.Mean)
zonalstats.calculateStatistics(None)

すべてのオプションについてはAPIをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.