宙畑 Sorabatake

衛星データ

【ゼロからのTellusの使い方】Jupyter Labでひまわり8号の画像を取得してアニメーションを作ろう

Tellus上でJupyter Labを使ってひまわり8号の画像を取得してアニメーションを作る方法をご紹介いたします。

本記事ではTellusのJupyter Labを使ってひまわり8号の画像を取得してアニメーションを作る方法を紹介します。

TellusでJupyter Lab(Jupyter Notebook)を使う方法は、「Tellusの開発環境でAPI引っ張ってみた」をご覧ください。

1. ひまわり8号の画像を取得するには

TellusのAPIによりひまわり8号のモノクロ画像(光学バンドと4つの赤外バンド)を取得することができます。

APIの使い方はリファレンスにまとめられています。
APIリファレンス

※画像を利用する際は、データ詳細のデータポリシーを確認して、規約を違反しないように注意してください。

https://gsiapi.tellusxdp.com/api/v1/himawari8/{band}/{yyyy}/{mm}/{dd}/{hhmmss}/{z}/{x}/{y}.png
band 取得するバンド(B03/B07/B08/B13/B15 )
例:B03
yyyy 取得年(西暦、UTC)(2016 / 2017)
例:2017
mm 取得月(2桁の数字、UTC)
例:04
dd 取得日(2桁の数字、UTC)
例:01
hhmmss 取得時刻(6桁の数字、UTC)
各時刻の20分または50分を選択
例:005000
z タイルのズームレベル(1-4)
B03のみ6まで対応
例:4
x タイルのX座標
例:13
y タイルのY座標
例:6

※取得可能期間は2016年1月1日00:50(UTC)から2017年12月31日23:50(UTC)です。

import requests
from skimage import io
from io import BytesIO
%matplotlib inline

TOKEN = ‘ここには自分のアカウントのトークンを貼り付ける’

def get_himawari8_scene(band, yyyy, mm, dd, hhmmss, z, x, y):
    url = 'https://gisapi.tellusxdp.com/himawari8/{}/{}/{}/{}/{}/{}/{}/{}.png'.format(band, yyyy, mm, dd, hhmmss, z, x, y)
    headers = {
        'Authorization': 'Bearer ' + TOKEN
    }
    
    r = requests.get(url, headers=headers)
    
    if r.status_code is not 200:
        raise ValueError('status error({}).'.format(r.status_code))
    return io.imread(BytesIO(r.content))

img = get_himawari8_scene('B03', '2016', '04', '01', '032000', 4, 13, 6)
io.imshow(img)

トークンはマイページのAPIアクセス設定(要ログイン)から取得してください。

実行すると画像が表示されます。

出典:気象庁

2. ひまわりの各バンドの特徴

2019年7月現在、Tellusでは以下のバンド(波長帯)における観測データを、2016年から2017年のおよそ2年分提供しています。

  • バンド3(可視) :0.64 μm
  • バンド7(赤外4):3.9 μm
  • バンド8(赤外3):6.2 μm
  • バンド13(赤外1):10.4 μm
  • バンド15(赤外2):12.4 μm

2.1 バンド3(可視)

バンド3は人間の目が赤として感じる波長帯です。陸や海、雲が観測でき、太陽光を強く反射する(つまり雲や氷雪)ほど白く表現されます。

観測は太陽光に左右されるため、夜の時間帯は真っ黒の画像になってしまいます。

出典:気象庁

2.2 バンド7(赤外4)

バンド7は短波赤外と呼ばれる領域に含まれる波長帯です。太陽光の一部と地球からの黒体放射(熱を持つ物体が出す電磁波)が含まれる領域で、昼と夜で画像の見え方が異なります。

出典:気象庁

2.3 バンド8(赤外3)

バンド8は熱赤外と呼ばれる領域に含まれる、水蒸気に吸収されやすい特徴を持つ波長帯です。

その特徴から、高度が高い雲ほど白っぽく、低い雲ほど黒っぽく画像では表現されます。

出典:気象庁

2.4 バンド13(赤外1)

バンド13は熱赤外と呼ばれる領域に含まれる波長帯です。バンド8とは異なり水蒸気に吸収されにくい波長なのが特徴です。

また太陽光の影響を受けにくいため、昼夜を通して均質な観測ができます。

出典:気象庁

2.5 バンド15(赤外2)

バンド15は熱赤外と呼ばれる領域に含まれる波長帯です。

バンド13と似た特徴を持っていますが、火山灰や黄砂に含まれるケイ素が放射する波長がバンド15の範囲で最大となることから、主に大気成分の観測に利用されます。人の目ではバンド13とほとんど区別がつきません。

出典:気象庁

3. 雲の動きをアニメーションにしよう

最後に、ひまわりの画像を使ったアニメーションを作ってみましょう。今回はアニメーション内のテキストに日本語を使いたいと思います。

利用する可視化ライブラリ(matplotlib)がデフォルトの状態で日本語を利用することができないため、コードを動かす前にフォントの準備を行います。

「Launcher」から「Other」の項目にある「Terminal」を選択します。

日本語フォントをダウンロードするには、Terminalから開いた黒い画面に次のコマンドを実行してください。

cd ~/work; wget https://ipafont.ipa.go.jp/old/ipafont/ipag00303.php; unzip ipag00303.php
IPAフォントをダウンロード(ファイルを保存する場所は自分で変更することもできます)

以上で日本語フォントの準備ができたので、サンプルコードを実行しましょう。サンプルでは2017年8月1日9時から72時間分の光学画像をつなげてgifファイルを作成しています。

import os
from pathlib import Path
from datetime import datetime
from datetime import timedelta
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import font_manager as fm

basepath = Path(os.path.expanduser('~'))
fontpath = basepath / 'work/ipag00303/ipag.ttf' #フォントファイルの場所
font_prop = fm.FontProperties(fname=str(fontpath), size='large')
fig, ax = plt.subplots()

ims = []

begin_year = 2017
begin_month = 8
begin_day = 1
begin_hour = 9
hours = 72
interval_hours = 1
band = 'B03'
z = 4
x = 13
y = 6

begin_datetime = datetime(begin_year, begin_month, begin_day, begin_hour, 20, 0, 0) - timedelta(hours=9)
end_datetime = begin_datetime + timedelta(hours=hours)

temp_start = begin_datetime
while temp_start < end_datetime:
    try:
        title = ax.text(0.5, 1.05, 'ひまわり '+(temp_start + timedelta(hours=9)).strftime('%Y年%m月%d日%H時'),
                     ha='center', va='bottom', transform=ax.transAxes, fontproperties=font_prop) #日本語を使う箇所で毎回fontpropertiesを指定する
        
        img = get_himawari8_scene(band, str(temp_start.year), str(temp_start.month).zfill(2), str(temp_start.day).zfill(2), temp_start.strftime('%H%M%S'), z, x, y)

        ims.append([plt.imshow(img, cmap='gray'), title])

    except ValueError as e:
        print(e)
    temp_start = temp_start + timedelta(hours=interval_hours)

ani = animation.ArtistAnimation(fig, ims)

ani.save(str(basepath / 'work/himawari.gif'), writer=’pillow’)
plt.close()

from IPython.display import HTML
HTML('<img src="/work/himawari.gif">')
出典:気象庁

光学バンド(B03)の画像をつなげているため、何も写らない時間帯が定期的に出来てしまいます。

赤外バンドの観測であれば夜の間も観測ができるので、興味のある人はサンプルコードを改良して、赤外バンドのアニメーションも作ってみてください。また、違う期間や場所のアニメーションを作るのにも挑戦してみましょう。

4.もしgifがループしなかったら

matplotlibのバージョンのアップデートが必要です。

# matplotlibのバージョンが3.1.0未満の場合、サンプルコードではGIFがループしない
import matplotlib
matplotlib.__version__
アップデートが必要な例

matplotlibのバージョンが3.1.0未満だった人は、黒い画面(ターミナル)で’conda update matplotlib -y’とアップデートコマンドを実行してください。

ターミナルからmatplotlibをアップデート

アップデート後、LabのNotebookを「Restart」し再度サンプルコードを動かしてみてください。

上部のアイコンからカーネルを再起動

バージョン表記が変わっていたら成功です。

成功例

今回は、TellusのJupyter Labを使ってひまわり8号の画像を取得する方法と、画像からアニメーションを作る方法をご紹介しました。

アニメーションは他の衛星画像にも応用可能です。分析だけでなくデータビジュアライズも向上させていきましょう。

参考文献

気象衛星センター:観測画像の特性

気象衛星画像の解析と利用