気象庁では、電子閲覧室で地上気象観測データの公開をしている。しかし、タブをクリックしてダウンロードを繰り返す作業は、必ずしも楽ではない。そこで、一気にデータをダウンロードすることを考えたくなる。
しかも、ダウンロードしたものを R で扱うとなると、多少のデータの変更が必要になる。そうした要望に応えて、第1弾の bash script を。w3m があれば、Linux など、UNIX 環境であれば大抵動くでしょう。
パラメタは for 等で回して下さい。
※ 早速変更 2005-10-07 18:50
※ 早速変更 2005-10-07 19:00 データのヘッダに座標を入れる。
※ また変更 2005-10-07 19:24 風向の数量化。 冗長だが、ダウンロードが律速なので。
※ 更に変更 2005-10-07 19:30 データの種類を # の後に入れる。scan() の時に comment.char="#" を入れれば、この行はスキップされる。
※ より変更 2005-10-31 13:02 引数チェックを正し、background 処理を止める。月も一桁で与えても良いようにする。
※ 再度変更 2005-10-31 15:16 一時ファイルを使わないように変更。wget も使わないようにした。
※ 恥ずかしい間違いを修正 ( WE-> NW)
#! /bin/bash
##############################
#
# Arguments :
# 1 2 3 4 5 6
# DownLoadAMeDAS datatype prefecture spot year month [day]
#
# # "day" and "month"should be represented by two digits
#
# Data Type :
# 1 : daily
# 2 : monthly
#
##############################
function printusage
{
echo "Description:"
echo ""
echo " Download surface data from Denshi-Etsuran-Shitu"
echo ""
echo "Usage:"
echo " DownLoadAMeDAS datatype prefecture spot year month [day]"
echo ""
echo " ** datatype"
echo " 1: hourly data for one day"
echo " 2: daily data for one month"
echo " ** prefecture"
echo " expressed by two digits (ex. 13 is for TOKYO)"
echo " prefecture might not be required"
echo " ** spot"
echo " expressed by five digits (ex. 44076 is for Nerima)"
echo " ** year"
echo " should be four digits"
echo " ** month"
echo " should be digits (ex. 8 or 08 for Aug.)"
echo " ** day"
echo " should be omitted if datatype=2 (daily data)"
echo ""
}
##############################
if [ $# -eq 6 ]; then
if [ $1 -eq 1 ]; then
day=$6
ID="時"
HD=`echo -n " $3 $4 $5 $6 "`
OUTHD="$1$3$4$5$6"
else
printusage
exit 99;
fi
elif [ $# -eq 5 ]; then
if [ $1 -eq 2 ]; then
day='00'
ID="日"
HD=`echo -n " $3 $4 $5 "`
OUTHD="$1$3$4$5"
else
printusage
exit 99
fi
else
printusage
exit 99
fi
##############################
lenmonth=`echo $5 | wc -c`
if [ $lenmonth -eq 2 ]; then
monthnum="0"$5
else
monthnum=$5
fi
##############################
URLHEAD="http://www.data.kishou.go.jp/meteo/cgi-bin/search.cgi"
#
# Header
#
PHD=`w3m "${URLHEAD}?frame=1&graph=0&prefecture=$2&observation=0&spot=$3&data=$1&year=$4&month=${monthnum}&day=$6&mode=0" | \
nkf -e | \
grep 北緯 | \
sed 's/.*北緯\([0-9]*\)度\([0-9\.]*\)分/経度:東経\([0-9]*\)度\([0-9\.]*\)分.*/\1 \2 \3 \4/' | \
awk '{print $1+$2/60, $3+$4/60, ENVIRON[HD];}' `
#
# Body
#
w3m "${URLHEAD}?frame=2&graph=0&prefecture=$2&observation=0&spot=$3&data=$1&year=$4&month=${monthnum}&day=$6&mode=0" | \
# 空行削除
sed '/^│[ ]*│/D' | \
sed 's/[└┘─│┌┐]//g' | \
# データのある行を抽出
grep "\(^[ 0-9]*[0-9]${ID}\)\|\(気温\)" | \
grep -v "平均気温" | \
# 書式の変更
sed "s/\(^.*気温.*\)/# x y spot year month day (hour)\1/" | \
sed "s/\([0-9][0-9]*\)${ID}/${HD}\1/" | \
# 風向の変換
sed 's/静穏/C /' | \
sed 's/東/E/g' | \
sed 's/西/W/g' | \
sed 's/南/S/g' | \
sed 's/北/N/g' | \
sed 's/ C / C -1 /g' | \
sed 's/ N / N 0 /g' | \
sed 's/ NNE / NNE 1 /g' | \
sed 's/ NE / NE 2 /g' | \
sed 's/ ENE / ENE 3 /g' | \
sed 's/ E / E 4 /g' | \
sed 's/ ESE / ESE 5 /g' | \
sed 's/ SE / SE 6 /g' | \
sed 's/ SSE / SSE 7 /g' | \
sed 's/ S / S 8 /g' | \
sed 's/ SSW / SSW 9 /g' | \
sed 's/ SW / SW 10 /g' | \
sed 's/ WSW / WSW 11 /g' | \
sed 's/ W / W 12 /g' | \
sed 's/ WNW / WNW 13 /g' | \
sed 's/ NW / NW 14 /g' | \
sed 's/ NNW / NNW 15 /g' | \
# NA の変換
sed 's/\/\/\//NA/g' | \
# 先頭に座標を
sed "s/^\([^#]*\)\$/${PHD} \1/" | \
cat > ${OUTHD}.txt