2018/10/08
前回で話は完結しているのですが、今回は、
前々回にお話した
1. GIFファイルの作成手順
2.
Rを使った日本地図へのプロット
についての備忘録です。
1. GIFファイルの作成手順① 画像の抽出、サイズ変更 まず、iPadのハードコピー画像には余分な情報も含まれているので、必要な部分を抽出し、適正サイズに縮小しました。

画像処理はOpenCVを使うことが多いのですが、簡単な画像操作は
PythonのPIL(
Python Image Library)でも十分でした。
from PIL import Image
for i in range(14):
input_filename = '/home/drbobt/ドキュメント/pic/' + '{0:02d}'.format(i+1) + '.PNG'
im_temp = Image.open(input_filename)
cropped_im_temp = im_temp.crop((50, 250, 1500, 1800))
width, height = cropped_im_temp.size
resized_im = cropped_im_temp.resize((int(width / 2.5), int(height / 2.5)))
output_filename = '/home/drbobt/ドキュメント/pic/' + '{0:02d}'.format(i+1) + '_res.PNG'
resized_im.save(output_filename)
4、5行目で目的の画像を読み込み、7行目で画像を抽出、9、10行目で画像をリサイズし、12、13行目で処理画像を保存しました。
② 画像上への文字入力 次に、①で抽出、適正サイズにした個々の画像に文字を追加しました。
from PIL import Image, ImageDraw, ImageFont
i = 14
input_filename = '/home/drbobt/ドキュメント/pic/' + '{0:02d}'.format(i) + '_res.PNG'
im_temp = Image.open(input_filename)
draw = ImageDraw.Draw(im_temp)
font = ImageFont.truetype('/usr/share/fonts/truetype/ubuntu/Ubuntu-R.ttf', 27)
draw.text((10,10), '2018/10/01', fill ='red', font=font)
draw.text((10,50), '05:15', fill ='red', font=font)
draw.text((400,565), '989.71 [hPa]', fill ='red', font=font)
output_filename = '/home/drbobt/ドキュメント/pic/' + '{0:02d}'.format(i) + '.PNG'
im_temp.save(output_filename)
全くスマートではありませんが、14枚の画像について、手動バッチ式で処理しました。3〜5行目で①の画像を読み込み、7〜11行目で必要な情報を画像に書き込みました。13、14行目で処理画像を保存しました。
③ GIFファイル作成 GIFファイルにする個々の画像を準備し、連番を付けておきます。その上で、ターミナルからconvertコマンドを実行するとGIFファイルが作成されます。

convert -delay 100 -dispose background *.PNG -loop 0 Atmospheric_pressure.gif
各引数の説明は以下の通りです。
-delay : 画像の切り替わる時間(単位は1/100秒) ⇒ 1sec
-dispose background : 現在のフレーム表示が終了したら、表示されていたエリアがクリアされる。
*.PNG : 入力ファイル指定で、共通部分のみを入力して、変化する部分に * を入力
-loop : ループする回数(0なら無限) ⇒ 無限繰り返し
Atmospheric_pressure.gif : 出力ファイル名
コマンド実行で簡単にGIFファイルを作成できることがよく分かりました。
2. Rを使った日本地図へのプロット Rを使った日本地図へのプロットは、
このサイト(
Rで地図作成)を参考にさせていただきました。作成したRのコードは以下の通りです。
setwd('/home/drbobt/ドキュメント/R_code/ne_10m_land')
library(maptools) # maptools
world <- readShapePoly("ne_10m_land.shp") # shape File read
lonlim = c(125,145) # Longitude setting(E120〜150 degrees)
latlim = c(30,40) # Latitude setting(N30〜40 degrees)
plot(world, xlim=lonlim, ylim=latlim, axes=TRUE, xlab="Longitude", ylab="Latitude")
t_data <- read.csv('typhoon24.csv',header = TRUE) # Data read
for(i in 1:17){
points(as.numeric(t_data[i,5]), as.numeric(t_data[i,4]), pch=1) # Plot
text(as.numeric(t_data[i,5])+0.25, as.numeric(t_data[i,4])-0.25, labels=substr(t_data[i,2], 1, 2), cex=1.0) # Hour add
if(i<17){ # Line
segments(as.numeric(t_data[i,5]), as.numeric(t_data[i,4]),as.numeric(t_data[i+1,5]), as.numeric(t_data[i+1,4]),col = 'red', lwd = 3)
}
}
データファイルは以下の通りです。3列目は気象台の気圧、4列目は緯度、5列目は経度、最終列(6列目)は台風の中心気圧です。台風の位置情報はネット上の
サイトから取得しました。
Date,Time,Pressure,latitude(N),longitude(E),Center
2018/09/30,13:00,1000.6,32.00,132.30,950
2018/09/30,14:00,998.2,32.10,133.05,950
2018/09/30,15:00,995.6,32.35,133.20,950
2018/09/30,16:00,993.5,33.00,133.55,950
2018/09/30,17:00,990.3,33.05,134.30,950
2018/09/30,18:00,986.8,33.40,134.55,950
2018/09/30,19:00,982.1,33.40,135.10,950
2018/09/30,20:00,978.7,34.10,135.55,950
2018/09/30,21:00,974.9,34.40,136.30,960
2018/09/30,22:00,972.6,35.10,136.55,965
2018/09/30,23:00,975.3,35.35,137.20,965
2018/10/01,00:00,980.9,36.05,138.00,970
2018/10/01,01:00,989.1,36.30,139.00,970
2018/10/01,02:00,993.8,37.35,139.35,970
2018/10/01,03:00,997.5,37.50,140.05,970
2018/10/01,04:00,999.3,38.30,140.50,970
2018/10/01,05:00,1000.1,39.25,141.55,970
地図を利用した「データの見える化」もRを利用すると簡単にできることが分かりました。何か使えそうな案件があれば、使っていきたいと思います。