ruby-robotの夢

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

令和元年(2019) 驚異の台風19号 見える化計画(1)

はじめに

台風19号は、東日本に未曽有の被害をもたらした。

雨量・水位・流量の情報は多様であるが、この台風の驚異的な破壊力について、簡単に1枚で表現する方法を考えてみたい。

様々な指標

雨量には、平面分布と共に、時間分布がある。

今回のニュースでは、48時間雨量●●mmという表現が目立っていたが、しばしば生じる豪雨の場合には、1時間雨量●●mmという表現が多く、3時間雨量や24時間雨量を用いる場合もある。

雨の時間スケール

このように雨量は、時間スケールにより、見え方が異なる。

今回のような台風では、大雨が長時間継続し、それによって大きな被害をもたらすことから、48時間雨量として大きいことが特徴である。恐らく、1時間雨量としてみた時には、大した規模ではないだろう。

雨の地域特性

また、全国有数の多雨地帯である伊豆半島では、年間4000mmくらい降るが、年間1500mmしか降らない首都圏とでは、同じ100mmが降っても、その影響度は異なる。

このため、地点ごとに異なる雨量特性を踏まえ、今回の雨はどうかという評価が必要であり、そのための共通の指標になるのは、「●●年に一回生じる規模」と呼ばれる確率年で比較することと考えられる。

複数の対象河川と流出特性

雨は、降った後、斜面を流、川に到達し、川を流れて河口へと流れていくわけであるが、例えば、川での流速を、時速30kmと乱暴に仮定すれば、利根川の水源地である矢木沢ダム上流で降った雨は、矢木沢ダムには1時間で到達するが、下流藤原ダムに到達するまでには3時間、前橋に到達するまでには、6時間、栗橋に到達するには、9時間、銚子や江戸川河口の行徳に到達するまでには12時間くらいといった具合である。(実際は、流速も場所により異なる。)

逆にみると、銚子(河口)地点の利根川の最大流量を規定するのは、1時間雨量ではなく、より長時間の雨量と考えられる。何時間雨量かという問題に対し、流下時間の12時間の2倍という話があり、その場合24時間雨量程度をみる必要がある。

一方、河口付近の支川の流量を規定するのは、1時間雨量であったり、2時間雨量であったりする。このように、雨量の解釈というのは、何処に着目するかで異なってくるわけだ。

ある地点で降った雨が影響を与える地点を考えると、河口までの流出過程の経路全体に線的に広がり、氾濫を想定すれば、氾濫水の及ぶ氾濫原に面的に広がる。

逆に、流域のある場所の氾濫の危険を及ぼす降雨領域は、その地点に氾濫が及ぶ可能性のある全ての河川の上流域全体となる。

例えば、今回氾濫被害が生じた多摩川沿川の世田谷区玉川地点でみれば、そこに氾濫水が生じる可能性がある河川は、多摩川、野川があり、多摩川の上流域全体、野川上流域全体になり、さらに、当該地点も見る必要がある、多摩川でみれば、6時間雨量、野川でみれば、2時間雨量等、当該地点でみれば、10分~60分程度の雨量が重要な指標だろうか。

雨、流量、水位、氾濫

さらに、上に川の流量のことを書いたが、被害に直結するのは川の水位である。

これは、流量と川の形、下流の水位の影響を受ける。氾濫すると、氾濫原の地形の影響も受けるわけだ。破堤(決壊ともいう)や土砂災害では、地形すら変えてしまう。ダイナミックな現象である。

今後の課題

以上の雨から氾濫の現象は、非常に複雑であり、 驚異の台風19号の見える化は簡単にはできない。取り合えずデータの保管だけはしたが、先は長い。

①R1雨量(1,3,6,12,24,48,72h別)、水位の整理

②R1流量の整理(水文水質データベースからHQ式を逆算)

③雨量、水位、流量の確率評価 (既往年統計資料等から)

④河川単位の氾濫範囲整理(国土数値情報の浸水区域情報から)

⑤地先別の影響流域整理(国土数値情報の流域分割から)

といったプロセスになりそうだ。

 地先別の影響流域整理(国土数値情報の流域分割から)

上のうち、⑤に関する部分について、少し試みたことをまとめておこう。

水系流域構造は、国土数値情報W12により提供されている。

構造とはいっても、ポリゴンと水系コード、水系内コードのみである。

W05と合わせて、水系内の構造を、別途記述してやる必要がある。

例えば、今年8月に水害のあった九州に、次のような構造の川がある。

struct=[1, [2,[ 3,4,[ 5, 6, [7,[8,9], 10,[ 11,[12,13], 14,[15,16],
  17,[18,19, [20,[21,22,23], 24,[25,26,27,[28,29]] ]]]]]],
  30,[ 31, 32,[ 33, 34,[ 35,36,[ 37,[ 38, 39,[ 40, 41,[ 42, 43,[ 44,45]]]],
  46,[ 47,[ 48, 49], 50,[ 51,[ 52,53], 54]]]]]]]]} #Normal

この記法は実際のデータと比べないと理解しにくいが、単純なtree構造と同じであり、番号は、W12の水系内番号で、配列は、上流側の番号を意味する。

水系により記述方法のブレがあるが、これを記述するのは結構大変。

連続する番号の場合は、省略して判別することとした。

strct=[1, [0,[ 0,0,[ 0, 0, [0,[0,0], 10,[ 0,[0,0], 14,[0,0],
  17,[0,0, [0,[0,0,0], 24,[0,0,0,[0,0]] ]]]]]],
  30,[ 0, 0,[ 0, 0,[ 0,0,[ 0,[ 0, 0,[ 0, 0,[ 0, 0,[ 0,0]]]],
  46,[ 0,[ 0, 0], 50,[ 0,[ 0,0], 54]]]]]]] #Short Version

これを設定し、小流域ごとの上流集水域範囲を取得するコードを作成した。

上の例は300km程度の比較的小さい一級水系である。利根川信濃川などの大水系を記述するのは膨大な作業となる。

構造化された配列の作成

def rsys_restruct(strct)
return strct unless strct.class==Array
new=
while true
j=strct.each_cons(2).to_a.index{|a,b| a.class!=Array and b.class==Array}
unless j
new+=strct;break
end
if ( strct[j+1].reject{|e| e.class==Array}.size>0 and
 strct[j+1].select{|e| e==0}.size>0 )
n0=strct[j+1].index{|e| e!=0}
#print "n0",[n0]
n0=strct[j+1].size if n0==nil
#print strct[j+1][0,n0]
strct[j+1]=strct[j+1].map.with_index{|e,i| (i<n0)?(strct[j]+1+i):e}
#print "a",strct[j+1]
end
strct[j+1]=rsys_restruct(strct[j+1])
new+=strct[0,j].map{|s| [s]}+[[strct[j],strct[j+1]]]
strct.shift(j+2)
end
return new

end

小流域別の銃流集水域の取得

# $rsys_children
def rsys_children(strct)
return unless strct.class==Array
while true
ias=strct.map.with_index{|a,i| (a.class==Array)?i:nil}.compact
break if ias==
#print "ias",ias,strct[0]
js=ias.inject([ias[0]-1]){|ans,e| ans+=(((ans[-1]+1)==e)?[e]:[])}.drop(1)
ji=js.min-1 #not array
#print "js",js,ji
js.each{|j| $rsys_children["a#{strct[ji]}"]=strct[j].flatten} if ji>=0
js.each{|j| rsys_children(strct[j]) }
strct.shift(js.max+1)
end
end

メインコード

json=JSON.generate(strct.map{|key,strct|
print key,strct
print rstrct=rsys_restruct(strct)
$rsys_children={};rsys_children(rstrct)
print "children",$rsys_children
["r#{key}",$rsys_children]
}.to_h)
fo_json=open(nfo="river_struct.json","w")
fo_json.print json;fo_json.close;print `ls -o #{nfo}`.chomp  

結果例

{"a1"=>[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55], "a3"=>[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55],... "a48"=>[49, 50, 51, 52], "a50"=>[51, 52], "a53"=>[54, 55]}