16
GEOSPATIAL ver. 20131213 ERDAS IMAGINE ® Spatial Modeler Python ® スクリプトの利用 ERDAS IMAGINE 2013.00.0002

ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

GE

OS

PA

TIA

L

ver. 20131213

ERDAS IMAGINE® Spatial Modeler

Python® スクリプトの利用

ERDAS IMAGINE 2013.00.0002

Page 2: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

2

目次

概要 ................................................................................................................................................................................ 3

Spatial Modelerで使用するための Pythonの設定 .......................................................................................................... 3

Python を使用した Spatial Modelの構築 ....................................................................................................................... 4

例 1:画像レイヤーの合計計算 .................................................................................................................................. 4

スクリプトの詳細 .................................................................................................................................................. 4

スクリプト例1の短縮版 ....................................................................................................................................... 5

オペレーター機能の制限 .................................................................................................................................................... 5

モデルの保存と読み込み .................................................................................................................................................... 5

例 2:Spatial Modelの保存 ..................................................................................................................................... 6

例 3:保存した Spatial Modelの読み込みと実行 ........................................................................................................ 6

Spatial Modelの編集 ..................................................................................................................................................... 6

例 4:Spatial Modelの読み込みと編集 ...................................................................................................................... 7

データの設定と読み込み .................................................................................................................................................... 7

ERDAS IMAGINE とのインタラクション ............................................................................................................................. 8

例 5:Spatial Model Editorでのモデルの表示 ........................................................................................................... 8

例 6:Spatial Modelのプレビュー表示 ........................................................................................................................ 8

Pythonでのオペレーター機能の使用 ................................................................................................................................ 9

例 7:シンプルな Python Scriptオペレーター ................................................................................................................ 9

オペレーターに保存されたスクリプトの編集 .................................................................................................................... 10

データ型の指定 ........................................................................................................................................................ 10

Python Script オペレーターの制限 ............................................................................................................................. 10

スクリプトの例 ................................................................................................................................................................ 11

例 8:画像の NoDataの設定 .................................................................................................................................. 11

例 9:モザイクファイルの解凍(Unzip) ..................................................................................................................... 12

画像の解凍 ..................................................................................................................................................... 12

画像のモザイク .................................................................................................................................................. 13

プロセスプロパティーの利用 .................................................................................................................................. 14

Page 3: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

3

概要

ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)では Python

®スクリプト言語を使用して空間処理モデルの

作成と実行、およびモデル内に Python のスクリプトを読み込み、実行することができます。IMAGINE 2013 では Python 2.7 の

32 ビット版に対応しています。Spatial Model Editorで作成可能なモデルのほぼすべてを Python スクリプトでも作成できます。ま

た、.gmdx ファイルとして作成されたモデルを Python から呼び出し、実行することも可能です。 Python 側でモデルの入力の指定、

Python プロセスでのモデルの実行、また、出力値を読み取ることができます。

Spatial Model Editor では Python オペレーターを使用して文字列型、整数型、実数型のシンプルなデータ型を入力値と出力

値に持つ Pythonのスクリプトを実行できます。

本書は、Spatial Model Editorの基本的なコンセプトと操作方法を習得しているユーザーを対象としています。また、Python スク

リプトの言語についても基本的な知識を保有していると仮定しています。

本書で紹介しているスクリプトやサンプル画像は Intergraph

® GeospatialのWebサイトからダウンロードできます。サンプルスクリ

プトでは exampleshelper.py というモジュールを使用しています。このファイルもダウンロードした ZIP ファイルに含まれています。

ZIP ファイルのコンテンツはご利用のコンピューターの任意のディレクトリーに保存していただけますが、exampleshelper.py を利用

するには、以下の条件を満たす必要があります。

ダウンロードした ZIP を解凍したディレクトリーに実行するスクリプトを保存する。または、PYTHONPATH の環境変

数にこのディレクトリーへのパスを指定する。

スクリプトで指定されている入力データは、実行するスクリプトと同じディレクトリーに配置する必要があります。

exampleshelper.pyを使用しない場合は、サンプルスクリプトの入力および出力データのパスの編集が必要です。

ご注意点:本書でご紹介している Python コードは、サンプルとして提供しておりますのでサポート対象外となります。サンプルプログラムに関するご

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

Spatial Modelerで使用するための Pythonの設定

Spatial Modeler では 32 ビット版の Python 2.7.x にのみ対応しています。Spatial Modeler のライブラリーを使用するには、

PYTHONPATH環境変数にライブラリーが存在するパスを指定する(または別の方法で Python の検索パスにライブラリーへのパ

スを追加する)必要があります。Python 2.7がすでにインストールされている環境に IMAGINE 2013 をインストールする場合は、

IMAGINE によって自動的に環境変数にパスが追加されます。また、ERDAS IMAGINE の Reconfigure PYTHON 機能を使

用していつでもこのパスの設定を実行できます。IMAGINE のワークスペースの File タブ→ Configuration → Reconfigure

PYTHONから Reconfigure PYTHON機能にアクセスできます。

ERDAS IMAGINEの Python ライブラリーは以下の場所にインストールされます。

$IMAGINE_HOME\usr\lib\Win32Release\python

※ 「$IMAGINE_HOME」は IMAGINEのインストールディレクトリーを指します。IMAGINE 2013の場合、インストールディレクト

リーは以下に作成されます。

Windows Vista/7: C:\Intergraph\ERDAS IMAGINE 2013 Windows XP: C:\Program Files\Intergraph\ERDAS IMAGINE 2013

Page 4: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

4

Python を使用した Spatial Modelの構築

例 1:画像レイヤーの合計計算

このスクリプトでは同一ラスターファイル内の全てのバンドの合計値を計算します。:

# Spatial Model ライブラリーのインポート

from imagine import modeler

# 入出力データのディレクトリーの取得

# 詳細は exampleshelper.py を参照

from exampleshelper import dataPath, outputPath

# 空間モデルの作成

m = modeler.Model()

# オペレーターをモデルに追加

ri = m.RasterInput(dataPath + "lanier.img") # 画像を開く

bandSelect = m.BandSelection(ri, "1:4") # バンド 1-4 を選択

sumBands = m.StackTotal(bandSelect) # 選択されたバンドの合計を計算

ro = m.RasterOutput(sumBands, outputPath + "summing-image-layers.img")

#モデルの実行

m.Execute()

print "Done!"

スクリプトの詳細

Pythonの Spatial Modeler ライブラリーは imagine.modeler ライブラリーを読み込むことでアクセスできます:

from imagine import modeler

オペレーターを記録するための空間モデルオブジェクトを作成します:

m = modeler.Model()

オペレーターはモデルから作成されます。コンストラクターの各パラメーターとしてオペレーターの input ポートに接続、または定数を持

つポートが提供されます。以下のステートメントでは Raster Input オペレーターを作成し、入力データを指定しています:

ri = m.RasterInput(dataPath + "lanier.img")

Pythonで利用できるオペレーター名と Spatial Model Editorのオペレーター名は同じですが、Pythonではスペースを削除した名

前を使用します(例えば、「Raster Input」オペレーターは「RasterInput」と記述します)。入力データの指定は、上記の例のよう

にパラメーターの順番通りに指定します。もしくは、下記のように明示的にパラメーター名と変数を指定することもできます:

ri = m.RasterInput(FileName=dataPath + "lanier.img", DataType="Float")

上記の例のように、固定値を指定する方法以外に、すでに作成されているオペレーターを次のオペレーターの入力値として指定する

ことも可能です。代入されたオペレーターに複数の出力値が存在する場合は、最初の出力値に接続されます。

Page 5: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

5

スクリプト例1の短縮版

作成されたオペレーターが参照している変数は Model オブジェクトが記憶しているため、以下のようにオペレーターをつなげてスクリプ

トをまとめることができます。

# Spatial Model のライブラリーのインポート

from imagine import modeler

# 入出力データのディレクトリーの取得

# 詳細は exampleshelper.py を参照

from exampleshelper import dataPath, outputPath

# 空間モデルの作成

m = modeler.Model()

m.RasterOutput(m.StackTotal(m.BandSelection(m.RasterInput( \

dataPath + "lanier.img"), "1:4")), outputPath + "summing-image-layers.img")

# モデルの実行

m.Execute()

print "Done!"

オペレーター機能の制限

Pythonから Spatial Modelのすべてのオペレーターにアクセスすることはできません。IMAGINE 2013の時点では、Ifオペレーター、

Expression オペレーターおよび Criteria オペレーターは Python で利用することが出来ません。Pythonで直接利用可能なオペレ

ーターは以下のコードで確認できます。:

from imagine import modeler

modeler.list()

オペレーターの構文は Spatial Model Editorのオンラインヘルプに記載されています。また、Python IDLEではオペレーターの構文

の自動入力補完とコールチップ(メソッドの Tips )も利用できます。

モデルの保存と読み込み

空間モデルはファイルとして保存できます。また、既存のモデルファイルを読み込んで利用することもできます。モデルは Spatial

Model Editorで作成・実行できますが、Editorで複雑なモデルを作成し、後で Pythonから実行すると便利な場合もあります。

Page 6: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

6

例 2:Spatial Modelの保存

# Spatial Model のライブラリーのインポート from imagine import modeler

# 入出力データのディレクトリーの取得

# 詳細は exampleshelper.py を参照

from exampleshelper import dataPath, outputPath

# 空間モデルの作成

m = modeler.Model()

m.RasterOutput(m.StackTotal(m.BandSelection(m.RasterInput( \

dataPath + "lanier.img"), "1:4")), outputPath + "summing-image-layers.img")

# モデルの保存

outputFile = outputPath + "sum-layers.gmdx"

modeler.Solution.Save(m, outputFile)

print "Saved spatial model to: " + outputFile

保存したモデルは、Pythonで読み込む(次の例を参照)または、Spatial Model Editorで開いて利用できます。

例 3:保存した Spatial Modelの読み込みと実行

from imagine import modeler

from exampleshelper import outputPath

# 既存のモデルの読み込み

modelFile = outputPath + "sum-layers.gmdx"

m = modeler.Solution.Load(modelFile)

# モデルの実行

m.Execute()

print "Finished running " + modelFile

Spatial Modelの編集

Python に読み込んだモデルオブジェクトは、編集することができます(例えばオペレーターのパラメーターの変更など)。次の例では

モデルの内容の確認、オペレーターの追加、値の読み込みと変更を行っています。

Page 7: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

7

例 4:Spatial Modelの読み込みと編集

from imagine import modeler

from exampleshelper import dataPath, outputPath

# 既存のモデルの読み込み

modelFile = outputPath + "sum-layers.gmdx"

m = modeler.Solution.Load(modelFile)

# モデルの情報を表示

print m

for op in m.GetOperators():

print op

for port in op.GetPorts():

print port

# 特定のオペレーターの検索

rasterInput = next(op for op in m.GetOperators() \

if op.name == u"RasterInput")

# 検索したオペレーターの入力画像を変更

rasterInput["Filename"] = dataPath + "/wasia1-65535.img"

# 新しいオペレーターをモデルに追加

stats = m.Statistics(rasterInput)

# TableSubset オペレーターをモデルに追加

tableSub = m.TableSubset(stats["Max"], "2:2")

# 追加したオペレーターの出力値を標準出力ストリームに書き出し

band3Max = tableSub["TableOut"].data

print 'Maximum value of band 3 is: ' + str(band3Max)

データの設定と読み込み

以下のオブジェクトは Python と Spatial Modeler間で交換することができます。

文字列 (ファイル名やディレクトリー名含む)

整数と符号なし数値

浮動小数点

ブール型のフラグ

数値範囲(Spatial Modelerの Range型)

数値範囲のリスト (Spatial Modelerの RangeList 型)

Page 8: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

8

ERDAS IMAGINE とのインタラクション

IMAGINE のアプリケーションが開いていない場合でも、Python で Spatial Model のスクリプトを実行することができます。

IMAGINE のアプリケーションが開いている場合は、スクリプトから Spatial Model Editor でモデルの表示やデータのプレビュー表示

を実行できます。

例 5:Spatial Model Editorでのモデルの表示

from imagine import modeler

from exampleshelper import dataPath, outputPath

# 既存のモデルの読み込み

modelFile = outputPath + "sum-layers.gmdx"

m = modeler.Solution.Load(modelFile)

# モデルの情報を表示

print m

for op in m.GetOperators():

print op

for port in op.GetPorts():

print port

# 読み込んだモデルに新しいオペレーターを追加

rasterInput = next(op for op in m.GetOperators() \

if op.name == u"RasterInput")

stats = m.Statistics(rasterInput)

# 編集したモデルを Editor に表示。Editor で編集

# した変更は"m"に反映されません。

# ERDAS IMAGINE のアプリケーションが開いている必要があります。 m.ShowInEditor()

例 6:Spatial Modelのプレビュー表示

プレビューを表示するには、対象となるオペレーターを選択(選択されたオペレーターの最初の Outputポートのデータがプレビュー表

示されます)します。または、オペレーターと表示したい Outputポートの両方を指定します。

from imagine import modeler

from exampleshelper import dataPath

# 空間モデルの作成

m = modeler.Model()

# モデルにオペレーターを追加

ri = m.RasterInput(dataPath + "wasia1-65535.img")

nd = m.SetToNoData(ri, 65535)

Page 9: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

9

# オリジナル画像と編集後の画像のプレビュー表示

# ERDAS IMAGINE のアプリケーションが開いている必要があります。

m.Preview(ri['RasterOut'])

m.Preview(nd)

Pythonでのオペレーター機能の使用

Spatial Model Editor の Python Script オペレーターを使用してモデル内にスクリプトを埋め込むことができます。Python ファイル

から読み込んだスクリプトはモデルファイル(.gmdx)内に保存されます。

スクリプトには1つ以上の関数が定義されている必要があります。オペレーターを実行すると、最初に記述された関数が実行されま

す。このスクリプトでの入力と出力データは、Python とモデル間での交換で対応されているデータ型(文字列および数値)を利用

できます。

例 7:シンプルな Python Script オペレーター

Spatial Model Editorで Python Script オペレーターを追加します。以下のスクリプトをテキストファイルに保存し、.pyの拡張子を

持つファイル形式で保存します。Python Script オペレーターをダブルクリックし、保存したスクリプトファイルを選択します。

def generateFileName(baseName, extension):

return baseName + "-pan" + extension

このスクリプトは 2 つの文字列の入力値をもとに新しい文字列を作成します。テストするには、Editor の Properties パネルで 2 つ

の文字列を指定します。Spatial Model Editorは指定された値のデータ型の種類が判断できないため、明示的にデータ型を指定

する必要があります。例えば、”my-image”という値の場合、“(String)my-image”のように文字列の前にデータ型を括弧内に指定

します(引用符号“”は入力しないでください)。

モデルを実行すると下図のように、my-image-pan.tif という文字列がオペレーターの Outputポートに表示されます:

Page 10: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

10

オペレーターに保存されたスクリプトの編集

Python Script オペレーターをダブルクリックして Edit ボタンをクリックするとスクリプトを編集できます。Python Script オペレーターに

読み込んだ Python のスクリプトファイルにアクセスできる場合は、このファイルが表示されます。編集結果は.gmdx のスクリプトにも

反映され保存されます。もとの Python スクリプトファイルにアクセスできない場合は、.gmdx ファイル内に保存されたスクリプトが開き、

この内容を編集することができます。

データ型の指定

通常、Pythonはスクリプトが実行されるまでは変数に保存されたオブジェクトの型を把握していません。このため、Spatial Modeler

側でもオペレーターで処理の対象となるデータ型を検知することができません。このような状況に対応するために、この情報を関数の

パラメーターの名前の接尾辞として予め指定できます:

def generateFileName(baseName_Str, extension_Str):

return baseName_Str + "-pan" + extension_Str

この方法を使用することで、例7のように Spatial Modelerのパラメーターの設定時に、データ型の情報(例えば(String)など)を

記述する必要がなくなります。

対応している接尾辞を下表に示します。

変数接尾辞 Spatial Model オブジェクト型

_File ファイル (File)

_Dir ディレクトリー (Directory)

_Bool 論理型 (Bool)

_Int 符号なし整数型 (Unsigned)

_Double 倍精度実数型 (Double)

_Str 文字列型 (String)

_Scalar スカラー型 (Scalar)

Python Script オペレーターの制限

Python Script オペレーターはピクセルベースまたは各フィーチャーに対しての処理を実行することができません。例えば、ラスターオブ

ジェクトを Python Script オペレーターの入力データや出力データとして使用することは出来ません。このオペレーターは Spatial

Page 11: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

11

Modeler のフレームワークでは対応されていない部分を拡張するために提供されています。以下の様な状況で Python Script オ

ペレーターを活用できます:

モデルの途中でコマンドラインの処理を実行する(ファイル名やパラメーターの値を入力として処理した結果のファイル名を

返す)。

Spatial Modeler のオペレーター機能では実現が難しい文字列操作を実行する。例えば、あるひとつのマルチバンド画

像の各レイヤーをそれぞれ独立したファイルとして生成するとき、特定のルールにもとづいて入力画像の各レイヤーのファイ

ル名を生成する。

目的とする出力値が、数値、文字列またはファイル名ではない限り、Spatial Modeler の Python オペレーターに読み込んだスクリ

プト内で imagine.modelerモジュールを使用して空間モデルを作成するような使い方はお勧めいたしません。

スクリプトの例

例 8:画像の NoDataの設定

ラスター画像でマスクする値(NoData)が指定されていない場合、ERDAS IMAGINE のアプリケーションは0を Null 値もしくは

透過対象のピクセルとして認識する場合があります。このようなあいまいな定義による混乱を避けるためには、画像のマスク対象

(NoData)のピクセル値を明示的に指定する必要があります。

サンプルデータセットに wasia1-65535.img というデータが含まれています。このデータの Null ピクセルには 65535 という値が記録さ

れていますが、NoData値として 65535は指定されていません(ERDAS IMAGINEの 2D Viewでこのデータを表示してどのよう

な状態か確認してください)。以下の Python スクリプトは新しい画像を作成するときに、65535の値を持つピクセルをマスクする対

象として設定します。

from imagine import modeler

from exampleshelper import dataPath, outputPath

m = modeler.Model()

m.RasterOutput(m.SetToNoData(m.RasterInput( \

dataPath + "wasia1-65535.img"), 65535), outputPath + "wasia1-nodata.img")

# モデルの実行

m.Execute()

SetToNoData オペレーターは、このオペレーター以降の処理で指定された値を NoData(Null)として取り扱うように設定する機

能です。出力画像の NoData 値の設定を指定する機能ではありません。上記のスクリプトで出力された wasia1-nodata.img の

NoData値を Image Metadata機能で確認すると「-2147483648」に設定されています。Raster Output オペレーターの機能で

は出力画像の NoData 値を指定するパラメーターがあります。この値が設定されていない場合、デフォルトで出力画像のデータ型

の最小値が NoDataに設定されます。上記の例で使用した waisia1-65535.imgのデータ型は signed 32bitのため、このデータ

型の最小値である「-2147483648」が NoData として設定されています。

出力する画像の NoData 値を「65535」に設定するには、以下のように Raster Operator の NoDataValueパラメーターを使用

します。

m.RasterOutput(m.SetToNoData(m.RasterInput(dataPath + "wasia1-65535.img"), \

Page 12: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

12

65535), outputPath + "wasia1-nodata.img", NoDataValue="Integer (65535)")

例 9:モザイクファイルの解凍(Unzip)

最後に少し複雑なスクリプトを作成してみましょう。Python のサンプルデータには ZIP 形式で圧縮された3つの西アジアの画像

(wasia1, wasia2, wasia3)が格納されています。これらの画像の背景ピクセルには 0 という値が記録されていますが、この値は

NoData 値としてマスクするように設定されていません。この例では、ZIP を解凍し、3 つのファイルを 1 つのファイルにモザイクする処

理を Python スクリプトによって実行します。さらに、処理結果のプレビューを Spatial Model Editorの Preview Viewerで表示し

ます。

画像の解凍

この Python スクリプトでは、まず ZIP形式のデータを解凍しています。この例では、ZIP ファイルの解凍は unzipImages() という関

数の中で処理しています。

from imagine import modeler

from exampleshelper import dataPath, outputPath

import zipfile

import os

# この関数は_zipName_というファイルに格納されている

# .img 形式のファイルを_zipDest_というディレクトリーに解凍し

# 解凍した.img ファイルの名前を表示します。

def unzipImages(zipName, zipDest):

if not os.path.exists(zipDest):

os.makedirs(zipDest)

zip = zipfile.ZipFile(zipName)

unzippedImages = []

for f in zip.namelist():

if f.endswith(".img"):

zip.extract(f, path=zipDest)

unzippedImages.append(zipDest+f)

print "Extracted " + f + " from zip archive."

Page 13: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

13

return unzippedImages

# ZIP ファイルに格納されている.img 形式のファイルを探し、

# outputPath/unzipped/* にデータを解凍します。

zipName = dataPath + "wasia-images.zip"

zipDest = outputPath + "unzipped/"

images = unzipImages(zipName, zipDest)

画像のモザイク

解凍した画像ファイルに対して、空間モデルを使用するケースについて考えてみましょう。この場合、2つのオペレーターを使用できま

す:

1.“Set To NoData” オペレーターを使用してそれぞれの画像の背景値を NoData としてマスクします。

2.次に、”Replace NoData With” オペレーターを使用して、それぞれの画像の背景(NoData)のピクセル領域においては、

同じ領域をカバーしている他の画像の NoDataに該当しないピクセルの情報に置き換える処理を行います。

Spatial Model Editorで作成すると下図のようなモデルになります:

Python を使用すると、上図と同じようなモデルの処理を、3つの画像だけでなく何枚の画像にでも適用できるようになります。以下

に、ZIP解凍後の処理のスクリプトを記載します:

images = unzipImages(zipName, zipDest)

# 全ての画像をモザイクする空間モデルを作成

m = modeler.Model()

lastImage = None

for filename in images:

# Raster Inputオペレーターの追加:

rasterInput = m.RasterInput(filename)

# Set To NoDataオペレーターの追加:

maskZero = m.SetToNoData(rasterInput, 0)

# Replace NoData Withオペレーターの追加:

if lastImage != None:

replaceNoData = m.ReplaceNoDataWith(lastImage, maskZero)

Page 14: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

14

# この情報が次のReplaceオペレーターの入力となります: lastImage = replaceNoData

else:

lastImage = maskZero

# 結果をプレビュー表示(ERDAS IMAGINEが開いている必要があります)

m.Preview(lastImage)

このスクリプトを実行すると下図のように、入力画像の重なり合う範囲だけを含む画像ができてしまいます。

プロセスプロパティーの利用

なぜこのような画像ができてしまったのか、原因について考えてみましょう。Spatial Modelerのデフォルト設定では、画像の重なり合

う部分だけが処理の対象に設定されています。このため、今回のように3つの画像が重なり合っている小さい領域の画像が作成さ

れてしまいます。Spatial Model Editorの Processing Properties機能を使用して処理が適用されるデータ範囲を設定できます。

Window Ruleの設定で Union(処理データのすべての範囲)のオプションを指定すると、求める結果を得られます。

Page 15: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

15

Pythonのスクリプトからは、モデルのProcessing Propertiesを変更することはできませんが、次の方法で求める結果を得られます:

1. Spatial Model Editorで空のモデルを作成します。このとき、Processing Propertiesのオプションを Union of all inputs

in model に設定します。

2. 作成した空のモデルをテンプレートとしてPythonに読み込みます(例4の modeler.Solution.Load() を使用できます)。

3. オペレーターをモデルに追加します。

Unionのオプションが設定されている空のモデルは、サンプルデータに含まれています。変更後のスクリプトは以下のようになります:

# 全ての画像をモザイクする空間モデルを作成

# Window Rule が Union に設定されているモデルをベースに開始:

m = modeler.Solution.Load(dataPath + "union-template.gmdx")

lastImage = None

for filename in images:

# Raster Input オペレーターの追加:

rasterInput = m.RasterInput(filename)

# Set To NoData オペレーターの追加:

maskZero = m.SetToNoData(rasterInput, 0)

# Replace NoData With オペレーターの追加:

if lastImage != None:

replaceNoData = m.ReplaceNoDataWith(lastImage, maskZero)

# この情報が次の Replace オペレーターの入力となります:

lastImage = replaceNoData

else:

lastImage = maskZero

# 結果をプレビュー表示(ERDAS IMAGINE が開いている必要があります)

m.Preview(lastImage)

この処理の完全なスクリプトは、サンプルデータの unzipping-and-mosacking.py というファイルを参照してください。処理を実行す

ると下図のような、3つの画像の領域すべてを含んだモザイク画像が作成されます。

Page 16: ERDAS IMAGINE Spatial Modeler Python スクリプト …...Spatial Modeler でのPython®スクリプトの利用 3 概要 ERDAS IMAGINE® Spatial Modeler(ver. 2013 以降で搭載)ではPython®スクリプト言語を使用して空間処理モデルの

Spatial Modelerでの Python®スクリプトの利用

16

For more information about Intergraph, visit our website at geospatial.intergraph.com.

©2013 Intergraph Corporation. All Rights Reserved. Intergraph is part of Hexagon. Intergraph, the Intergraph logo, and

ERDAS IMAGINE are registered trademarks of Intergraph Corporation or its subsidiaries in the United States and in other countries. Other brands and product names are trademarks of their respective owners. Intergraph believes that the information in this publication is accurate as of its publication date. Such information is subject to change without notice. Intergraph is not responsible for inadvertent errors.