FMEでPythonのパッケージを使ってみた

FMEでWhiteboxToolsを使いたいので、Pythonのパッケージを使えるようにしてみる。

## はじめに
FMEを使えばいろんなことができるけど、PythonCallerをうまく使えば、FMEでできることが無限大に広がると思います。特に[WhiteboxTools](https://www.whiteboxgeo.com/)を絡められたら素敵すぎる！そんなことで、基本的なところから、解析するところまで、勉強しながら使い方を共有したいと思います。基本的にはWindows環境で試します。適宜Macの方もカバーします。

まず最初に、役に立つサイトをいくつか紹介
- [FMEでパイソンパッケージのインストール](https://docs.safe.com/fme/html/FME-Form-Documentation/FME-Form/Workbench/Installing-Python-Packages.htm)

## 前提条件
- FMEがインストール済み

## 流れ
1. FME Formと一緒にインストールされているのPythonのバージョンの確認
2. pipを使ってパッケージをインストール
3. 確認


### 1. FME Formと一緒にインストールされているのPythonのバージョンの確認
Windowsなら、コマンドラインツールを開いて、以下のコマンドを叩く。
```
fme.exe python --version
```

例えばこんな風に返ってくる
```
INFORM: Using Python interpreter from `C:\Program Files\FME\fmepython312\python312.dll' with PYTHONHOME `C:\Program Files\FME\fmepython312'
INFORM: Python version 3.12 loaded successfully
Python 3.12.6
```
これで、Pythonがインストールされていることとそのバージョンが確認できる。

### 2. pipを使ってパッケージをインストール
今回は、Whitebox Toolsをインストールする。
```
fme.exe python -m pip install whitebox
```
うまく行けば、以下のように反応がある。
```
INFORM: Using Python interpreter from `C:\Program Files\FME\fmepython312\python312.dll' with PYTHONHOME `C:\Program Files\FME\fmepython312'
INFORM: Python version 3.12 loaded successfully
Collecting whitebox
  Downloading whitebox-2.3.6-py2.py3-none-any.whl.metadata (11 kB)
Collecting Click>=6.0 (from whitebox)
  Downloading click-8.2.0-py3-none-any.whl.metadata (2.5 kB)
Collecting colorama (from Click>=6.0->whitebox)
  Using cached colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
Downloading whitebox-2.3.6-py2.py3-none-any.whl (74 kB)
Downloading click-8.2.0-py3-none-any.whl (102 kB)
Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Installing collected packages: colorama, Click, whitebox
Successfully installed Click-8.2.0 colorama-0.4.6 whitebox-2.3.6
```
ということで、あっという間にインストールができてしまいました。めでたし。
ちなみに、WindowsとMacでのインストールのコマンドは、
- Windows: 
  - `fme.exe python -m pip install <package_name>`
- macOS: 
  - `./fme python -m pip install <package_name>`

ということになります。

### 3. 確認
それでは、FMEでうまくWhitebox Toolsを呼び出せるか確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59906/2b5590eb-4dbd-4d74-b014-e64777ccab7d.png)
まずはPythonCallerだけを含む簡単なワークスペースを作成します。
そのうえで、PythonCallerの設定を開き、迷わず、AIアシスタントボタンを押します（FME Form 2025.0.1を使っています。古いバージョンだとAI Assistantがないかもしれません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59906/6d5ce4fd-eb4f-4ee5-bf4e-299ec97a77b0.png)

アシスタントさんに、コードを書いてくれるよう頼みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59906/4c8a6ed2-440d-47b8-b83d-bb57518d881e.png)
ちなみに以下のようなプロンプトを書きました。
`With the whitebox tools, I want to analyze a simple dem and create a slope raster.`
そのあと何度かやり取りをして、最終的に以下のようなコードになり、それを貼り付けて、Workspaceを実行しました。

```
import whitebox
import os

class FeatureProcessor:
    def __init__(self):
        self.wbt = whitebox.WhiteboxTools()
        self.working_dir = r"c:/tmp"
        self.wbt.set_working_dir(self.working_dir)

        self.input_dem = os.path.join(self.working_dir, "iriomote.tif")
        self.output_slope = os.path.join(self.working_dir, "iriomote_slope.tif")

        self.processed = False

    def input(self, feature):  # ← このメソッド名が必要
        if not self.processed:
            self.wbt.slope(
                dem=self.input_dem,
                output=self.output_slope
            )
            self.processed = True
            feature.setAttribute("status", "Slope raster created successfully.")
        else:
            feature.setAttribute("status", "Slope raster already created.")

        feature.setAttribute("slope_raster", self.output_slope)
        return feature

```
結果をQGISで表示してみました。うまく行っていますね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59906/2c2238be-f2f8-445d-bd20-7580a09c666a.png)

FMEでWhitebox Toolsが使えるなら、地形解析、水文解析、LiDAR解析などやり放題ですよね！これはたまらない。