マップ代数演算の使用の概要
マップ代数計算では、代数演算を使用して Spatial Analyst のツール、演算子、関数、クラスにアクセスすることができます。最も基本的な形式では、出力ラスタを等号(=)の左側に指定し、ツール、演算子、およびそれらのパラメータを右側に指定します。例を示します。
from arcpy.sa import *
outShade = Hillshade("inelevation", 99, 33)
上のステートメントは陰影起伏を計算するもので、太陽によるイルミネーションを方位 99 度と高度 33 度で決定し、outShade という Raster オブジェクトを作成して結果を保存します。
マップ代数演算ではシンプルなステートメントも実行できますが、この言語の力は複雑なステートメントやモデルの作成時に発揮されます。マップ代数演算は Python に統合されているため、Python および ArcPy のすべての機能とそのエクステンション(モジュール、クラス、関数、プロパティ)をモデラは使用することができます。
マップ代数演算を使用して迅速、簡単に生産性を高めることができ、必要性が高まるにつれ、その多くの側面を探求できます。次の概要では、使用を開始するための基本事項を説明します。
マップ代数演算実行の基本
マップ代数演算を使用するには、次の 3 つの方法があります。
- [ラスタ演算(Raster Calculator)] ツール
- Python ウィンドウ
- 好みの Python IDE(統合開発環境)
ラスタ演算(Raster Calculator)
[ラスタ演算(Raster Calculator)] ツールは、マップ代数演算の式を実行します。このツールには使いやすい演算インタフェースがあり、ボタンをクリックするだけで、ほとんどのマップ代数演算のステートメントを作成できます。[ラスタ演算(Raster Calculator)] はスタンドアロン ツールとして使用できますが、ModelBuilder 内でも使用できます。つまり、このツールを使用して、マップ代数演算の能力を ModelBuilder に統合できます。
上のステートメントでは、3 つのラスタが 1 つに加算されます。
[ラスタ演算(Raster Calculator)] ツールは、他の Spatial Analyst ツールを置き換えるものではありません。適切な演算に対しては他のツールの使用を継続してください。たとえば、傾斜角の計算を行うには、[傾斜角(Slope)] ツールを使用します。[ラスタ演算(Raster Calculator)] ツールは、1 行の代数演算ステートメントを実行するように設計されています。
ラスタ演算は、すべてのツールと同様にジオプロセシング ツールであるため、ModelBuilder に統合することができます。詳細については、以下のトピックをご参照ください。
Python ウィンドウ
[Python] ウィンドウは、ArcGIS の中からジオプロセシング ツールや Python の機能を使用するのに、効率的で便利な場所です。このウィンドウから実行される Python コマンドには、1 行の単純なコードから、ロジックを持つ複雑なブロックまで、さまざまなものがあります。Python ウィンドウは、カスタムまたはサードパーティの Python モジュールおよびライブラリを使用して追加の機能にアクセスする場所としても機能します。
Python ウィンドウを起動するには、[標準] ツールバーで [Python ウィンドウ] ボタン をクリックするか、[ジオプロセシング] ドロップダウン メニューから [Python] ウィンドウをクリックします。
上の一連のステートメントでは、ArcPy サイト パッケージ、ジオプロセシング環境、Spatial Analyst モジュールがインポートされ、ワークスペースが設定され、[傾斜角(Slope)] ツールが実行され、出力が実ファイルとして保存されます。ステートメントの最後にキャリッジ リターンが入力されると、ステートメントは即座に実行されます。
Python ウィンドウの機能には、あらかじめ組み込まれた行のオートコンプリート、変数の使用、Python および ArcPy の機能へのアクセスなどがあります。
Python IDE(統合開発環境)
Python ウィンドウで入力できるステートメントの数に制限はありませんが、さらに複雑なモデルを作成するには扱いにくくなる可能性があります。Spatial Analyst モジュールのツール、演算子、関数、クラスは、PythonWin のような任意の IDE(統合開発環境)からアクセスすることもできます。自分の好きな IDE を起動して、希望するステートメントを入力してください。
次のスクリプトでは、ArcPy、ジオプロセシング環境、Spatial Analyst モジュールがインポートされ、変数が設定され、エクステンションがチェックアウトされ、[傾斜角(Slope)] ツールが実行され、出力が保存されます。
# Name: Slope
# Description: Identifies the rate of maximum change
# in z-value from each cell.
# Requirements: Spatial Analyst Extension
# Import system modules
import arcpy
from arcpy import env
from arcpy.sa import *
# Set environment settings
env.workspace = "C:/data"
# Set local variables
inRaster = "elevation"
outMeasurement = "DEGREE"
zFactor = 0.3043
# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")
# Execute Slope
outSlope = Slope(inRaster, outMeasurement, zFactor)
# Save the output
outSlope.save("C:/output/outslope02")
Python ウィンドウの場合と同様に、IDE では利用可能なすべての Python および ArcPy の機能へのアクセスが提供されます。
ツールの操作
ラスタを出力するすべての Spatial Analyst ツールは、代数演算形式で使用できます。データセット名は、コンテンツ ウィンドウまたは現在のワークスペースでは使用できますが、それ以外の場合は絶対パスを入力する必要があります。
# In the following statement, indem is either
# in the TOC or in the current workspace
outRas = Aspect("indem")
# In the following statement the full path is specified
outRas2 = Aspect("C:/Data/indem2")
1 つのステートメントからの出力を、その後のステートメントに入力することができます。
outRas = Select("inras", "Value > 105")
# outRas is variable defined by the previous statement and is not quoted
outdist = EucDistance(outRas)
演算子の操作
マップ代数演算では、一連の演算子(+、-、* など)がサポートされます。これらの同じ演算子は Python 内にも存在しますが、マップ代数演算で Raster オブジェクトを別の方法で扱うために変更されています。たとえば、次の例は 2 つの数値を合計して 1 つの変数にします。
# set outVar to 14 using the Python + operator
outVar = 5 + 9
ステートメントがラスタに対して機能する(つまり、Spatial Analyst の演算子を使用する)必要があることを区別するには、データセットを Raster としてキャストする必要があります。次の例では、Spatial Analyst の + 演算子を使用して、2 つのラスタを合計します。
outRas = Raster("inras1") + Raster("inras2")
演算子はラスタと数値の混在に対応します。たとえば、次の例では 8 という一定の値が入力ラスタ内のすべてのセルに加算されます。
outRas = Raster("inras1") + 8
複雑な式の作成
ツールと演算子は、1 つのステートメント内で 1 つにつなぐことができます。次の例では複数のツールと演算子がそれぞれの式で実行されます。
outRas = Slope("indem" * 2) / 57
outdist = EucDistance(ExtractByAttributes("inras", "Value > 105"))
括弧を使用して、処理の順序を制御することができます。次の 2 つの例を考えてください。どちらも同じ演算子が使われていますが、括弧が使われているために結果が異なっています。
outRas1 = (Raster("inras1") + Raster("inras2")) / Raster("inras3")
および
outRas2 = Raster("inras1") + Raster("inras2") / Raster("inras3")
1 つめのステートメントでは、inras1 が inras2 に加算され、その結果が inras3 で除算されています。2 つめのステートメントのように括弧がない場合は、inras2 が inras3 によって除算され、その結果が inras1 に加算されます。
複数のブール演算子(~、&、^、|)や関係演算子(<、<=、>、>=、==、!=)を 1 つの式の中で連続して使用するときは、括弧を使う必要があります。たとえば、(a>2) & (a<5) という式の中では括弧が必要です。この式で括弧を使わなければ(a>2 & a<5)エラーになります。次の式は、括弧が使われているため実行されます。
outRas = (Raster("a") > 2) & (Raster("a") < 5)
単に括弧を必要としない式もありますが、その代わりに書き直した方がよいものもあります。たとえば、a < b < c という形式の式は実行されず、括弧を追加すると式の意味が変わります。したがって、この式を正常に実行するには、(a < b) & (b < c) という形に書き直す必要があります。
クラスの使用
クラスは、複数の引数があるパラメータを対象に、マップ代数演算の各ツールで使用します。入力パラメータにクラスを使用すると、パラメータの個々の引数に簡単にアクセスして引数の検索と変更、追加引数の追加などを実行できます。クラスの使用を示す例は次のとおりです。
outRas = FocalStatistics("inRaster", NbrCircle(5, "CELL"), "SUM")
上のステートメントでは、合計は円形に取り巻く近傍の 5 つのセルのセルごとに計算されます。NbrCircle は、NbrCircle オブジェクトを作成するクラスです。
リマップ テーブル クラスの例を次に示します。リマップ クラスには任意の数の値を入力することができます。
outReclass = Reclassify("inRaster", "VALUE", RemapRange([[0, 1], [3, 10], [4, 8]]))
上のステートメントでは、RemapRange クラスを使用して、入力値の再分類を定義しています。inRaster の値 0 のセルは outReclass の 1 に割り当てられ、3 は 10 に、4 は 8 に割り当てられます。
マップ代数演算におけるクラスの使用の詳細については、「ArcGIS Spatial Analyst エクステンション クラスの概要」をご参照ください。
フィーチャ、テーブル、ファイルを出力するマップ代数演算関数
ラスタを出力として生成する Spatial Analyst ツールだけが、代数演算形式を使用して実装されています。ラスタ以外の出力(フィーチャ、テーブル、テキスト ファイルなど)を生成する Spatial Analyst ツールの場合、出力はツール内のパラメータとして括弧内に指定されます。等高線を出力ポリライン フィーチャ データセットとして作成する次の例の構文に注意してください。
indem = "C:/Data/indem"
Contour(indem, "C:/output/outcontours")
マップ代数演算ステートメントを実行する際の推奨事項
以下に示したすべてのマップ代数演算の例では、出力が Raster オブジェクトになっています。Raster オブジェクトはテンポラリ ラスタ データセットをポイントし、このデータセットは明示的に保存しない限り、ArcGIS セッションの終了時に削除されます。このテンポラリ データセットを実ファイルとして保存するには、Raster オブジェクトで save メソッドを呼び出します(以下の 2 例を参照)。
マップ代数演算ツールや演算子を実装する前に、適切な解析環境、特に現在のワークスペース、範囲、セル サイズ、およびマスクを設定することをお勧めします。
ワークスペース環境を示す例は次のとおりです。
import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
outHillshade = Hillshade("elevation", 180, 75, "SHADOWS", 1)
outHillshade.save("outhillshd01")
上のステートメントではワークスペースが設定されます。したがって、outhillshd01 は C:/sapyexamples/data に保存されます。
マップ代数演算ツールへのすべての複雑な入力で変数にクラスを設定し、ステートメントではその変数を使用することをお勧めします。次のステートメントでは、RemapRange クラス オブジェクトが変数 myRemapRange に設定され、[再分類(Reclassify)] ツールへの入力として使用されます。
import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
myRemapRange = RemapRange([[-3, 0, 0], [0, 1.75, 25], [1.75, 3.5, 50],
[3.5, 5.25, 75], [5.25, 7, 100]])
outReclassRR = Reclassify("inreclass", "VALUE", myRemapRange)
outReclassRR.save("rclassremran")
参考トピック
ArcPy をさらに深く理解するには、以下のトピックをご参照ください。
Python でのジオプロセシングの詳細については、以下のトピックが役に立ちます。
Python の詳細については、以下のページでさらに多くのリソースを示しています。