ruby-robotの夢

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

水文観測所位置データ整理

河川毎の水文観測所の位置データを整理するのに、観測所の位置があらかじめわかっていれば、容易に整理できる。

このため、あらかじめ全国のデータを整理しておく。

そこから、関連する都道府県や自治体、流域等のエリア内部にあるかどうかを判定する。

水文観測データとしては、国土交通省の川の防災情報、水文水質データベース、気象庁のデータ等がある。

川の防災情報では、水位、雨量観測所の諸元が整理されるが、水位については、緯度経度がない。これについては、①県毎の位置図で表示があるのを参考にすることと、②住所から、ジオコーディングによって変換することが考えられる。

① 県毎の位置図は、図郭の座標が明記されないため、調査する必要がある。

② ジオコーディングは、精度が悪そうだ。また、googleの個数制限もある。

とりあえずは、簡単な②で試してみよう。

データの取得

#!/usr/bin/ruby -Ks

#@@@@@@@@@@@@@@@@@
# 国土交通省水文水質DB観測所諸元データ取得
$,="\t";$\="\n";$/="\n"
require 'win32ole'
require "~/Lib/Ruby/ie.rb"
#@@@@@@@@@@@@@@@@@@@
date=190930;cs=%w[R:2765 H:2115 S:2410 G:653 D:127 SE:41 SN:108] #190930
jogai=(2660..2665).map{|i| "R:"+("%04d" % i)} #廃止分

dir="ssdb_#{date}";Dir.mkdir dir unless Dir.exists?(dir)
cs=cs.map{|c| c.split(":")}.map.with_index{|(t,n),i| [("%02d" % (i+1)),t,n.to_i]}
ikoumokus=[*0..6] #ALL(0:R..6:SN)
for ikoumoku in ikoumokus
(skou,type,nst)=cs[ikoumoku]
print "ikoumoku",ikoumoku,"skou",skou,"type",type,"nst",nst
npg=nst/10
ii=0
while true
begin #begin0
ii+=1;print "ii",ii;sleep 5
(fout,done_number)=done_check("#{dir}/ssdb_#{type}_#{date}.txt",[0])
np=done_number.keys.map{|s| s.to_i}.max/10
p_done=(0..np-1).map{|ip|
(1..10).select{|i| done_number.key("%04d" % (ip*10+i) )}.size}
print type,p_done
#@@@@@@@@@@@@@@@@@@@@
ie = WIN32OLE.new("InternetExplorer.Application");ie.Visible = true
#ie.ie_lib::wait_stable
ie.Navigate "http://www1.river.go.jp/";nsleep ie,4
ie2 = WIN32OLE.new("InternetExplorer.Application");ie2.Visible=true
ie2.Navigate "http://www1.river.go.jp/";nsleep ie2,4
ip=-1
while true
ip+=1
next if p_done[ip]==10
print ip
url= "http://www1.river.go.jp/cgi-bin/SrchSite.exe?KOMOKU=#{skou}" +
"&NAME=&SUIKEI=-00001&KASEN=&KEN=-1&CITY=&PAGE=#{ip}"
ie.navigate url;nsleep ie,4
frame_c = ie
iframe=frame_c.document.frames.length;print "iframe",iframe
print "table",frame_c.document.all.tags("table").length
list=frame_c.document.all.tags("table").item(2)
nc=list.rows.length-2
print "nc",nc
0.upto(nc){|ic|
tr=list.rows(ic+1)
idx=(0..5).map{|i| tr.cells(i).innerText}
idxs=idx*" "
printf ic,idxs
id=idx[0]
(print "登録済み";next ) if done_number.key?(id)
(print "除外";fout.print *idx;next) if jogai.include?("#{type}:#{id}")
print "未登録"
link=tr.cells(4).all.tags("a").item(0)
link_url=link.href.sub(/.*\(\'/,"").sub(/\'\)/,"")

m=link.href.match(/\'([0-9]+)\'/);site=m[1]
ie2.Navigate "http://www1.river.go.jp/cgi-bin/SiteInfo.exe?ID=#{site}"
nsleep ie2,0.5
tblx=ie2.document.all.tags("table").item(0)
nr=[tblx.rows.length,8].min
td2=0.upto(nr-1).map{|ir| tr2=tblx.rows(ir)
(0..tr2.cells.length-1).map{|icolx| tr2.cells(icolx).innerText}} #諸元
fout.print *idx,*td2.flatten
}
exit if ip==npg
print "page",ip
end #while
rescue #begin0
(ie.quit;sleep 5) unless defined? ie ==nil
end #begin0
break if ip==npg
end #while
end #koumoku

ジオコーディング

googleとyahooがあるが、2018年に、それまで使えたgoogle-geocoderが私の環境では使えなくなった。その理由は不明。yahooは、2018年に使えたが、今回使おうとしたら、やはり使えない。理由はよくわからないが、virus-busterをunloadしたら、使えた。

しかし、住所も正確では無いものが多く、緯度経度換算してくれないものが多数。

ただし、6900地点のうち、3800地点程度が、20分くらいで換算できた。

 

SHP作成

f:id:george_thai:20191001205548p:plain

水位観測所位置図(関東地方の例)


geocodeで失敗箇所の追加整理

geocodeで失敗した地点では、検索位置図における配置情報から追加することとした。

検索位置図のデータは、imageOut/13/#{ken}/current_07.html 等に記載されている。

これを取り出して、geocodeで成功箇所の緯度経度から、換算式を割り出し、整理した。これにより、全箇所のデータを整理することができた。上と表示範囲異なるが、房総半島などでかなり追加されていることが確認できる。

 

f:id:george_thai:20191003184341p:plain

水位観測所位置図(全箇所、関東地方の例)