GrADSでアニメーションを作る(応用編)

この記事は、GrADSでアニメーションを作るの続きです。

SET T が都合よくない

以前の記事では、Tステップで設定しています。これでは、何月何日から何月何日のアニメーションを描きたいとなった時、その時間のTステップを計算なりしないといけません。

そんなの面倒くさいですよね…

ですので、Tステップで時間を指定するのではなく、日にちで時間を指定し、アニメーションを描く方法を紹介します。

シェルスクリプト作成

そのためにシェルを使います。他の言語でもできるかもしれませんが、自分がやったことはないので…

シェルスクリプトは、以下のようになります。

#!/bin/bash
dateb=200010100;datae=2000030100;inc=1
src=sample.gs
datec=$dateb
while [ $datec -le $datee ];do
    yy=`echo $datec | cut -b1-4`
    mm=`echo $datec | cut -b5-6`
    dd=`echo $datec | cut -b7-8`
    hh=`echo $datec | cut -b9-10`
    cdatec="${hh}:00Z${dd}${mm}${yy}"    
    ddatec="${yy}/${mm}/${dd} ${hh}:00:00"
    cat $src | sed "s/dt/$cdatec/ > draw.gs"
    grads -lc draw.gs
    
    yy=`date -d "$ddatec $inc hour" '+%y'`
    mm=`date -d "$ddatec $inc hour" '+%m'`
    dd=`date -d "$ddatec $inc hour" '+%d'`
    hh=`date -d "$ddatec $inc hour" '+%H'`
    datec=$yy$mm$dd$hh
done

スクリプトの説明をします。

2行目のdatebは開始時刻、dateeは終了時刻、incは時間間隔(単位hour)を表しています。

何月何日から何月何日まで何時間ごとに画像を作成する場合、これらの変数をいじることになります。

例えば、2020年1月1日から2020年5月31日まで1日ごとの画像を作りたいときは

dateb=2020010100;datae=2020053100;inc=24

となります。

5行目は、繰り返し文で現在時刻が終了時刻になるまで、繰り返し処理するということになります。

6~9行目の変数yyは年、変数㎜は月、変数ddは日、変数hhは時間です。dateコマンドで出力しています。

10行目の変数cdatecは、GrADSで時間を指定する文字列です。

12行目でsedコマンドでGrADSスクリプトに変数cdatecを挿入してdraw.gsというファイル名として出力しています。

13行目でGrADSの実行です。

15~18行目で変更yy,mm,dd,hhを変数inc時間進めています。

GrADSスクリプト作成

GrADSのスクリプトは、以下のようになります。

'open sample.ctl'
t=1
while(t<100)
'set time'dt
描画処理
if(t<10)
'gxprint 0't'.png'
else
'gxprint't'.png'
endif
t=t+1
endwhile
'quit'

GrADSで日にちで時間を指定する場合、’set time’を使います。(4行目)

dtは、シェルスクリプトで作成した変数cdatecが入ります。

後は、以前の記事のGrADSでアニメーションを作ると同じです。

実行

以下のコマンドを実行しましょう。

$ bash sample.sh

そして、convertコマンドを実行しましょう。

$ convert -delay 20 *.png out.gif

まとめ

シェルスクリプトで日にちを指定し、GrADSのスクリプトを書き換えます。

そのGrADSスクリプトを実行。convertコマンドでアニメーションを作成します。