複数タイプの入力ファイルに対するバッチの作成方法

106 views
Skip to first unread message

ty

unread,
Jun 13, 2019, 1:39:04 AM6/13/19
to FMEユーザーフォーラム
飯島さま みなさま


以前は大変ありがとうございました。
「異なる解像度のラスタ同士で演算を行う」でいただいた、 geotiffrez1_minus_geotiffrez2_2geotiff-2.fmwt
について、RasterPropertyExtractorは属性だけを変数として抽出するだけでなく、入力に属性を付与して出力ができること、
属性とジオメトリは独立していることを理解しました。


類似の作業を、フォルダ内の毎年毎月のファイルに適用しようと四苦八苦しております。
例えば
フォルダAからの入力
tm_world_borders_03__199601_zoom1.tiff
tm_world_borders_03__199602_zoom1.tiff


フォルダBからの入力
tm.199601_zoom2.tiff
tm.199602_zoom2.tiff


フォルダCへの出力
tm_03__199601_zoom1_minus_zoom2.tiff
tm_03__199602_zoom1_minus_zoom2.tiff

としたい場合、


FME上からバッチを自動で作成しようとすると入力は1つのものしか受け付けない形式になってしまいます。
入力ファイルの1つ目から年月を生成して、入力ファイルBの2つ目のファイル名と出力ファイル名を指定する方法、
あるいは、コマンドライン上から例えば以下のような感じにコマンドとして扱って、インプットを指定する方法
FME.exe geotiffrez1_minus_geotiffrez2_2geotiff-2.fmwt tm_world_borders_03__199601_zoom1.tiff tm.199601_zoom2.tiff tm_03__199601_zoom1_minus_zoom2.tiff
などが考えられましたが上記の方法あるいは他の適切な方法をお教えいただくことはできますでしょうか?



どうぞよろしくお願いします。


Takashi Iijima

unread,
Jun 13, 2019, 6:40:23 PM6/13/19
to fm...@googlegroups.com
いろいろとやり方は考えられますが、このケースではおそらく、2つのGeoTIFFリーダーで、それぞれのフォルダー内にあるすべての *.tif ファイルを読み込み、ファイル名の年月の部分 (yyyymm) を抽出し、年月の値を Group By 属性として同一年月のラスターのペアで処理を行うのが簡単だと思います。

まず、フォルダー内の全ての *.tif ファイルの読込方法ですが、ファイルによってデータが提供されるフォーマットの場合は、どのフォーマットでも、Add Reader 画面 Dataset フィールド右側のメニューボタン [▼] > Select Multiple Folders/Files で Select File 画面を開き、ひとつ以上のファイルまたは/およびひとつ以上のフォルダーを同時に選択することができます。

fig01-add-resder.png

fig02-select-file-add-folders.png


フォルダーを選択したときは、上の図のように File/Filter 列でワイルドカード * によってファイル名のパターンを指定することができます。

不要なパターンの行は、その行を選択し、[Remove] ボタンで削除してください。


*.tif の行だけ残し、[OK] で Add Reader 画面に戻ると、次のような表示になります。

なお、Dataset フィールドは、上の Select File 画面を使わずに、直接キー入力しても構いません。

fig03-add-reader.png


この状態で [OK] で閉じると、キャンバスに GEOTIFF リーダーフィーチャータイプが追加され、そのまま実行すると、指定したフォルダー内の全ての *.tif ファイルが読み込まれます。


次に、ファイル名から yyyymm の部分を抽出する方法について。

このケースのように、ファイル名の命名規則が明確な場合は、fme_basename 属性 (拡張子を除いたファイル名) から、StringSearcher または SubstringExtractor によって、yyyymmの部分を抽出することができると思います。

"tm_world_borders_03__{yyyymm}_zoom1" のパターンのファイル名から、{yyyymm} の部分を抽出する場合の StringSearcher の設定例を示します。

fig04-string-searcher.png


この例で使った正規表現 "(?<=__)\d+(?=_zoom)" は、「"__" (アンダースコア2個) の直後、 "_zoom" の直前にある1個以上の連続した数字 (\d+)」というパターンを表します。

つまり、"__" と "_zoom" にはさまれた数字列であり、この設定では、fme_basename の中でそれに一致する部分={yyyymm}が抽出されて、_year_month という新しい属性に格納されます。


ご不明な点がありましたら、追加でご質問ください。



Takashi Iijima

unread,
Jun 14, 2019, 10:07:53 PM6/14/19
to fm...@googlegroups.com
「異なる解像度のラスタ同士で演算を行う」(2019-05-01)の回答でお示ししたワークスペース例を改良するならば、次のようになります(詳細は、画像を別タブで開いてご覧ください)。

workspace-example.png



フォルダーA、フォルダーBから読み込まれるラスターフィーチャーについて、StringSearcher によってファイル名から年月(yyyymm)の部分を属性として抽出し、それを Clipper, RasterCellValueCalculator の Group By パラメーターに設定することで、同一年月のラスター間で処理が行うことができます。

正規表現は、前回回答よりも簡略にしました。「"_zoom" 直前でひとつ以上の数字が連続している部分」と一致します。

\d+(?=_zoom)

なお、Clipper の Clipper ポートから入力されるフィーチャーが複数になるので、Clipper Type は Multiple Clippers にしなくてはならないことにもご注意ください。


出力先のライターフィーチャータイプでは、フィーチャータイプ名 (Raster File Name) として、年月文字列を使った次のような文字列連結式を設定することで、年月別に適切なファイル名となります。

tm_03__@Value(_year_month)_zoom1_minus_zoom2


以上、お試しください。
Reply all
Reply to author
Forward
0 new messages