【ゼロからのTellusの使い方】Jupyter Labでひまわり8号の画像を取得してアニメーションを作ろう
Tellus上でJupyter Labを使ってひまわり8号の画像を取得してアニメーションを作る方法をご紹介いたします。
記事作成時から、Tellusからデータを検索・取得するAPIが変更になっております。該当箇所のコードについては、以下のリンクをご参照ください。
https://www.tellusxdp.com/ja/howtouse/access/traveler_api_20220310_
firstpart.html
2022年8月31日以降、Tellus OSでのデータの閲覧方法など使い方が一部変更になっております。新しいTellus OSの基本操作は以下のリンクをご参照ください。
https://www.tellusxdp.com/ja/howtouse/tellus_os/start_tellus_os.html
本記事ではTellusのJupyter Labを使ってひまわり8号の画像を取得してアニメーションを作る方法を紹介します。
TellusでJupyter Lab(Jupyter Notebook)を使う方法は、「Tellusの開発環境でAPI引っ張ってみた」をご覧ください。
1. ひまわり8号の画像を取得するには
TellusのAPIによりひまわり8号のモノクロ画像(光学バンドと4つの赤外バンド)を取得することができます。
APIの使い方はリファレンスにまとめられています。
APIリファレンス
※画像を利用する際は、データ詳細のデータポリシーを確認して、規約を違反しないように注意してください。
https://gisapi.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)がデフォルトの状態で日本語を利用することができないため、コードを動かす前にフォントの準備を行います。
日本語フォントをダウンロードするには、Terminalから開いた黒い画面に次のコマンドを実行してください。
cd ~/work; wget https://ipafont.ipa.go.jp/old/ipafont/ipag00303.php; unzip ipag00303.php
以上で日本語フォントの準備ができたので、サンプルコードを実行しましょう。サンプルでは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’とアップデートコマンドを実行してください。
アップデート後、LabのNotebookを「Restart」し再度サンプルコードを動かしてみてください。
バージョン表記が変わっていたら成功です。
今回は、TellusのJupyter Labを使ってひまわり8号の画像を取得する方法と、画像からアニメーションを作る方法をご紹介しました。
アニメーションは他の衛星画像にも応用可能です。分析だけでなくデータビジュアライズも向上させていきましょう。