オープンソースGISソリューションのポリゴンオーバーレイからラスター値を取得


16

2つのレイヤーがあります。多くのタイルを含むポリゴンシェイプレイヤーと、カラーマップの多くのカテゴリを含むCORINE 2006土地被覆を含むラスターレイヤー。シェープレイヤーの各ポリゴンについて、ラスターレイヤーの各土地被覆カテゴリの合計を取得します。

たとえば、IDが '2'のポリゴンがあり、このポリゴンに対して次のような属性が必要です(パーセントまたは平方メートル)。

  • 耕地:15%
  • フォレスト:11%
  • 通り:2%(...など)

私は草、qgis(機能なし)、saga(すべてを合計値に合計する)r(合計)でそれをしようとしましたが、まだ解決策が見つかりませんでした。ほとんどのプラグイン(qgisのゾーン統計)は、0-1ラスターレイヤーのみをサポートします。v.rast.statsも役に立たなかった。Iamは、優れたスマートソリューションにオープンです。たぶん私は間違ったアプローチを使用したか、間違いを犯した。

Arcgisでは、このタスクは非常に簡単です。覚えていれば正しいですが、私はあなたの日常のLinuxユーザーにとって良い解決策がまだありません。

私はDebian Linuxシステムを実行しているため、このOS用のプログラムしか使用できません。


編集:この質問にはまだ多くのビューと訪問者がいるので、QGISプラグインを作成しました。これは、ラスターレイヤーの土地被覆を計算することもできます。ポリゴンオーバーレイはまだコーディングしていませんが、間違いなく計画されています。ここでプラグインを見つけて、最初にScipyライブラリをインストールします。


それは間違いなくRで行うことができます。これは、どの機能を実行するのかという問題です。各ポリゴンをラスターでオーバーレイしてから、table()を使用して「Cookieカット」ピクセルの概要を取得する必要があります。パッケージraster、rgdal、rgeosが役立つ場合があります。「R Spatial Task View」を読んでください(グーグルが見つけます)
Spacedman

確かですが、どうすればそのような要約を入手できますか。ポリゴンレイヤーを!is.na(overlay(Poly、Raster))を使用してラスターレイヤーに簡単にオーバーレイできますが、extract iなどのコマンドでは、カラーマップの異なるカテゴリではなく、Cookieカットピクセルの合計面積のみを計算できます。私はrgeosを知りませんでしたが、私はAPIを調べて、これを行う機能が見つかりませんでした。
Curlew


こんにちは!QGISプラグインを作成してくれてありがとう!プラグインがクラッシュする(> 13000ポリゴン)ことを述べたかっただけです。クラッシュしないようにタスクを分割するのは素晴らしいことです。そして、すべてのクラスを一度に追加するオプションがあると素晴らしいでしょう(たとえば、属性テーブルは、2つの新しいフィールドLandcoverIDとLandcover%を取得し、両方が値を持つCSVリストを保持します):)
Mfbaer

@Joran:これがバグだと思うなら、コメント(github.com/Martin-Jung/LecoS/issues)に書くのではなく、バグレポートを提出してください。さらに1)タスクをシリアル化またはバッチ処理するのはプラグインジョブではありません。その後、より小さなサブセットで実行します。2)はい。追加する多くの素晴らしいものがあるでしょう。コードはオープンソースです。気軽にコーディングしてください:)
Curlew

回答:


13

「extract」を使用してSpatialPolygonsDataFrame(maptools:readShapeSpatialを使用してシェープファイルから読み取ることができます)のポリゴンフィーチャをラスターにオーバーレイし、「table」を使用して集計します。例:

> c=raster("cumbria.tif") # this is my CORINE land use raster
> summary(spd)
Object of class SpatialPolygonsDataFrame
[...]
> nrow(spd)  # how many polygons:
[1] 2
> ovR = extract(c,spd)
> str(ovR)
List of 2
 $ : num [1:542] 26 26 26 26 26 26 26 26 26 26 ...
 $ : num [1:958] 18 18 18 18 18 18 18 18 18 18 ...

したがって、最初のポリゴンは542ピクセルをカバーし、2番目のポリゴンは958ピクセルをカバーします。それぞれを要約できます。

> lapply(ovR,table)
[[1]]

 26  27 
287 255 

[[2]]

  2  11  18 
 67  99 792 

したがって、最初のポリゴンはクラス26の287ピクセル、クラス27の255ピクセルです。百分率を得るために100で合計、除算、乗算するのに十分簡単です。


すばらしい、努力に感謝します。私はそれを試して報告します:
Curlew

6

報告したかったのですが、ここにいます。Spacedmanのソリューションはうまく機能し、私の形状のすべてのポリゴンのすべての情報をエクスポートできました。誰かが同じ問題を抱えている場合に備えて、ここに私が先行した方法があります:

...
tab <- apply(ovR,table)
# Calculate percentage of landcover types for each polygon-field.
# landcover is a datastream with the names of every polygon
for(i in 1:length(tab)){
 s <- sum(tab[[i]])
 mat <- as.matrix(tab[[i]])
 landcover[i,paste("X",row.names(mat),sep="")] <- as.numeric(tab[[i]]/s)
}

3

あなたが望むものを正しく理解し、GRASS GISデータベースにベクターレイヤー「mypolygonlayer」とラスターレイヤー「corina」がすでにあると仮定すると:

まず、ベクターをラスターに変換します。猫は、ポリゴンごとに一意の識別子を1つ持つようにします。一意の数値識別子を持つ列がある場合は、代わりにその列を使用できます。labelcolumnはオプションです:

v.to.rast input = mypolygonlayer layer = 1 output = mypolygons use = cat labelcolumn = NameMappingUnit

次に、r.statsを実行して統計を取得します。

r.stats -a -l input = mypolygons、corina separator =; output = / home / paulo / corinastats.csv

最後のステップは、LibreOfficeなどでcorinastats.csvを開き、ピボットテーブルを作成するか、Rを使用してクロステーブルを作成することです。


3

私はこの投稿がかなり古いことを知っていますが、最近、同じ種類の分析を実行するのが嫌いですが、Rなどのプログラムをダウンロードすることは私の仕事用コンピューターで少し面倒であり、承認が必要です。QGisとExcelのみで使用できる方法を何時間も研究した後、この方法が私にとって最適であり、同じような状況の人々に提供したいと思いました。

  1. ポリゴンをラスターレイヤーにクリップ(ラスター→抽出→クリッパー:入力ファイル=ラスターレイヤー、出力名と場所を選択、マスクレイヤーをクリック、ポリゴンを選択→OK)

  2. クリッパーレイヤーをポリゴン化(ラスター→変換→ポリゴン化:入力ファイル=クリップレイヤー、出力を保存→ok)

  3. ピクセル数の計算(作成したシェイプファイルをクリック→フィールド計算機を開く:「新しいフィールドを作成」にチェックマークを付け、フィールド名を追加、機能=ジオメトリ→エリア→OK)。これで、属性テーブルにピクセル数を示す新しい列が表示されます。

  4. ポリゴンレイヤーを保存(ポリゴンレイヤーを右クリック、名前を付けて保存:形式= DBFファイル、名前を付けて保存→ok)

  5. 各生息地のピクセル数の概要(Excelを起動し、ファイルを開きます。タイトルがない場合は、各列に1つ追加し、空のセルをクリックして、[データ]タブに移動し、統合し、合計を確認し、クリックします) 「browse…」の横にある赤い矢印をクリックし、2つの列(タイトルを含む)を選択し、「add」をクリックして、「Top row」ボックスと「left column」ボックスの両方をオンにします→ok)

  6. 私のように、分析するポリゴンがたくさんあり、同じテーブルでそれらを比較する必要がある場合、このステップは役に立ちます。新しいExcelブックで、列Aに生息地番号をリストし(私にとっては1〜48)、列BとCに統合した2つの列を配置します(Bの生息地とCのピクセル数)。セルD1に次の数式を記述します。= IFNA(INDEX(C:C; MATCH(A2; B:B; 0)); "")そして最後の値までドラッグ(または右下隅をダブルクリック)セルまで48の生息地がありますD48)。これで、ピクセル数が生息地に対応するセル内にあり、すべてのポリゴンに対してこのプロセスを繰り返すことができます。


2

QGISを使用してCORINEデータをベクターポリゴンデータセットに変換しラスター>変換>ポリゴン化)、ユニオン関数(ベクター>ジオプロセシングツール>ユニオン)を使用してポリゴンと結合する方法についてはどうでしょうか。結果のベクトルデータセットには、各ポリゴンの各CORINEクラスの領域が含まれます。


この提案をありがとう。ベクトル結合についてはまだ考えていません。R処理が何らかの理由で失敗した場合、私はそれを試してみるでしょう。
Curlew

0

QGIS。

QGISトランクには、ZonalStatsの別のバージョンがあり、Zonal Statisticsと呼ばれます。

これにより、必要な機能が実行されます。

ワークフローについては、所有しているラスタの数が明確ではありませんか、それともラスタ内の単なるバンドですか?


コメントありがとうございます。ただし、Zonal Statisticsはカテゴリのないラスターのみを食べます。QGISトランク1.9使用IAM
カーリュー

0

上記のほとんどの回答とは反対に、2つのポリゴンデータセットの代わりに2つのラスタデータセットを使用するよりも、ポリゴンをラスタライズする方が良いと思います。これは処理の負荷がはるかに少ないため、Rで大きなラスターと大きなポリゴンファイルを処理するための唯一の実装ソリューションです。

ラスターデータとまったく同じ範囲と解像度でポリゴンをラスター化した後、ここで説明するように要約統計を表にできます。これは、ラスターがメモリに収まる場合(小/中ラスターレイヤー)またはreclass関数で各カテゴリを2値化できますzonal各クラスの統計を計算します。以下は、ラスタ化とゾーン統計を1つの関数に組み込み、非常に大きなデータセットでうまく機能するソリューションです。

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