ArcPy で画像処理をしてみよう ~その2:ジオプロセシング~

※ArcPy が初めての方は、まずは前回の記事:ArcPy で画像処理をしてみよう ~その1:ラスタオブジェクトとプロパティをチェック!
※本記事の作成にあたっては ArcGIS 10.1 for Desktop を使用しました。

前回紹介した「ラスタオブジェクト」は、様々なジオプロセシング関数の入出力にも使用できますので、今回はジオプロセシングでのラスタオブジェクトの使い方や処理例を紹介します。

ところでジオプロセシングとは何?という方のために簡単に説明しますと、ArcToolbox のツールや ModelBuilder のようなデータ処理系の機能をひっくるめた用語です(さらに知りたい方はこちら)。これらのツール群は ArcPy の中で関数として使用することができます。ArcGIS for Desktop では、主に [データ管理ツール] → [ラスタ] や [データ管理ツール] → [投影変換と座標変換] → [ラスタ] のツールで、ラスタデータの処理が可能です。

ジオプロセシング関数を使ってみよう

ここでは、画像を間引いて一定の画像サイズ(例えば 200×200 ピクセル)に縮小する処理を実現したいと思います。つまり、大きな画像のプレビューあるいはサムネイルを作成するツールです。

ArcPy のジオプロセシング関数は ArcToolbox の各ツールに対応します。ここで使用したい関数は、[データ管理ツール] → [ラスタ] → [ラスタ プロセシング] → [リサンプル(Resample)] というツールです。 ArcToolbox のツール名上で右クリックから [ヘルプ](またはツールを起動して [ツール ヘルプ] ボタン)を選択すると、以下のような関数の使用方法やパラメータを知ることができます。

Resample_management (in_raster, out_raster, {cell_size}, {resampling_type})。

例えば landsat.tif という画像をピクセルの縦横の辺が 100m×100m になるようにしたい場合は、Python ウィンドウでは以下のように入力すれば実行できます。{}はオプションですので、ここでは resampling_type の指定は省きます。この場合、デフォルト設定が使用されます。

>>> inRaster = arcpy.Raster(r"c:/temp/landsat.tif")
>>> arcpy.Resample_management(inRaster, r"c:/temp/out.tif", "100")

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

さきほどのコマンドをそのままスクリプトにしても芸がありませんので、セルサイズではなく、画像サイズを指定するようにします。画像サイズをパラメータとしたい場合は、ラスタプロパティを活用して画像のサイズからセルサイズを計算し、それを arcpy.Resample_management に入力するようにします。

リサンプル(Resample)を呼び出す

スクリプトの説明

(ア) 入出力ファイルの定義です。if 文は実行時に出力ファイルが存在していたら削除するための記述です。ArcGIS では TIFF ファイルなどの外部フォーマットを扱う際にいくつかの補助ファイルを生成しますので、それらもまとめて消すことのできる arcpy.Delete_management を使用しています。
(イ) 出力ファイルサイズを指定します。
(ウ) 入力ファイルをラスタオブジェクト化します。
(エ) ラスタオブジェクトのマップ座標での範囲である extent プロパティと(イ)のファイルサイズから縦横の出力セルサイズを計算し、スペース区切りで結合した文字列を作成します。縦横のセルサイズを同じにしたい場合は、どちらか一方の値のみ(例えば大きい方)を出力するようにすれば良いでしょう。
(オ) 取得した入力ラスタ、出力ファイル、セルサイズの3つのパラメータを arcpy.Resample_management 関数に入れて実行します。

スクリプトが書けたら *.py というファイル名で保存し、実行して結果を確認してください。

このように、ジオプロセシング関数だけでなく、ラスタプロパティなども織り交ぜて使用することで、基本機能にはない処理も自在に作成することができるというのも、 ArcPy の魅力と言えるのではないでしょうか。

環境設定(arcpy.env)が便利!

ジオプロセシングでは、個々のツール関数専用のパラメータ以外の共通のパラメータ、つまり「環境設定」というものが存在します。GUI ではダイアログの下部にある [環境] ボタンからこの設定ができますが、ArcPy では、arcpy.env からアクセスすることができます。例えば、作業領域を設定しておけばファイルのパス名を全部書かずにファイル名だけでアクセスできます。

>>> arcpy.env.workspace = r”c:temp”
>>> inRaster = arcpy.Raster(“dem.tif”)
>>> inRaster.save(“out.tif”)

また、GIS の中核である座標の取り扱いやリアルタイム投影といった機能、画像の基本的な設定が容易に利用できるのです。ラスタ関係では、以下のような環境設定が可能です。

プロパティ 説明
extent データ範囲
outputCoordinateSystem 出力先座標系
cellSize セルサイズ
Mask マスクラスタの設定
Nodata NODATA 値
Pyramid ピラミッドの作成方法
rasterStatistics 統計情報の計算方法
resamplingMethod リサンプリング手法
snapRaster スナップ先ラスタの設定

env のプロパティの全リストは以下 URL を確認してください。
http://resources.arcgis.com/ja/help/main/10.1/#/na/018z0000004s000000/

これらの env プロパティを設定した状態で何らかのラスタを作成する関数(ツール)を実行すると、この設定で出力ファイルが作成されることになります。

ツールの環境設定

使用例:

# ワークスペースを設定します。
>>> arcpy.env.workspace = r"c:temp"
# inRaster1を定義し、空間参照名を確認します。UTM54座標系のデータです。
>>> inRaster1 = arcpy.Raster("dem.tif")
>>> inRaster1.spatialReference.name
u'JGD_2000_UTM_Zone_54N'
# 同様にinRaster2は緯度経度座標系のデータです。
>>> inRaster2 = arcpy.Raster("dem_geographic.tif")
>>> inRaster2.spatialReference.name
u'GCS_JGD_2000'
# inRaster2 の空間参照を環境変数に設定します。
>>> arcpy.env.outputCoordinateSystem = inRaster2.spatialReference
# inRaster1 を別のファイル ”out.tif” にコピーします。
>>> arcpy.CopyRaster_management(inRaster1,r"out.tif")
# 出力ファイルの座標は inRaster2 と同じ緯度経度座標系になります。
>>> outRaster = arcpy.Raster("out.tif")
>>> outRaster.spatialReference.name
u'GCS_JGD_2000'

このように、ラスタを単純にコピーするだけの関数を実行しても、投影変換などの高度な処理を同時にしてくれることになり、非常に効率的にスクリプトを書くことができるのです。

以上、ラスタ系のジオプロセシングツールを ArcPy で利用する際の Tips を紹介しました。ArcPy では ArcToolbox のツールに見られるほとんどの関数が利用できますので、既存の関数をならべるだけでもちょっとしたプログラムが書けてしまいます。これに加えて、関数のパラメータをラスタプロパティから取得したり、環境設定を追加するだけで複雑な処理を容易に盛り込むことができます。

今回紹介したジオプロセシングツールは、既存の画像データを加工するデータ作成的なものでしたが、次回は Spatial Analyst エクステンションのモジュール「arcpy.sa」を使用したデータ解析(ラスタ演算)について紹介します。


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

本スクリプトツールは、サンプルツールとして提供しておりますので、すべてのお客さまの環境での動作を保障するものではありません。また、スクリプトの内容に関するご質問はお受けできませんので、ご了承ください。
なお、本サンプルを使用して生じたいかなる障害についても、弊社では責任を負いかねますことを予めご了承願います。

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