ArcGIS Spatial Analystを使用して一連のラスターの連続ピクセル値をカウントしますか?


23

Spatial AnalystでArcGIS 10を使用しています。

各セルに1または0のみを含むラスターのセット(合計8つ)があります。各ラスターは、異なる年の価値のあるデータを表します。引数のため、1年目から8年目まで。

すべてのラスターを一緒に追加すると、0〜8の範囲の値を持つ最終的なグリッドが得られます。8は、ラスターセット(すべての年)でセルが常に1であることを示します。

各セルについて、1の最長連続番号を見つけたいと思います。

したがって、たとえば、合計グリッドは、単一のセルについて5の値を記録できますが、8グリッドでは、そのセルは3に等しい最大連続数1を持ちます。その後、ゼロと1の間で振動し始めました。

ラスター処理スキルはベクター処理スキルほど熱くなく、ESRIヘルプファイルをよく見てきましたが、市販のジオプロセシングツールを使用してこれをどのように達成できるかわかりませんか?

何か案は?


1
それは実際にはかなりクールな分析です。いつものように、あなたがやろうとしていることをする方法は複数あります。ただし、すべての組み合わせをループするには、プログラミングを行う必要があると思います。
MLowry

1
一般的なコメント(@MLowryによるこの発言に触発された):質問が面白そうに見える場合や明確に表現されている場合は、必ず質問に賛成票を投じてください。良い質問は、私たちのサイトのすべてを動かします。お願いした人に報いるためにできることをしましょう!
whuber

回答:


14

これはローカル操作であるため、1つのセルに対してそれを行う方法を考えてみましょう。マップ代数演算が残りを処理します。

最初に、ラスターの順序が明らかに重要であることに注意してください。したがって、セルの合計などの単一ショットのセル統計では実行されません。

特定のセルで01110101などのシーケンスに遭遇した場合、これを最初から最後まで処理し、

  1. ゼロからカウントを開始します。

  2. 1が発生するたびにカウントを増やします。

  3. 最後のカウントを保存した後、0に遭遇するたびにカウントをリセットします

  4. 最後に、最大保存カウント(最終カウントを含む)を取得します。

手順1は、一定のゼログリッドで実装されます。ステップ2と3は、発生する内容によって異なります。したがって、条件付き操作です。ステップ4は明らかに極大値です。次に、これをもう少し正式にコーディングします。

count = 0
result = 0
For each value:
    If (value==1):
        count=count+1
    else
        result = max(result, count)
        count=0
result = max(result, count)

グリッドが多数ある場合はPythonスクリプトを使用するのが最適ですが、8つあれば、ループを展開して手作業でステップを記述することは面倒ではありません。これにより、わずかな問題が明らかになります。これは、result=max(longest,count)ラスター操作ではコーディングが困難な「副作用」のようなものです。(ただし、次の2番目のソリューションに示すように、実行できます。)また、各ステップで余分な計算が追加されるため、非効率的です。したがってmax、最後まで操作を延期することを目的として、アプローチを少し変更します。これには、各段階で個別のカウントを保存する必要があります。

このプロセスを経て、最初のステップのショートカットも見つけました。これにより、次の解決策が導き出されます。これは少し長く、RAMを集中的に使用しますが、簡単であり、迅速に実行される手順を伴います。

result1 = "grid1"
result2 = con("grid2"==1, "result1"+1, 0)
result3 = con("grid3"==1, "result2"+1, 0)
result4 = con("grid4"==1, "result3"+1, 0)
result5 = con("grid5"==1, "result4"+1, 0)
result6 = con("grid6"==1, "result5"+1, 0)
result7 = con("grid7"==1, "result6"+1, 0)
result8 = con("grid8"==1, "result7"+1, 0)
CellStatistics(["result1", "result2", "result3", "result4", "result5", "result6", "result7" "result8"], "max")

実際の構文は、ArcMapのバージョンによって異なります。(たとえば、CellStatisticsバージョン10の新機能ですが、ローカル最大操作は常に利用可能です。)

入力01110101の例では、一連の "result *"グリッドに値0、1、2、3、0、1、0、1が含まれるため、最後にCellStatistics3を返します。 1の。

RAMが不足している場合、実行時間を約2倍にすることで、中間結果を再利用するようにソリューションを変更できます。

result = "grid1"
temp = con("grid2"==1, "result"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
temp = con("grid3"==1, "temp"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
...
temp = con("grid8"==1, "temp"+1, 0)
CellStatistics[["temp", "result"], "max"]

入力01110101の例では、( "temp"、 "result")の値は、最初の行の後、各ペアの( "Con"、 "CellStatistics")操作の後(NoData、0)になります(1 、1)、(2、2)、(3、3)、(0、3)、(1、3)、(0、3)、(1、3)。もう一度、最終値は3です。

どちらのソリューションでも、マップ代数式の規則的なパターンは、アルゴリズムをスクリプト内のループとしてコーディングする方法を示し、各反復で適切にインデックスを変更します。


タイプコードブロックにタイプミスがあるかもしれません:count = count = 1はおそらくcount = count + 1であるべきです
MLowry

1
@MLありがとう(良い目!):今修正されています。擬似コードを完全に正しいものにすることは困難です。人間によるレビューは、エラーを見つける上で重要な資産です。また、ArcGISでソリューションをテストしませんでしたが、Rで最初のソリューションを実装したため、アプローチが正しいことをある程度保証しています。
whuber

1
「whuber」まだあなたは知っている男です!あなたがバスにひかれた場合、神は私たちの残りを助けてください!あなたの最初のPythonアプローチは私が考えていた方向でしたが、ラスターを使用すると、多くの場合、あなたが証明した非常に滑らかなすべてを行うことができることを知っています。イギリスで自分自身を見つけた場合、最高の室温のフラットビールを1パイント購入することは名誉です!:)
ホーンバイド

ありがとう、ダンカン:しかし、アンディ・ハーフットの優れたソリューションをチェックしてください!
whuber

14

これについてチャットして、入力グリッドをバイナリストリームとして扱うことで問題にアプローチできるかどうか疑問に思います。これにより、それらを組み合わせて、シーケンスに一意のサマリー整数を与えることができます-つまり、01110101 =117。その後、この値を再分類して、連続する1の最大数を与えることができます。

8つのグリッドを結合する1つの方法を示す例を次に示します。

2*(2*(2*(2*(2*(2*(2*"g8" + "g7") + "g6") + "g5") + "g4") + "g3") + "g2") + "g1"

このステップでは、ビット単位の操作をサービスに組み込むこともできます。または、結合の後にフィールド計算を使用することもできます。(フィールド計算には、前の計算と同様の式があります。)

再分類テーブルがために00000000B = 0と11111111B = 255との間のすべての値の最大ランレングスを提供しなければならない、ここで彼らは、次のとおりです。

0, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8

このアプローチは、ArcGISで約20グリッドに制限されています。これを超えるグリッドを使用すると、扱いにくい属性テーブルが作成される可能性があります。(Combine特に20グリッドに制限されています。)


巨大な+1:これは非常に良い考えです。(唯一の制限は、31を超えるグリッドが関係する場合、使用するビットが不足することです。)他の人が実装がいかに簡単かを見ることができるように、私はあなたのアイデアを少し肉付けする自由を取りました。
whuber

3

値を0と1から2の累乗の値(1,2,4,8,16,32)に変更することを考えましたか。8つのグリッドを組み合わせると、各セルに固有の値が得られ、連続した情報が得られます(つまり、3の値は1年目と2年を意味し、54の値は6年目から8年目です)。

ちょっとした考え


これはまさに、@ Andy Harfootが数時間前に提案したものです、ライアン。:-)
whuber

ありがとう、ごめんなさい。私は休暇中に携帯電話でこれを読んでいます。
ライアンガーネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.