ArcPy で画像処理をしてみよう ~その1:ラスタオブジェクトとプロパティ

Python ウィンドウ

ArcGIS for Desktop には、画像解析ウィンドウや ArcToolbox のデータ管理ツール→ラスタのツール、Spatial Analyst など様々な画像(またはラスタ)処理ツールがありますが、複雑な処理の自動化や独自のアルゴリズムの実装など、ワンランク上を目指すなら Python でのプログラミングを行うことになります。ここでは ArcGIS の Python モジュールである ArcPy を使用した画像処理をシリーズで紹介します。今回はまず ArcPy の中で最も基本となる「ラスタオブジェクト」についてです。

Python

なお、ここでは Python そのものの基本事項についての解説は省略しますので、Python 初心者の方は一般的な解説書などでコマンドやコードをご確認いただければと思います。

Python ウィンドウで見てみよう

プログラムを書く前に、まずは Python ウィンドウでラスタオブジェクトを確認してみましょう。ArcMap か ArcCatalog のメニューより、 [ジオプロセシング] → [Python] を選択し、Python ウィンドウを起動してください。

Python ウィンドウ

データの用意

適当な画像ファイルを用意してください。ここでは、dem.tif というファイルを c:temp フォルダに入れた状態を例とします。また、後の実習用にいろいろな種類の画像ファイルを同じフォルダに入れておいてください。

Python ウィンドウの「>>>」の後に以下のように記述し、このファイル名(パス名)を「input_file」という変数に入れておきます。

>>> input_file = r”c:tempdem.tif”

ラスタオブジェクトの作成

ラスタオブジェクトは、ラスタデータを ArcPy の中で取り扱うための変数です。arcpy.Raster() の括弧の中にファイル名を指定するだけで作ることができます。ここでは「input_file」の画像ファイルへの参照を「inRaster」というラスタオブジェクトに格納します。

>>> inRaster = arcpy.Raster(input_file)

ラスタオブジェクトの中身

これでラスタオブジェクトができましたので、このデータが持っている様々な情報を見てみましょう。この情報のことを「プロパティ」と言います。まずは「inRaster.(最後にピリオド)」と入力して少し放置しておくと、「bandCount」「format」といったプロパティがリストされます。キーボードの「↓」「↑」キーで選択し、Enter キーで入力することができます。ここでは「format」を入力し、Enter で実行します。

>>> inRaster.format

u’TIFF’

TIFF のようなフォーマット名が表示されたはずです。ほかのプロパティやファイルでも同様に試してみてください。このように、ラスタオブジェクトにしておけば、ラスタデータに付随する様々な情報を簡単に取得することができるのです。

ラスタオブジェクトとプロパティについての詳細はこちらを確認してください。
Raster(ArcPy)

繰り返し処理

Python ウィンドウでこのようにコマンドを入力して処理をしても単に面倒なだけではないか、と思われるかもしれませんが、通常のダイアログボックスからの実行と決定的に異なるのは、Python の文法に基づいて条件分岐(if 文)や繰り返し処理(for 文)を行える点や入出力の形態を自由に選べる点です。例えば、一つのフォルダに含まれるすべての画像ファイルのファイル名と投影法情報(空間参照名)をタブ区切りで出力してみましょう。

>>> arcpy.env.workspace = r”c:temp”

>>> raster_list = arcpy.ListRasters(“*”,”All”)

>>> for file in raster_list:

…     print arcpy.Raster(file).name + “t” + arcpy.Raster(file).spatialReference.name

重要なのは arcpy.ListRasters() です。これにより arcpy.env.workspace に設定したフォルダに含まれるすべての画像ファイルをリストアップし、それを for 文のイテレータとして使用します。繰り返される処理として、arcpy.Raster で取得したラスタプロパティ(ファイル名と空間参照名)をタブ(t)を挟んで繋げ、print で出力します。

(出力例)

dem.tif JGD_2000_UTM_Zone_54N

output1.png Unknown

output2.jpg Unknown

output_dem1.tif JGD_2000_UTM_Zone_54N

output_dem2.tif JGD_2000_UTM_Zone_54N

>>>

なお、この出力結果はタブ区切りですので、Python ウィンドウ上で選択してコピーすれば Excel に直接貼り付けられます。

Python スクリプトを書いてみよう

ここまで Python ウィンドウを使用しての画像処理を紹介してきましたが、このようなコマンドをテキストファイルに記述し、*.py というファイル名で保存しておけば、毎回同じ処理をする際にコマンドを入力せずに済みます。これがつまり Python スクリプトになります。Python スクリプトはどのようなテキストエディタでも書くことはできますが、実行機能のついた IDE(開発環境)で作成するのが便利です。ここではArcGIS for Desktop をインストールすると同時に入ってくる Python IDLE という標準の IDE を使用してスクリプト作成を行います。

画像ファイルリスト作成ツールを作ろう

先ほど Python ウィンドウで行った処理をさらに発展させ、指定したフォルダに含まれるすべての画像ファイルの名前とセルサイズ、ファイルサイズ、空間参照名をカンマ区切りで出力したテキストファイル(CSV ファイル)を作成するスクリプトを作成します。このようなツールは、画像ファイルの品質チェックや納品物のリストを作成するような場面で重宝します。

1. 適当なフォルダにテキストファイルを作成し、RasterFileList.py と名付けます。

2. ファイルを IDLE などの Python 開発環境で開きます。(ファイルを右クリック→ [Edit with IDLE] を選択します。)

3. 以下のように記述します。

画像ファイルリスト作成ツール

(ア) ArcPy をインポートします。

(イ) 入力ディレクトリと出力ファイルを指定します。
(ウ) 入力ディレクトリをワークスペースとして定義します。

(エ) 出力ファイルを書き込みモードで開きます。

(オ) 出力されるテーブルの列タイトルをカンマ区切りで書き出します。

(カ) ワークスペース内のすべてのラスタファイルをリストアップしてこれをイテレータとして繰り返し処理を行います。

(キ) リストされたそれぞれのラスタオブジェクトから、ファイル名、セルサイズ、ファイルサイズ、空間参照名を取得し、変数に格納します。
(ク) 取得した情報をカンマ区切りで並べて CSV ファイルに書き出します。

(ケ) 最後に「Done!」と出力して処理を終了します。

4. コードが書けたら保存(IDLE なら Ctrl+S キー)して試しに実行(IDLE なら F5 キー)してみましょう。Python Shell に最後の print() で記述した「Done!」が出たら完了です。output_file で記述した場所にファイルが出力されているはずですので、確認してみてください。Excel などの表計算ソフトで開くと以下のようになります。(結果は入力フォルダに含まれるファイルにより異なります。)

出力結果

いかがでしたか?今回はまずは基本という事でラスタオブジェクトとそれに付随するプロパティを取得する処理を紹介しました。ラスタプロパティは今回のように抽出して表示するだけでなく、様々な計算のパラメータとして使用することもでき、非常に重要な要素となります。また、ラスタオブジェクトは様々なジオプロセシング関数はもちろん Spatial Analyst のマップ代数演算の入出力にも使用できます。次回はそういったジオプロセシングでのラスタオブジェクトの使い方や処理例を紹介しますのでお楽しみに!

[注意事項]

本記事に関するご質問は、保守 Q&A サポート サービス以外の有償サービスにて対応いたします。 本記事に関して生じたいかなる損害についても、弊社では責任を負いかねますことを予めご了承願います。

本スクリプトツールは、サンプルツールとして提供しておりますので、すべてのお客さまの環境での動作を保障するものではありません。また、スクリプトの内容に関するご質問はお受けできませんので、ご了承ください。

なお、本サンプルを使用して生じたいかなる障害についても、弊社では責任を負いかねますことを予めご了承願います。

弊社サポート サイトには多くのサンプル コードが掲載されております。Python を使用したスクリプト ツールを作成される際は、是非弊社サポート サイトをご活用ください(サポート サイトのご利用はサポート ページへのログインが必要です)。