ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

川の防災情報の一括ダウンロード

台風19号により、東日本各地で大災害が生じた。

この状況を把握するため、川の防災情報のデータを一括ダウンロードしてみた。

この作業は、それなりに、サーバー側の付加にもなる。洪水中の対応中に使用は避けるべきである。前日以前の1週間分のデータを取得できるため、現在情報は、取得できない。このため、洪水翌日以降に実施することが望まれる。

川の防災情報ダウンロードスクリプト

#!/usr/bin/ruby -Ks
# 川の防災情報から、雨量、水位、ダムの過去データ(hourly )をダウンロードする。
# last 1 week data downloadable
# 2018.07.10
$,="\t";$\="\n"
require 'win32ole' #
require 'fileutils' #

def nsleep(ie,itimes)
# データ更新の確認
jnotbusy=0;jroop=-1;interval=0.1 #ネット接続状況による
now=Time.now if now.hour==12 or ( now.hour==13 and now.min<10) #昼休みで混雑するため
interval=0.03;itimes=itimes*2 #jwf
else
interval=0.03 #jwf
end
sleep interval
while true do
jroop+=1;sleep interval
if ie == nil
return jnotbusy=-1
end
begin
while ( ie.busy or ie.document.readystate!="complete" ) do
jroop+=1;sleep interval*2**([jroop,9].min)
printf (jroop==10)?"x":"."
jroop=0 if jroop==10
end
rescue
print "ie.rb nsleep:busy_check.Error!"
break
end

begin
if ( ie.busy or ie.document.readystate!="complete" ) then; #jnotbusy=0
sleep interval*10
else;jnotbusy+=1
end
rescue
print "ie.rb nsleep:busy_check.Error!"
end
break if (jnotbusy>=itimes)
end
jnotbusy
end
#@@@@@@@@@@@@@@@@@@
j_dbg=false
j_head=false #true #make headder file
i_busy=1 # 1~4 rank of internet traffic
url="http://www.river.go.jp/kawabou"
irs=[1,2,3,4,5,6,7,8,9,10] #All Japan
#@@@@@@@@@@@@@@@@@@@
# Setting dates:前日までの7日間
#@@@@@@@@@@@@@@@@@@@
sets={ttl:"H30西日本豪雨",odir:"1807/180703-09",dates:%w[7/3 7/4 7/5 7/6 7/7 7/8 7/9],irs:[*1..10]}
sets={ttl:"R01.6下豪雨",odir:"1907/190701-03",dates:%w[7/1 7/2 7/3 ],irs:[*1..10]}
sets={ttl:"R01.6下豪雨",odir:"1907/190701-07",dates:%w[7/1 7/2 7/3 7/4 7/5 7/6 7/7],irs:[*1..10]}
sets={ttl:"R01佐賀豪雨",odir:"1908/190826-28",dates:%w[8/26 8/27 8/28 ],irs:[9]}
sets={ttl:"R01台風19号",odir:"1910/191008-14",dates:%w[10/8 10/9 10/10 10/11 10/12 10/13 10/14 ],irs:[*1..10]} # 14は失敗
sets={ttl:"R01台風19号",odir:"1910/191009-15",dates:%w[10/9 10/10 10/11 10/12 10/13 10/14 10/15 ],irs:[*1..10]}
kinds=["Rain"]
kinds=["Suii"]
kinds=["Dam"]
kinds=["Rain","Suii","Dam"]
#@@@@@@@@@@@@@@@@@@@
regions={
1 =>%w[北海道 0102北海道道北 0103北海道道東 0104北海道道央 0105北海道道南],
2 =>%w[東北 02青森 03岩手 04宮城 05秋田 06山形 07福島],
3 =>%w[関東 08茨城 09栃木 10群馬 11埼玉 12千葉 13東京 14神奈川 19山梨],
4 =>%w[北陸 15新潟 16富山 17石川 20長野],
5 =>%w[中部 21岐阜 22静岡 23愛知 24三重],
6 =>%w[近畿 18福井 25滋賀 26京都 27大阪 28兵庫 29奈良 30和歌山],
7 =>%w[中国 31鳥取 32島根 33岡山 34広島 35山口],
8 =>%w[四国 36徳島 37香川 38愛媛 39高知],
9 =>%w[九州 40福岡 41佐賀 42長崎 43熊本 44大分 45宮崎 46鹿児島],
10=>%w[沖縄 47沖縄], } #地方別の県番号
[*2..10].each{|i| regions[i]=[regions[i][0],*regions[i][1,10]
.map{|a| a[0,2]+"01"+a[2,5]} ] } # except 1 各県の番号に、01を追加
regions=sets[:irs].map{|i| [i,regions[i]]}.to_h
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
FileUtils.makedirs(sets[:odir])
print regions if j_dbg
ie = WIN32OLE.new("InternetExplorer.Application")
ie.Visible = true
kinds.each{|kind|
print "kind",kind
(ids,ncs,nh,ntbl,heads,init)={
"Rain"=>[["0901","1001","1101"],[6,0],1,1,["r","rs"],""],
"Suii"=>[["0902","1003","1102"],[7,4],2,2,["h"],""],
"Dam" =>[["0903","1004","1103"],[5,0],1,1,["h","qi","qo"],"?init=init"],
}[kind] #[gaikyo #kobetsu #week]
station_ps={
"Rain"=>[%w[水系名 河川名 管理者 所在地 標高 緯度経度(世界)],],
"Suii"=>[%w[水系名 河川名 管理者 洪水/周知/水防 位置 所在地 水位標のゼロ点高],
%w[水防団待機水位 はん濫注意水位 避難判断水位 はん濫危険水位]],
"Dam" =>[%w[水系名 河川名 管理者 流域面積(km2) 所在地],
],
}[kind]
regions.each{|key,vals|
key00="%02d" % key
region=vals[0]
nfo="#{sets[:odir]}/#{key00}_#{kind}.txt" #期間は付けない(任意にアペンドするため)
nfo="#{sets[:odir]}/#{key00}_#{kind}_h.txt" if j_head
print "nfo",nfo
if File.exists?(nfo)
lines=IO.readlines(nfo,rs=$/ ).drop(1)
print "size",lines.size
done_chiten=lines.map{|line| line.split(/\t/)[0]}
fo=File.open(nfo,"a") #append
else
done_chiten=
fo=File.open(nfo,"w")
fo.print "code","name",*station_ps[0],*station_ps[1],"typ",*(sets[:dates].map{|date| [date+" 1",*(2..24)]}.flatten) #Head
end
next if j_head
print "done_chiten",*done_chiten

vals[1,10].each{|pref|
area=(80+key).to_s
pcode=pref[0,4]
url_list="#{url}/ip#{kind}Gaikyo.do?init=init&areaCd=#{area}&prefCd=#{pcode}&townCd=&gamenId=01-#{ids[0]}&fldCtlParty=no"
# url_list="#{url}/ipDamGaikyo.do?init=init&areaCd=81&prefCd=0102&townCd=&gamenId=01-0903&fldCtlParty=no"
# java_dam="javascript:goIpObsrvKobetuNoTime('/kawabou/ipDamKobetu.do','2255200700005','01-1004','no','true')"
ie.Navigate(url_list);nsleep ie,2*i_busy
label=ie.Document.all.tags("label").item(0).innerText
npage=label.sub(/ページ/,"").to_i
print pref,"npage",npage
[*1..npage].each{|ipage|
print pref,"ipage",ipage
(ie.Navigate(url_list);nsleep ie,2*i_busy) if ipage>1
[*1..ipage-1].each{|ip|
nextbtm=ie.Document.getElementsByClassName("comHeaderLbl").item(2)
nextbtm.all.tags("A").item(0).click nil;nsleep ie,4*i_busy
}
# exit
tbl=ie.Document.getElementsByClassName("gaikyoCntt").item(0).all.tags("TABLE").item(0)
nr=tbl.rows.length
#"javascript:goIpObsrvKobetuNoTime('/kawabou/ipDamKobetu.do','0025700700441','01-1004','no','true')"
paras=[*nh..nr-1].map{|ic|
para=tbl.rows.item(ic).all.tags("td").item(0).all.tags("a").item(0)
href=para.href.sub(/^.*\(/,"").sub(/\)/,"").gsub(/\'/,"").split(/,/)
[para.innerText,href]
}
print "paras",paras if j_dbg
# url_kobt="#{url}/ipDamKobetu.do?init=init&obsrvId=2255200700005&gamenId=01-1004&timeType=60&requestType=1&fldCtlParty=no"
# url_kobt="#{url}/ipSuiiKobetu.do?obsrvId=2079700400001&gamenId=01-1003&stgGrpKind=survForeKjExpl&fldCtlParty=no&fvrt=yes"
# url_past="#{url}/ipDamPast.do?init=init&obsrvId=2255200700005&gamenId=01-1103&fldCtlParty=no"
# url_past="#{url}/ipSuiiPast.do?init=init&obsrvId=2079700400001&gamenId=01-1102&fldCtlParty=no"
paras.each{|name,href|
(dum0,obsid,gamenid,dum1,dum2)=href
next if done_chiten.include?(obsid)
print [pref,name,href*" "]*" "
# url_kobt="#{url}/ip#{kind}Kobetu.do#{init}&obsrvId=#{obsid}&gamenId=#{ids[1]}&timeType=60&requestType=1&fldCtlParty=no"
url_past="#{url}/ip#{kind}Past.do?init=init&obsrvId=#{obsid}&gamenId=01-#{ids[2]}&fldCtlParty=no"
# print url_past
ie.Navigate(url_past);nsleep ie,2*i_busy
dsts=[*1..ntbl].map{|itbl|
tbl=ie.Document.getElementsByClassName("tb1").item(itbl-1)
[*0..ncs[itbl-1]-1].map{|ic|
tbl.rows.item(1).all.tags("td").item(ic).innerText.gsub(/\r\n/,"")
}
}.push(
) #station infomation
print "dsts",dsts if j_dbg

tbl_dat=ie.Document.getElementsByClassName("tb1").item(ntbl)
datas=[*2..tbl_dat.rows.length-1].map{|id|
cols=tbl_dat.rows.item(id).all.tags("td")
[*1..cols.length-1].map{|ic| cols.item(ic).innerText }
}
print datas if j_dbg
nhead=heads.size
datao=[*0..nhead-1].map{|it|
[*0..6].map{|id| [*0..23].map{|ih| datas[ih][id*nhead+it]}}.flatten}
heads.each.with_index{|head,ityp|
fo.print obsid,name,*dsts[0],*dsts[1],head,*datao[ityp]
}
print datao if j_dbg
};#"para chiten"
};#"page"
};#"pref"
};#"region"
};#"kinds"
ie.quit
__END__

台風19号 関東地方ダム調節状況

f:id:george_thai:20191017114910j:plain

R01台風19号 ダム洪水調節状況図(1)

f:id:george_thai:20191017115018j:plain

R01台風19号 ダム洪水調節状況図(2)

f:id:george_thai:20191017115036j:plain

R01台風19号 ダム洪水調節状況図(3)

f:id:george_thai:20191017115052j:plain

R01台風19号 ダム洪水調節状況図(4)

f:id:george_thai:20191017115119j:plain

R01台風19号 ダム洪水調節状況図(5)