概要
ESAから配布されている衛星データ解析ソフトウェアSNAPは無料で利用可能な衛星データ解析ソフトウェアですが、GUIメインでの操作では大量にデータを処理したい場合に課題を抱えていました。そのため、Python APIであるsnappyが提供されています。本記事では、このサイト "Getting Started with SNAP Toolbox in Python"にて紹介されていた方法を基にしてsnappyを起動し、その仮想環境をJupyter Notebookへ設定したいと思います。Jupyter Notebookの設定については、こちらの記事を参考としました。
方法
SNAPソフトウェア、及びAnaconda3がインストール済みであることが前提条件です。
①Anaconda promptを起動したら、conda create -n snap python=2.7を入力してpython 2.7の仮想環境を作ります。snappyはpython 3.3もしくは3.4でも動くとされていますが、これらのpythonバージョンでの仮想環境の作成が上手くいかなかったため、2.7で実行を行っています。
追記: ここにsnappyは ”2.7, 3.3 to 3.6に対応してます”と書いてあったので、python 3.6で仮想環境を作ってみたら普通に動きました。SNAPソフトウェアダウンロード時の注意書き(↓)の、python 2.7・3.3・3.4しかサポートされていないとは何だったのか…(困惑)
②SNAP Command-Lineを起動します。SNAP Command-Lineは、システムを検索することで見つけられると思います。
SNAP Command-Line中に、snappy-conf {path_to_snap_env}\python.exe {path_to_snap_env}\Lib\を入力します。ここでpath_to_snap_envとは、Anacondaフォルダ下にあるsnapフォルダへの絶対パスを示しています。自分の場合はエラーメッセージ(?)がいくつか表示されていましたが、現段階では問題なく動いています。
③Anaconda Promptにおいてconda activate snapを入力してsnapの仮想環境に移動します。conda install snappyでライブラリをインストールします。
④snappyを利用可能になりました。無事にsnappyをimport出来ています。
このままではコードが読みづらく使いにくい為、引き続き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のコマンドを入力することで行えます。
⑤カーネルが設定されていました!
⑥snappyのimport等も、問題なく行えます。以下の画像は、Jupyter Notebook上でテスト画像コードを動かしてみた結果です。
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()