宙畑 Sorabatake

衛星データ

【ゼロからのTellusの使い方】Tellusの開発環境でAPI引っ張ってみた

Tellusに搭載されているAPIを引っ張ることができるようになったので、植生分析をしながらJupyter Notebookの機能をご紹介していきたいと思います!

衛星データプラットフォームTellusは2月から、Pythonを使ったデータ分析で使われることの多いJupyter Notebookに対応しました。

Tellusに搭載されているAPIを引っ張ることができるようになったので、早速データを引っ張ってみて、Jupyter Notebookの機能をご紹介していきたいと思います!

※本記事の内容を実践するためにはTellusの利用登録が必要になります。利用登録はこちらから可能です。

Tellusには、大きく2種類のアクセス方法があります。
1つはブラウザ上に表示した地図上に様々なデータを重ね、操作できるTellus OS、もう1つはプログラミングでデータを解析する開発環境(以下、Jupyter Notebook)です。

Tellusの開発環境では、各種データとJupyter NotebookがAPIで連携しています。そのため、Jupyter Notebook上からプログラミングによりAPIで引っ張ることで、データを引っ張り、解析することができます。

ちなみに、裏側のコンピューティングは専用サーバーとクラウドを選択できるようになっています。
大規模な計算をするようであれば、占有環境を申し込むのもありかも・・・。

(1) Jupyter Notebookを起動してみる

Jupyter NotebookをTellusで使用できるようにするための手続きはここで確認できます。
https://www.tellusxdp.com/ja/tutorial

まず、Tellusで会員登録します。

次に、ログインした状態で「開発者向けトップページ」へ。
サービスプランの下部にある「開発環境の申し込み」を選択します。

入力フォームが出てくるので、使用したいプランを選択。

少し待つと、窓口の方からメールが届きます。
Jupyter Notebookのログイン情報が届くので、初回パスワードを設定して開発環境にログインします。メールに、その後のログインの仕方が記載されているので、指示通りに操作し、ログインします。

Jupyter Notebookにログインした状態のままTellus OSにログインし、左上部のターミナルアイコンをクリックすると「Jupyter Notebookを開く」というウィンドウが現れるのでクリックします。

そうすると、Jupyter Notebookトップに遷移します。

(2) Jupyter Notebookのデフォルトディレクトリを見てみる

Jupyter Notebook環境にログインすると、いくつかのディレクトリがあります。それぞれのディレクトリは下記のような構成になっています。

●/examples:編集不可のサンプルコードが入っているようです。今回の雪質解析は、ここで試すことができます!

●/tellus_data:Tellus OSからJupyter Notebookに送信したデータが置かれるディレクトリです。Tellus OSでの送信方法はこちらの記事で読むことができます。tiff形式で送信されるため、Jupyter Notebookのプレビューでは今の所表示できないようです。

●/work :好きなnotebookを作ることができるディレクトリです。自分の好きなnotebookを持ってくることもできます。

work以外のディレクトリは読み取り専用モードになっているので、何か新しく作りたかったり、保存したかったりするものは全てwork配下に作成することになります。

また、基本的なライブラリはプリセットでインストールされていますが、右のNewからTerminalを開けば、pip、condaコマンドでライブラリの追加インストールができます。

※但し、work、tellus_data配下以外は、アップデートなどでリセットされる可能性があるので、一旦手元に入れたものをメモしておいたほうが良さそうです。

(3) どうやって解析するか?

つぎに、Tellusに搭載される衛星データのうち、使えそうなデータを探します。
データカタログ|Tellus

現時点で公開されているのは、光学画像のAVNIR-2、ASNARO1、SAR画像のPALSAR-2など。

現時点のTellusでAPIとして公開され、かつ波長解析もできそうなのはAVNIR-2のようなので、AVNIR-2を使って簡単な解析をしてみたいと思います。

(4) APIで画像取得

それでは、早速これを使ってAPIで画像取得をしてみます。APIは下記がこれから更新されていくようです。
APIリファレンス|Tellus

APIを利用するためには、APIトークンを利用した認証が必要とのこと。
マイページからAPIキーを発行します。
APIキー発行

AVNIR-2のデータは、陸域観測衛星だいち(ALOS)に搭載されていた光学センサです。青・緑・赤の光の波長帯に含まれる画像を合成することで、人の目で見るのと同じような可視光画像を作ることができます。

波長についてはこちらの記事で詳しく解説しています。
光の波長って何? なぜ人工衛星は人間の目に見えないものが見えるのか

今回、exampleに用意したサンプルを開くと、API取得から解析までの流れを実行しながら辿ることができます。ですので、一緒に開きながら読んでいただけると理解が深まるかもしれません。

examplesディレクトリを開くと下記のような構成になっているので、まずはREADME.mdを必ず読みましょう。notebooksディレクトリには、植生解析のサンプルコードを記載しています。dataには、今回の解析に使用しているデータを格納しています。

README.md:今回のサンプルの全体構成などを説明しています
/notebooks:植生解析Pythonコードを、Jupyter Notebook形式で格納しています

令和になることを祝って、今回は皇居周辺の植生を見てみたいと思います。
下記のように位置を指定して引っ張ることができます。

# 定数
## APIのドメイン
URL_DOMAIN = "gisapi.tellusxdp.com"
## APIトークンをセットしてください
BEARER_TOKEN = "" 

## 皇居周辺の座標
Z = 13
X = 7276
Y = 3225

if BEARER_TOKEN == "":
    print("APIトークンがセットされていません")

def get_data(img_type, domain=URL_DOMAIN, z=Z, x=X, y=Y, query=""):
    if query != "":
        query = "?" + query

    # AuthorizationヘッダにAPIトークンをセットすることで認証されます
    res = requests.get("https://{}/{}/{}/{}/{}.png{}".format(URL_DOMAIN, img_type, z, x, y, query),
                   headers={"Authorization": "Bearer " + BEARER_TOKEN})

    # 取得した画像データをNumPyの多次元配列形式で保持します
    img = img_to_array(load_img(BytesIO(res.content)))
    return img.astype(np.uint8)

img_osm = get_data("osm")
img_band1= get_data("blend", query="r=3&g=2&b=1&rdepth=0&gdepth=0")
img_band2 = get_data("blend", query="r=3&g=2&b=1&bdepth=0&rdepth=0")
img_band3 = get_data("blend", query="r=3&g=2&b=1&gdepth=0&bdepth=0")
img_band4 = get_data("blend", query="r=4&g=4&b=4")
img_ndvi = get_data("blend", query="preset=ndvi")

(5) いざ解析!

OpenStreetMapの確認

衛星画像だけでは、どの場所を参照しているのかわかりにくいため、参照用としてOpenStreetMapの情報も引き出せるようにします。

print(img_osm.shape)
io.imshow(img_osm)

AVNIR-2の確認

AVNIR-2では4つの異なる波長のデータを利用できます。大まかに、Band1は青の波長、Band2は緑の波長、Band3は赤の波長、Band4は近赤外の波長に対応します。それぞれ単独で見ると以下のような画像になります。

io.imshow(np.hstack((img_band1, img_band2, img_band3, img_band4)))

それぞれ可視光の青・緑・赤・(近赤外)に対応しているため、RGB(赤緑青)として1枚の画像に合成すると人の目で見た色に近いものになります。このようにして合成されたものTrue Color画像と呼びます。

true colorのRGB合成

●R: Band3(赤)
●G: Band2(緑)
●B: Band1(青)

true colorの画像を出力するためのコードは以下になります。

img_true = np.c_[img_band3[:,:,0:1], img_band2[:,:,1:2], img_band1[:,:,2:3]]
io.imshow(img_true)

実行すると下記のようになります。

 

true color以外にも合成方法はあり、例えば植生域だけを際立たせたい時は、植物の分布域が緑で表現されるnatural colorと呼ばれる合成が用いられます。これは、近赤外線は植物の反射率が高いことを利用し、RGBの、赤色として赤の波長であるBand3、緑色として近赤外の波長であるBand4、青色として緑の波長であるBand2を割り当てたものです。

natural colorのRGB合成

●R: Band3(赤)
●G: Band4(近赤外)
●B: Band2(緑)

natural colorを合成するためのコードは以下のようになります。

img_natural = np.c_[img_band3[:,:,0:1], img_band4[:,:,0:1], img_band2[:,:,1:2]]
io.imshow(img_natural)

こちらを実行すると、以下のようになります。

皇居周辺に植物が多いことが見て取れます。

NDVI

Normalized Difference Vegetation Index (NDVI) を用いることでより植生を見ることができます。NDVIとは正規化植生指標のことであり、可視域赤 ( 𝑅 , Band3) と近赤外 ( 𝐼𝑅 , Band4) のデータから以下の式で計算されます。 [−1,1] に正規化され、値が大きいほど植生が多いことを表します。

𝑁𝐷𝑉𝐼=𝐼𝑅−𝑅𝐼𝑅+𝑅

io.imshow(img_ndvi)

NDVIに関しては、Tellus OSでもボタン一つで見ることができます。

今回は、Tellusで先日リリースされた開発環境を使ってみました。
解析に必要なライブラリなどはプリセットで入っているようですが
自分で好きなライブラリも追加できるようです。

会員登録と利用登録をするだけで衛星データの解析環境を手軽に手に入れることができるので、
今のうちに色々と使いながら勉強してみたいところです。
Tellusの利用登録はこちらから。