ESA SNAPのPython APIの起動と仮想環境のJupyter Notebookのカーネルへの設定

##概要
　ESAから配布されている衛星データ解析ソフトウェア[SNAP](https://step.esa.int/main/)は無料で利用可能な衛星データ解析ソフトウェアですが、GUIメインでの操作では大量にデータを処理したい場合に課題を抱えていました。そのため、Python APIであるsnappyが提供されています。本記事では、[このサイト "Getting Started with SNAP Toolbox in Python"](https://towardsdatascience.com/getting-started-with-snap-toolbox-in-python-89e33594fa04)にて紹介されていた方法を基にしてsnappyを起動し、その仮想環境をJupyter Notebookへ設定したいと思います。Jupyter Notebookの設定については、[こちらの記事](https://qiita.com/smiler5617/items/e0d9b3034d79457cc253)を参考としました。
##方法
　SNAPソフトウェア、及びAnaconda3がインストール済みであることが前提条件です。

①Anaconda　promptを起動したら、conda create -n snap python=2.7を入力してpython 2.7の仮想環境を作ります。snappyはpython 3.3もしくは3.4でも動くとされていますが、これらのpythonバージョンでの仮想環境の作成が上手くいかなかったため、2.7で実行を行っています。
![conda_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/d89dcb3b-ce4f-1af0-6a58-1df8cfea2df8.png)

**追記: [ここ](https://senbox.atlassian.net/wiki/spaces/SNAP/pages/50855941/Configure+Python+to+use+the+SNAP-Python+snappy+interface)にsnappyは ”2.7, 3.3 to 3.6に対応してます”と書いてあったので、<font color="crimson">python 3.6で仮想環境を作ってみたら普通に動きました。</font>SNAPソフトウェアダウンロード時の注意書き（↓）の、python 2.7・3.3・3.4しかサポートされていないとは何だったのか…（困惑）**　
![pythonVersionSNAPPY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/f242aa8e-551d-a27f-571f-5d4c1f570c71.png)

②SNAP Command-Lineを起動します。SNAP Command-Lineは、システムを検索することで見つけられると思います。
![snap_command_line.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/e0a33da2-4d8c-4b93-a9f6-f1b177674676.png)
SNAP Command-Line中に、snappy-conf {path_to_snap_env}\python.exe {path_to_snap_env}\Lib\を入力します。ここでpath_to_snap_envとは、Anacondaフォルダ下にあるsnapフォルダへの絶対パスを示しています。自分の場合はエラーメッセージ（？）がいくつか表示されていましたが、現段階では問題なく動いています。
![snap_command_line_spanpyconf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/c0f3f2a0-b949-b82c-e4e8-b3aae5fb907c.png)
③Anaconda Promptにおいてconda activate snapを入力してsnapの仮想環境に移動します。conda install snappyでライブラリをインストールします。
④snappyを利用可能になりました。無事にsnappyをimport出来ています。
![snappy_import.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/9a885849-89a9-feeb-f321-7f08f23a926f.png)

このままではコードが読みづらく使いにくい為、引き続きJupyter Notebookのカーネルへとsnanppyを起動可能な仮想環境を設定していきます。
①Anacondaとpipを混ぜるとよろしくないらしいので、Window本体のコマンドプロンプトでpip install jupyter notebookを入力してインストールを行います。
②snapの仮想環境に入り、conda install ipykernelを入力して仮想環境へインストールを行います。
③Jupyterへカーネルを追加します。自分は"snap_jupyter_kernel"という名前で追加を行ったので、snap仮想環境のプロンプトへ次の様へ入力を行いました。ipython kernel install --user --name=snap_jupyter_kernel。
④Jupyter notebookを立ち上げて、カーネルに追加されているか確認してみましょう。Jupyter notebookの起動については、conda deactivateでbaseへ戻り、Jupyter-Notebookのコマンドを入力することで行えます。
⑤カーネルが設定されていました！
![kernel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/29df8089-daa5-99ef-1cb0-8d7461e729d1.png)
⑥snappyのimport等も、問題なく行えます。以下の画像は、Jupyter Notebook上でテスト画像コードを動かしてみた結果です。

```python:sampleCode.py
import os
import numpy as np
import matplotlib.pyplot as plt
import snappy
from snappy import ProductIO

path = r'C:\Users\shoki\anaconda3\envs\snap\Lib\snappy\testdata'
filename = 'MER_FRS_L1B_SUBSET.dim'
df = ProductIO.readProduct(os.path.join(path, filename))
band = df.getBand('radiance_3')
w = df.getSceneRasterWidth() 
h = df.getSceneRasterHeight() 
band_data = np.zeros(w * h, np.float32)
band.readPixels(0, 0, w, h, band_data)
band_data.shape = h, w
plt.figure(figsize=(18,10))
plt.imshow(band_data, cmap = plt.cm.binary)
plt.show()
```
出力例
![testOutput.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059565/437e7cfa-a370-1e25-e50e-8292bf4be67e.png)