0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

黄砂予報のgifアニメーション化

Last updated at Posted at 2023-04-11

要旨

気象庁で黄砂情報を公開しているので、gifアニメーション化してみた。

最初のコード

python
# coding: utf-8
# こんなURLで画像データが公開されているので
#  https://www.data.jma.go.jp/env/kosa/fcst/img/surf/jp/202304110000_kosafcst-s_jp_jp.png
#
# 前日から翌日まで(3時間ごと) 翌々日(6時間ごと)~
# day-1 0 3 6 9 12 15 18 21
# day+0 0 3 6 9 12 15 18 21
# day+1 0 3 6 9 12 15 18 21
# day+2    3    9     15     21
# day+3    3    9     15     21

import datetime
from PIL import Image
import requests

# 現在時刻を得て0時0分の基準を得る
DIFF_JST_FROM_UTC = 9
now = datetime.datetime.utcnow() + datetime.timedelta(hours=DIFF_JST_FROM_UTC)
today = datetime.datetime(now.year, now.month, now.day)
#気象庁で公開している時刻情報の配列
ts=[-24+0,-24+3,-24+6,-24+9,-24+12,-24+15,-24+18,-24+21,
      -00+0,-00+3,-00+6,-00+9,-00+12,-00+15,-00+18,-00+21,
      +24+0,+24+3,+24+6,+24+9,+24+12,+24+15,+24+18,+24+21,
            +48+3,      +48+9,       +48+15,       +48+21,
            +72+3,      +72+9,       +72+15,       +72+21]
#gifアニメの格納箇所
pictures=[]

for i in ts:
    pic_name=(today+datetime.timedelta(hours=i)).strftime('%Y%m%d%H%M')+"_kosafcst-s_jp_jp.png"
    # 画像データをローカルファイルに保存
    urlData = requests.get("https://www.data.jma.go.jp/env/kosa/fcst/img/surf/jp/"+pic_name).content
    with open(pic_name ,mode='wb') as f:
        f.write(urlData)
    img = Image.open(pic_name)
    pictures.append(img)
# gifアニメとして保存
pictures[0].save('anime_'+today.strftime('%Y%m%d')+'.gif',save_all=True, append_images=pictures[1:],optimize=True, duration=500, loop=0)

上記を動かすために次のライブラリーを使った

pip install --upgrade requests
pip install --upgrade Image

requests

Image

ちょっと改造

中間ファイルを作らず最終アニメだけ保存するように変更
BytesIOを使って渡してあげるように変更。BytesIOはhttps://docs.python.org/ja/3/library/io.html のドキュメントを参照すると「メモリ上のバイトバッファを利用したバイナリストリームの実装」と書いてあるので大きなデータなら問題だろうがこの程度なら高速化もできて幸せになるのかな?

python
# coding: utf-8
# こんなURLで画像データが公開されているので
#  https://www.data.jma.go.jp/env/kosa/fcst/img/surf/jp/202304110000_kosafcst-s_jp_jp.png
#
# 前日から翌日まで(3時間ごと) 翌々日(6時間ごと)~
# day-1 0 3 6 9 12 15 18 21
# day+0 0 3 6 9 12 15 18 21
# day+1 0 3 6 9 12 15 18 21
# day+2    3    9     15     21
# day+3    3    9     15     21

import datetime
from PIL import Image
import requests
from io import BytesIO

# 現在時刻を得て0時0分の基準を得る
DIFF_JST_FROM_UTC = 9
now = datetime.datetime.utcnow() + datetime.timedelta(hours=DIFF_JST_FROM_UTC)
today = datetime.datetime(now.year, now.month, now.day)
#気象庁で公開している時刻情報の配列
ts=[-24+0,-24+3,-24+6,-24+9,-24+12,-24+15,-24+18,-24+21,
      -00+0,-00+3,-00+6,-00+9,-00+12,-00+15,-00+18,-00+21,
      +24+0,+24+3,+24+6,+24+9,+24+12,+24+15,+24+18,+24+21,
            +48+3,      +48+9,       +48+15,       +48+21,
            +72+3,      +72+9,       +72+15,       +72+21]
#gifアニメの格納箇所
pictures=[]

for i in ts:
    pic_name=(today+datetime.timedelta(hours=i)).strftime('%Y%m%d%H%M')+"_kosafcst-s_jp_jp.png"
    # 画像データを取ってきて格納する
    urlData = requests.get("https://www.data.jma.go.jp/env/kosa/fcst/img/surf/jp/"+pic_name).content
    img = Image.open(BytesIO(urlData))
    pictures.append(img)
# gifアニメとして保存
pictures[0].save('anime_'+today.strftime('%Y%m%d')+'.gif',save_all=True, append_images=pictures[1:],optimize=True, duration=500, loop=0)

もう少し広域の砂漠地帯含めた黄砂のgifアニメーションについて

python
# coding: utf-8
# 日本付近はこんなURLで画像データが公開されている
# https://www.data.jma.go.jp/env/kosa/fcst/img/surf/jp/202304110000_kosafcst-s_jp_jp.png
# もう少し広域はこんなURLで画像データが公開されている
# https://www.data.jma.go.jp/gmd/env/kosa/fcst/img/surf/as/202304110000_kosafcst-s_jp_as.png
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?