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

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

https://www.data.jma.go.jp/env/kosa/fcst/

# 最初のコード
```: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
https://pypi.org/project/requests/

https://requests.readthedocs.io/en/latest/

# Image
https://pypi.org/project/image/

https://github.com/francescortiz/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
```