流域推定プログラム
【課題】流域に関する知識のないユーザによる正確な流域推定を可能にする。
【解決手段】地図上の地点を指示する入力を受け付ける手順と、前記指示された地点を含む前記地図上の格子を、処理対象である第1格子として選択する手順と、前記第1格子を含む領域内の格子の標高値をメモリに格納する手順と、前記領域内の窪地を検出する手順と、前記標高値を変更する手順と、前記領域内の格子の標高値に基づいて、前記領域内の格子のうち、前記第1格子に隣接する第2格子から流出する水の流向を判定する手順と、前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子と前記第1格子とが一つの流域に含まれると判定する手順と、前記第2格子を、処理対象である第1格子として新たに選択する手順と、前記第1格子として新たに選択された格子が前記一つの流域に含まれることを示す情報を出力する手順と、を実行するプログラム。
【解決手段】地図上の地点を指示する入力を受け付ける手順と、前記指示された地点を含む前記地図上の格子を、処理対象である第1格子として選択する手順と、前記第1格子を含む領域内の格子の標高値をメモリに格納する手順と、前記領域内の窪地を検出する手順と、前記標高値を変更する手順と、前記領域内の格子の標高値に基づいて、前記領域内の格子のうち、前記第1格子に隣接する第2格子から流出する水の流向を判定する手順と、前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子と前記第1格子とが一つの流域に含まれると判定する手順と、前記第2格子を、処理対象である第1格子として新たに選択する手順と、前記第1格子として新たに選択された格子が前記一つの流域に含まれることを示す情報を出力する手順と、を実行するプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本願明細書で開示される技術は、コンピュータを使って流域を推定する方法に関する。本願明細書で開示される技術は特に、1以上の地点の位置を入力データとし、それぞれの地点の流域を数値地形モデル(digital elevation mode,DEM)に基づいて推定するコンピュータプログラムに関する。
【背景技術】
【0002】
流域は、河川、ダム、下水などの水を管理する土木構造物にとって非常に重要な情報である。多くの場合、土木構造物に入ってくる水の起源は降雨である。つまり、降雨が地表面に落ち、地表面を流れ下って構造物に入る。したがって、構造物に至る全ての流れをさかのぼれば、降雨が落ちた地表面に達する。この地表面を構造物の流域という。
【0003】
近年では、地表面の標高は電子データとして得られる。このような標高の電子データは、一般的にDigital Elevation Model (DEM)と呼ばれる。DEMでは、ある領域の地表面が格子(grid又はcell)と呼ばれる小領域に分割され、それぞれの格子に標高値が与えられる。多くの場合、DEMの格子は正方形である。
【0004】
このDEMを使い、土木構造物の流域を推定するコンピュータプログラムが作られている。通常、地表面に落ちた降雨は最も急な下り勾配(gradient)の方向に流れ下る。したがって、DEMの格子ごとの勾配を求めれば、流域を推定できる。勾配から流域を推定する方法は、非特許文献1に詳しい。
【0005】
このような流域を推定するコンピュータプログラムに共通の課題は、DEMの誤差である。勾配はベクトル解析における勾配演算によって算出される。勾配演算は元データの誤差に敏感である。したがって、DEMデータから流域を推定する方法は誤差に敏感である。
【0006】
図18は、DEMの誤差の影響を説明するための図である。
【0007】
グラフ1800は、ある断面に沿った標高である。格子1801から格子1809までの格子に標高が与えられ、勾配が算出されている。勾配を矢印(たとえば1811)で示す。グラフ1800では、格子1806の標高が、隣接する格子1805及び1807の標高よりも低い。下り勾配の方向(すなわち図の矢印の方向)と水が流れる方向とが一致すると仮定すると、格子1801から格子1807までに降った雨は格子1806に流れ出て、格子1806からは水が流れ出ないことになる。また、格子1809の流域は格子1807及び1808となる。この結果と、地表面を流れる水は最終的に標高の低い場所に至るという私たちの常識とは矛盾する。この矛盾の原因は、格子1806近傍の標高データの誤差にあると推測される。
【0008】
誤差の修正方法として、いくつかの方法が提案されている。最も一般的な修正方法は、窪地埋め(sink filling)である。窪地とは1以上の格子からなる、周囲に比べ相対的に標高が低い領域である。窪地埋めの方法は非特許文献1に詳しく説明されている。この方法では、ある領域内の全ての格子のうち、ある格子の標高が、隣接するすべての格子の標高と同じ又は低い場合、ごく小さな値をその格子の標高に加える。この処理を繰り返すことによって修正が完了する。このように誤差が修正されたDEMを元に推定した流域と、私たちの常識とは一致する。
【0009】
図18のグラフ1820は、グラフ1800に示したDEMデータをこの方法によって修正した結果である。格子1821から格子1829は、それぞれ、修正前のグラフ1800の格子1801から格子1809に対応する。窪地(すなわち格子1825及び1826)が埋められた結果、格子1829の流域が格子1821から格子1829までとなった。
【0010】
さらに別の誤差修正方法として、特許文献1に開示された「Method for flow analysis utilizing cell elevation topography」が挙げられる。この方法では、あらかじめ領域の内部が複数のmajor cellに分割される。さらに、major cellの内部が、少なくとも横方向に3分割、縦方向に3分割することによって、少なくとも9個のminor cellに分割される。あるminor cellにおける勾配を算出するときは、そのminor cellを含むmajor cellと、さらにそのmajor cellに隣接するmajor cellについてDEMデータのエラーが修正される。その後、これらのmajor cellに含まれるminor cellについて勾配が再度算出される。
【0011】
非特許文献1では処理の対象とする領域全体に誤差修正処理をする必要があったが、特許文献1に開示された方法では処理の対象とする領域を複数に分割し、分割された領域ごとに勾配を求めることが可能になる。
【0012】
いずれの誤差修正方法であっても、DEMデータの誤差を修正した後に流域を推定する。つまり、まずDEMデータを修正する。次にDEMデータから勾配データを算出する。この勾配データを使って上流方向にたどると、流域が求まる。
【特許文献1】米国特許出願公開第2005/0049802号明細書
【非特許文献1】Costa−Cabral,M.C.,and S.J.Burges(1994),Digital elevation model networks(DEMON): A model of flow over hillslopes for computation of contributing and dispersal areas,Water Resour.Res.,30(6),1681−1692.
【発明の開示】
【発明が解決しようとする課題】
【0013】
従来の流域推定プログラムは、DEMデータの誤差を修正した後に、流域を推定する。したがって、流域を推定する前に、修正すべきDEMデータの範囲を知っておく必要がある。ところが流域を推定したい場合、修正すべきDEMデータの範囲は流域である。つまり従来の流域推定プログラムのユーザは、そのプログラムの実行結果である流域を、プログラムを実行する前に知っておく必要がある。したがって、従来の流域推定プログラムを使えるユーザは、流域をあらかじめ知っているユーザに限られていた。流域を知らないユーザが従来の流域推定プログラムを使用すると、DEMデータを適切に修正できないために、流域を正確に推定することが困難であった。
【0014】
本発明はこの問題に鑑みてなされたものである。本発明の目的は、流域に関する事前知識のないユーザが使用しても、流域を正確に推定することができる流域推定コンピュータプログラムを提供することである。
【課題を解決するための手段】
【0015】
本願で開示する代表的な発明は、計算機を制御するプログラムであって、前記計算機は、前記プログラムが格納されるメモリと、前記メモリに格納された前記プログラムを実行するプロセッサと、を備え、前記プログラムは、地図上の地点を指示する入力を受け付ける第1手順と、前記地図を互いに直交して設定された第1軸及び第2軸に沿ってそれぞれ等間隔に区切る線によって囲まれた格子のうち、前記入力によって指定された地点を含む格子を、処理対象である第1格子として選択する第2手順と、前記第1格子を含む第1領域内の格子に対して定められた標高値を前記メモリに格納する第3手順と、前記第1領域内の窪地を検出する第4手順と、前記検出された窪地に含まれる格子の標高値を、前記窪地に含まれる格子に隣接する一つの格子の標高値に変更する第5手順と、前記第1領域内の格子の標高値に基づいて、前記第1領域内の格子のうち、前記第1格子に隣接する第2格子から流出する水の流向を判定する第6手順と、前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子と前記第1格子とが一つの流域に含まれると判定する第7手順と、前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子を、処理対象である第1格子として新たに選択する第8手順と、前記第1格子として新たに選択された格子が前記一つの流域に含まれることを示す情報を出力する第9手順と、を前記プロセッサに実行させることを特徴とする。
【発明の効果】
【0016】
本発明の一実施形態によれば、流域に関する事前知識を要求しない、流域推定コンピュータプログラムが提供される。コンピュータが使えるユーザであれば、このプログラムを使用することによって、専門家と同等の品質の流域推定をすることができる。
【発明を実施するための最良の形態】
【0017】
最初に、本発明の実施形態の概要を説明する。本実施形態では、DEMデータの誤差を修正しながら流域を推定する。また、この処理をコンピュータで効率的に行うために、部分領域(subdomain)を使用する。部分領域とは、複数の格子からなる領域である。本発明の処理の概要は以下の通りである。まず、現在流域とわかっている領域を含む部分領域との距離が所定の値より近い部分領域のDEMデータを読み込む。次に、読み込んだDEMデータを修正する。DEMデータの修正とは窪地を埋める処理である。この窪地を埋める処理を、窪地がなくなるまで繰り返す。ただし、窪地が所定の体積又は面積よりも大きい場合、その窪地は埋めない。また、すでにDEMデータを読み込んである部分領域よりも外側に窪地が拡がる可能性がある場合、その窪地が拡がる可能性がある部分領域のDEMデータが読み込まれるまでその窪地を埋める処理を保留する。続いて、現在流域とわかっている領域の1格子外側の格子が、流域か否かを判定する。その格子が流域であると判定された場合、その格子を流域に含める。この一連の処理を繰り返し行う。
【0018】
以下、本発明の実施形態を添付図面に基づいて説明する。
【0019】
図1は、本発明の実施形態におけるコンピュータシステムの構成を示す概略ブロック図である。
【0020】
本実施の形態のコンピュータシステムは、PC(Personal Computer)100によって構成される。PC100は、入出力部110及びHDD(Hard Disk Drive)190を備える。入出力部110は、キーボード111及びびマウス112などからなる入力部と、ディスプレイ113などからなる出力部とによって構成される。ユーザは、入力部から命令を入力し、出力部から結果を確認することができる。
【0021】
さらにPC100は、メモリ120及びCPU(Central Processing Unit)130を備える。メモリ120には流域推定プログラム141が展開される。この流域推定プログラム141はCPUへの命令によって構成される。CPU130は、流域推定プログラム141の命令に従って、計算、HDD190へのアクセス、及び入出力部110との情報の交換などを行う。以下の説明において流域推定プログラム141が実行する処理は、実際には、流域推定プログラム141の命令に従うCPU130によって実行される。
【0022】
HDD190には地図データ191及び標高データ192が格納される。流域推定プログラム141はこれらのデータを読み込むことができる。さらにHDD190には流向データ193を格納することができる。流域推定プログラム141はこのデータを書き込むことができる。なお、HDD190は、PC100に内蔵されてもよいし、PC100の外部に接続されてもよいし、PC100からネットワーク(図示省略)経由でアクセスできる別の装置に接続されてもよい。
【0023】
地図データ191は、ユーザに場所を理解させるために必要な情報を含んでいれば、どのような種類のものであってもよい。地図データ191に適している情報として、道路、川、山頂などの位置、等高線、地名、衛星から撮影した地表面の画像、及び緯度経度を示す線などが挙げられる。本実施形態では、川の位置、山頂の位置、及び等高線を含む地図データ191が使用される。
【0024】
標高データ192は、一般的にDigital elevation model(DEM)と呼ばれるデータである。すなわち、標高データ192は、地表面に区画された格子とその格子における地表面の標高とを記載した情報である。例えば、標高データ192は、地表面に等間隔で並べた正方形の格子(square grid)、あるいは不規則三角形ネットワーク(triangular irregular network)で表現されている格子における標高の値を含む。
【0025】
流向データ193は、流域推定プログラム141によって得られた結果に関する情報である。この流向データ193については、後述する図6で詳細に説明する。
【0026】
図2は、本発明の実施形態のPC100によって実行される処理を示すシーケンス図である。
【0027】
以下、図2にしたがってシステムの処理シーケンスを説明する。
【0028】
PC100で流域推定プログラム141が起動すると、CPU130は、流域推定プログラム141の命令に基づいて、HDD190から地図データ191を読み出す(ステップ201)。以下、図2においてCPU130が実行する処理は、流域推定プログラム141の命令に基づいて実行される。
【0029】
データを読み出したCPU130は、ウィンドウ300からなるGUI(Graphical User Interface)をディスプレイ113に出力する(ステップ202)。
【0030】
図3は、本発明の実施形態の流域推定プログラム141が提供するGUIの入力待ちの状態を示す説明図である。
【0031】
図3のGUIは、ディスプレイ113の所定の領域に表示されるウィンドウ300からなり、キーボード111及びマウス112による入力を受け付ける。
【0032】
ウィンドウ300は、少なくとも地図310を表示する。ユーザは、所定の操作をすることによって、地図310として表示される地域を所望の地域に変更することができる。
【0033】
地図310の縮尺は、流出現象の空間スケールと同程度であることが望ましい。したがって典型的な流出現象であれば、1/25,000かそれより粗い縮尺が適当である。
【0034】
本実施形態の地図310は、等高線311、川312及び山頂313の位置を示す情報を含む。
【0035】
さらにウィンドウ300は少なくとも、ユーザに1以上の地点を指定させる機能、及び、ユーザにその指定を確定させる機能を有する。後述するように、1以上の地点を指定するためにマウスポインタ301が、およびその指定を確定するためにOKボタン302が使用される。
【0036】
このGUIを用いてユーザは、興味がある地点を1点以上指定する(ステップ203)。興味がある地点を以後、下流端(terminal)と呼ぶ。例えば、ユーザは、ある地点に流入する水の流域を知りたい場合、その地点を下流端として指定する。本実施形態では、ユーザがマウス112を動かすことによってマウスポインタ301を地図310上で動かし、マウス112をクリックすることによって1地点を指定する。なお、指定した地点にアイコン321を表示することが望ましい。これによって、ユーザの操作結果をユーザにわかりやすく伝えることができる。
【0037】
ユーザは、興味ある全ての地点を入力した後、OKボタン302をクリックする。OKボタン302がクリックされると、CPU130はステップ203を終了する。図3は、ユーザが川付近の1地点をアイコン321によって下流端として指定した状態を示している。したがって、CPU130はこれからこの1地点の上流域を解析する。
【0038】
次に流域推定プログラム141は、流向算出処理(ステップ204)を繰り返し実行する。ステップ204の詳細は後述する図11で説明する。
【0039】
ステップ204は、標高データ192読み出し処理(ステップ205)及び処理済み領域表示処理(206)を含む。ステップ205では、CPU130がHDD190から標高データ192を読み込む。ステップ206では、CPU130がウィンドウ300に処理済み領域を表示する。処理済み領域とは、流向算出処理が終了した領域である。
【0040】
図4は、本発明の実施形態の流域推定プログラム141が提供するGUIの解析中の状態を示す第1の説明図である。
【0041】
図4の例では、処理済み領域を示す矩形413が地図310上に表示される。なお、CPU130が流域推定プログラム141を処理中であることをマウスポインタのアイコン401によって表すことが望ましい。
【0042】
図5は、本発明の実施形態の流域推定プログラム141が提供するGUIの解析中の状態を示す第2の説明図である。
【0043】
図5は、図4の状態のGUIが表示された時点からしばらく時間が経った時点で表示される。つまり、図4の処理済み領域(矩形413で囲まれた領域)よりも図5の処理済み領域(矩形513で囲まれた領域)の方が広い。このように、ステップ204が繰り返し実行されている間に処理済み領域が拡大し、そのことがユーザに提示される。
【0044】
ステップ204が終了した時点で、処理済み領域に含まれる各格子の流向が確定する。
【0045】
次に、CPU130は、確定した流向を示す情報をHDD190に流向データ193として書き込む(ステップ208)。
【0046】
さらに、CPU130は、図6に示すように、確定した流向をウィンドウ300に表示する(ステップ209)。
【0047】
図6は、本発明の実施形態の流域推定プログラム141が提供するGUIの流域推定済みの状態を示す説明図である。
【0048】
流向を示す線(流向ベクトル;flow direction vector)614が地図310上に表示される。それぞれの流向ベクトル614は、下流端(すなわちアイコン321によって指示された地点)に達することが確認できる。また、図5と図6を比較すると、図5の処理済み領域513の内に、流向ベクトル614が生成されることが確認できる。この流向ベクトル614が表示された領域が、下流端に流れ込む水の流域である。
【0049】
図6には、ステップ209において流向を示す情報が表示される例を示した。しかし、ある格子が流域に含まれると判定された場合、その格子が流域に含まれることを示す情報のみが地図310上に表示されてもよい。少なくとも、ステップ209において、格子を識別する情報(例えば、格子の位置を示す情報)、及び、その格子が流域に含まれることを示す情報が出力される。
【0050】
以上、図2にしたがってPC100によって実行される処理を示すシーケンスについて説明した。流域推定プログラム141は、空間をコンピュータで表現するために変数及び格子を利用する。また、流域推定プログラム141は、格子をコンピュータで効率的に扱うために部分領域を利用する。そこで、流域推定プログラム141が利用する格子、部分領域及び変数を説明する。
【0051】
図7は、本発明の実施形態の流域推定プログラム141が利用する格子及び部分領域を示す説明図である。
【0052】
本実施形態では、空間の東西方向(701)をx軸、南北方向(702)をy軸とする直交座標系(Cartesian coordinate system)を利用する。さらにこの空間をx軸及びy軸に平行な格子線(図中の細線、例えば格子線703)で分割する。格子線のx軸方向の間隔(704)をdx、y軸方向の間隔(705)をdyとする。格子線で囲まれた正方形(又は長方形)の領域が格子である。
【0053】
格子は、その格子の位置を示す情報(例えば、座標(i,j))によって識別されてもよい。地点(x,y)を含む格子(i,j)は以下の式で求められる。
【0054】
i=floor(x/dx), j=floor(y/dy) ・・・(1)
ただし、floor()は、括弧内の値の小数部分を切り捨てることによって、括弧内の値の整数部分のみを取得する関数である。
【0055】
さらに本実施形態では、空間をx軸及びy軸に平行な部分領域線(図中の太線、例えば部分領域線706)で分割する。部分領域線のx軸方向の間隔(707)をsi*dx、y軸方向の間隔(708)をsj*dyとする。ただし、si及びsjは1以上の整数である。それぞれの格子は1つの部分領域に属することになる。
【0056】
格子(i,j)が属する部分領域(bi,bj)は以下の式で求められる。
【0057】
bi=floor(i/si), bj=floor(j/sj) ・・・(2)
部分領域(bi,bj)に属する格子は以下の式を満たす格子(i,j)である。
【0058】
bi*si<=i<(bi+1)*si, bj*sj<=j<(bj+1)*sj ・・・(3)
それぞれの格子には、図8に示す変数が割り当てられる。
【0059】
図8は、本発明の実施形態の格子(i,j)に割り当てられる変数の説明図である。
【0060】
各格子には、少なくとも図8に示した情報、すなわち、標高(810)、最大勾配方向配列(820)、流向候補配列(830)及び流域フラグ(850)が割り当てられる。言い換えると、格子ごとに、図8に示す情報が生成され、メモリ120に保持される。
【0061】
説明のために、それぞれの変数に名前をつける。標高(810)は変数Glev、最大勾配方向配列(820)は配列DownDir0、流向候補配列(830)は配列DownDir1、流域フラグ(850)は変数IsBasinにそれぞれ格納される。
【0062】
なお、上記のような変数が格納される代わりに、図8で示した各変数と同等の情報がコンピュータに格納されてもよい。たとえば、変数に別の名前をつけてもよい。
【0063】
標高(810)は、格子の標高値を格納するための変数である。
【0064】
格子ごとの標高値に基づいて、格子ごとの勾配を算出することができる。
【0065】
図9は、本発明の実施形態において算出される勾配の説明図である。
【0066】
格子(i,j)における勾配は、格子(i,j)の標高値とその格子に隣接する格子における標高値との差を格子間の距離で割った値である。1格子に隣接する格子は8ある。したがって、格子(i,j)における勾配の方向は8ある。すなわち、東、北東、北、北西、西、南西、南、南東である。勾配の方向をそれぞれ方向901から方向908の矢印で示す。説明のために、格子900における8方向の勾配を、変数Grad1からGrad8と記載する。
【0067】
変数Grad1からGrad8の値は、以下式によって求められる。
【0068】
Grad1=(Glev[i,j]-Glev[i-1,j+1])/hypot(dx,dy) ・・・(4−1)
Grad2=(Glev[i,j]-Glev[i,j+1])/dy ・・・(4−2)
Grad3=(Glev[i,j]-Glev[i+1,j+1])/hypot(dx,dy) ・・・(4−3)
Grad4=(Glev[i,j]-Glev[i-1,j])/dx ・・・(4−4)
Grad5=(Glev[i,j]-Glev[i+1,j])/dx ・・・(4−5)
Grad6=(Glev[i,j]-Glev[i-1,j-1])/hypot(dx,dy) ・・・(4−6)
Grad7=(Glev[i,j]-Glev[i,j-1])/dy ・・・(4−7)
Grad8=(Glev[i,j]-Glev[i+1,j-1])/hypot(dx,dy) ・・・(4−8)
ただし、Glev[i,j]は格子(i,j)における勾配、hypot(x,y)は原点(0,0)と点(x,y)との距離を返す関数である。
【0069】
上記の式によって算出された変数Grad1からGrad8の値は、格子(i,j)から、その格子の周囲に隣接する8個の格子へ向かう方向の下り勾配を示す。例えば、格子(i,j)から格子(i−1,j+1)に向かう方向の勾配が下りである(すなわち、格子(i,j)の標高より格子(i−1,j+1)の標高が低い)場合、変数Grad1の値は正となる。そして、その下り勾配が急である(すなわち、格子(i,j)の標高と格子(i−1,j+1)の標高との差が大きい)ほど、変数Grad1の値は大きくなる。
【0070】
なお、本実施形態では、格子と、その格子に隣接する8格子との間の勾配が計算される。しかし、格子と、その格子の東西方向及び南北方向に隣接する4格子との間の勾配が計算されてもよい。その場合は、上記8方向の勾配変数のうちGrad2、Grad4、Grad5及びGrad7のみが使用される。ただし、勾配が計算される隣接格子の数が増えるほど、精度のよい結果が期待できる。
【0071】
図8に示した最大勾配方向配列DownDir0(820)は、これら8方向の変数(Grad1からGrad8)のうち、値が最大である変数に対応する方向を保持する配列である。すなわち、配列DownDir0に格納できる要素は、東、北東、北、北西、西、南西、南及び南東の8方向のうち少なくとも一つを識別するための情報であり、要素の数(配列サイズ)は0から8のいずれかである。この配列の初期値は、要素数0を示す状態であるemptyである。一つの格子について計算されたGrad1からGrad8のうち、値が最大であるものが複数存在する場合、複数の方向を識別する値が最大勾配方向配列DownDir0(820)に保持される。
【0072】
流向候補配列DownDir1(830)は、最大勾配方向配列DownDir0(820)に格納された要素のうち、さらに別の基準を満たす要素のみを保持する配列である。この配列の初期値は、要素数0を示す状態であるemptyである。流向候補配列DownDir1(830)に保持される要素については、後に図15を参照して詳述する。
【0073】
流域フラグ(850)は、その格子が流域に含まれるか否かを判別した結果を格納する変数である。この変数の値は、true又はfalseのいずれかとなる。trueは格子が流域に含まれることを、falseは格子が流域に含まれないことを示す。この変数の初期値が、falseである。
【0074】
それぞれの格子に対応する、図8に示す変数が、メモリ120に展開される。格子の数は、極めて多くなる場合がある。その場合、メモリ120に展開される変数が非常に多くなる。変数の展開を効率的に行うためには、変数の実装をコンピュータの構造に適した設計にする必要がある。本発明では、格子をコンピュータで効率的に扱うために、部分領域にゴーストセル(ghost cell)を追加する。
【0075】
図10は、本発明の実施形態のメモリ120に展開された状態の部分領域を説明するための図である。
【0076】
部分領域には、ゴーストセルが付加される。図においてゴーストセルは斜線でハッチングされた格子である。一方、ドットで網掛けされた格子は、部分領域に含まれる格子(すなわち内部セル)である。
【0077】
ある部分領域に付加されたゴーストセルは、その部分領域に隣接する部分領域に属する内部セルのコピーである。図10には、(bi,bj)=(0,0)を満たす部分領域1010及び(bi,bj)=(1,0)を満たす部分領域1020が書かれている。部分領域1020に付加されたゴーストセル1021は、部分領域1010に含まれる内部セル1011のコピーである。同様に、部分領域1010に付加されたゴーストセル1012は、部分領域1020に含まれる内部セル1022のコピーである。このように、全てのゴーストセルは対応する内部セルのコピーである。
【0078】
部分領域(bi,bj)に含まれる内部セルは、前述したとおり(3)式を満たす格子である。
【0079】
部分領域(bi,bj)に付加されたゴーストセルは、(3)式を満たさず、かつ以下の(5)式を満たす格子である。
【0080】
bi*si-mi<=I<(bi+1)*si+mi, bj*sj-mj<=j<(bj+1)*sj+mj ・・・(5)
mi及びmjは1以上の整数である。これらの数は、部分領域の内部セルにおける変数を求めるために参照される必要がある格子が、ゴーストセルとしてその部分領域に付加されるように定められる。本実施形態においては、mi=1,mj=1とした。これは、ある格子の勾配を計算するために、その格子に隣接する8格子の標高値を参照する必要があるためである。ゴーストセルの標高値を参照しなければ、部分領域の端に位置する内部セルの勾配を算出することができない。しかし、mi=1,mj=1とすれば、一つの部分領域の内部セル及びその部分領域に付加されたゴーストセルの標高値に基づいて、その部分領域の全内部セルの勾配を計算することができる。
【0081】
このように、部分領域にゴーストセルが付加される場合、部分領域の内部セルを処理するために必要な情報が全てその部分領域及びゴーストセルに含まれる。このことは、複数の部分領域を並列処理することを可能にする。したがって、ゴーストセルが付加された部分領域を利用することで、プログラムの効率が向上することが期待できる。
【0082】
以上、図7から図10を使って、流域推定プログラム141の処理で使用される格子、部分領域、及び変数を説明した。続いて、流域推定プログラム141における流向算出処理(ステップ204)の詳細を説明する。
【0083】
図11は、本発明の実施形態の流域推定プログラム141の流向算出処理(ステップ204)を示すフローチャートである。
【0084】
まず、ステップ1101において、CPU130は、下流端を含む格子を現在の検査対象として指定する。下流端は地図310に入力される(図3参照)。CPU130は、下流端の位置情報を地図310における座標系から直交座標系に変換する。続いてCPU130は、(1)式によって直交座標(x,y)を格子(i,j)に変換する。CPU130は、この格子(i,j)に関する情報を現在の検査対象としてメモリ120に記憶する。現在の検査対象を記憶するための配列を、ここではCurCellsと記載する。
【0085】
ステップ1102において、CPU130は、現在の検査対象の格子を含む部分領域を読み込む。このとき、図10に示すように、ゴーストセルも読み込まれ、部分領域に付加される。このステップの詳細を後述する図12及び図13で説明する。
【0086】
ステップ1103において、CPU130は、処理済み領域をウィンドウ300に出力する(図4、図5参照)。この処理は、すでに図2で説明したステップ206に相当する。
【0087】
ステップ1104において、CPU130は、部分領域に付加されたゴーストセルの同期を行う。このステップ1104の詳細を後述する図16で説明する。
【0088】
ステップ1105において、CPU130は、現在の検査対象の上流の格子を次の検査対象として記憶する。具体的には、CPU130は、配列CurCellsに格納された格子に隣接し、かつその格子の上流に位置する格子を次の検査対象としてメモリ120に記憶する。次の検査対象を記憶するための配列を、ここではNextCellsと記載する。このステップ1105の詳細を後述する図15で説明する。
【0089】
ステップ1106において、CPU130は、次の検査対象を現在の検査対象として新たに指定する。具体的には、CPU130は、配列CurCellsを空にした後、配列NextCellsの全ての要素を配列CurCellsに格納する。さらに、CPU130は、配列NextCellsを空にする。
【0090】
ステップ1107において、CPU130は、現在の検査対象の要素数が0より大か否かを判定する。具体的には、配列CurCellsの要素数と0とが比較される。
【0091】
ステップ1107の結果が真である場合、現在の検査対象の格子の上流の格子が存在する可能性がある。この場合、処理はステップ1102に戻る。一方、ステップ1107の結果が偽である場合、前回のステップ1105において、配列NextCellsに追加された格子が存在しない。すなわち、現在までに検出された流域の上流の格子が存在しない。この場合、上流の探索が終了し、処理は図2に示したステップ208に進む。
【0092】
このように、ステップ1102からステップ1107の処理によって、現在の検査対象の格子に隣接し、かつ上流にある格子が検査対象として指定される。また、ステップ1105において現在の検査対象の格子の上流の格子が存在する限りステップ1102からステップ1107が繰り返される。したがって、図11に示したステップによって、一つの流域に含まれる下流端から上流までに位置する全ての格子が、必ず一度検査対象として指定される。
【0093】
図12は、本発明の実施形態の部分領域読み込み処理(ステップ1102)の詳細を示す第1のフローチャートである。
【0094】
ステップ1201において、CPU130は、現在の検査対象として指定された全ての格子についてステップ1202からステップ1208までの処理を繰り返す。具体的には、CPU130は、現在の検査対象として指定された格子のうち一つを選択し、選択された格子についてステップ1202から1208までの処理を実行する。この選択された格子は、図12の説明において対象格子と記載される。現在の検査対象として指定された全ての格子についてステップ1202から1208までの処理が終了するまで、上記の選択及び処理が繰り返される。
【0095】
ステップ1202において、CPU130は、対象格子を含む部分領域の識別子(部分領域ID)を算出する。部分領域IDとして、式(2)によって算出される部分領域の座標(bi,bj)が使用される。格子(i,j)を含む部分領域座標(bi,bj)の算出方法は式(2)に示した。算出された部分領域IDは、図12の説明において対象部分領域IDと記載される。対象部分領域IDによって識別される部分領域は、図12の説明において対象部分領域と記載される。
【0096】
ステップ1203において、CPU130は、対象部分領域IDが配列Domainに含まれているか否かを判定する。この配列Domainは、ステップ1204以下のステップが実行された部分領域IDを記憶するための配列であり、要素数は0以上である。ステップ1203の結果が真であれば、対象部分領域について、既にステップ1204以降の処理が実行されている。この場合、処理はステップ1209に進む。ステップ1203の結果が偽であれば、処理はステップ1204以下に進む。
【0097】
ステップ1204において、CPU130は、対象部分領域IDを配列Domainに追加する。
【0098】
ステップ1205において、CPU130は、対象部分領域から所定の距離内にある部分領域をメモリ120に展開する。したがって、少なくとも対象部分領域と、対象部分領域に隣接する部分領域がメモリ120に展開される。具体的には、それらの部分領域に属する内部セル及びそれらに付加されたゴーストセルのデータ(図8参照)がメモリ120に格納される。対象部分領域に隣接する部分領域とは、東西方向3列、南北方向3列の9個の部分領域である。それらの9個の部分領域の中心が対象部分領域である。
【0099】
なお、後述するように、窪地を埋める処理によって、格子の標高値が変更される場合がある。しかし、対象部分領域から上記の所定の距離より遠くにある窪地を埋めても、対象部分領域の標高は変更されない。これは、窪地を埋める処理において、窪地の面積が所定の値を超えた場合には窪地の標高値が変更されないためである。この処理については後述する(図14参照)。
【0100】
上記の所定の距離は、その土地にあった値に設定されることが望ましい。たとえば降雨量が多く土地の浸食の激しい日本では、この所定の距離を1km程度にするのが適当と考えられる。逆に、降雨量が少なく土地の浸食が緩やかな米国中西部では、この所定の距離を10km程度にするのが適当と考えられる。部分領域の詳細は上記図10にて説明した。
【0101】
ステップ1206において、CPU130は、標高データ192を読み出す。この処理はすでに図2でステップ205として説明した。CPU130は、読み出した標高データのうち、ステップ1205において展開された部分領域に属する格子の標高データを、その格子の標高Glev(810)に代入する。
【0102】
ステップ1207において、CPU130は、最大勾配方向を算出する。勾配についてはすでに図9で説明した。各方向の勾配は、式(4−1)から式(4−8)によって算出される。CPU130は、算出した8方向の勾配の最大値に対応する勾配方向を最大勾配方向配列DownDir0(820)に格納する。
【0103】
ステップ1208において、CPU130は、最大勾配の値が0以下である格子を初期値として、窪地データを生成する。さらに、CPU130は、生成した窪地データを配列Sinksに格納する。ここで、配列Sinksは窪地データを記憶するための配列である。
【0104】
図17は、本発明の実施形態の窪地データの詳細を示す説明図である。
【0105】
窪地データは、現在の標高(1710)、新しい標高(1720)、格子配列(1730)、隣接格子配列(1740)及び窪地埋め終了フラグ(1750)からなる。説明のため、これらをそれぞれGlevCur、GlevNew、Cells、Neibs及びIsFinishと記載する。
【0106】
格子配列Cellsは、窪地に含まれる格子を識別する情報を格納する配列である。
【0107】
隣接格子配列Neibsは、窪地に含まれる格子に隣接する格子を識別する情報を格納する配列である。より詳細には、隣接格子配列Neibsには、窪地に含まれる各格子に隣接する全ての格子を識別する情報のうち、格子配列Cellsに含まれないものが格納される。
【0108】
格子配列Cells及び隣接格子配列Neibsの初期値は、要素のないempty状態である。この窪地データの初期化は、1つの格子theCellを与えることによって実行される。ここで与えられるtheCellは、窪地の底に相当する格子である。
【0109】
現在の標高GlevCurは、窪地内の格子の標高値の候補を格納する変数である。現在の標高GlevCurの初期値は、その格子theCellの標高である。
【0110】
新しい標高GlevNewは、窪地内の格子の標高値の候補となる可能性がある値を一時的に格納する変数である。
【0111】
格子配列Cellsには、初期値として、その格子theCellが格納される。
【0112】
窪地埋め終了フラグIsFinishの初期値は、窪地を埋める処理(図14参照)が終了していないことを示す偽(false)である。この値は、窪地を埋める処理が終了すると、真(true)に更新される。
【0113】
図17に示すデータの一組が、配列Sinksの一要素に相当する。
【0114】
再び図12に戻り説明する。ステップ1209において、ステップ1201のループが完了するまで処理はステップ1201に戻る。ステップ1201のループが完了した場合、処理は図13に示したステップ1301に進む。
【0115】
図12の例では、ステップ1205において、対象格子を含む部分領域及びその周囲の一つ以上の部分領域のデータがメモリ120に格納される。しかし、図12は一例であり、メモリ120に格納されるデータ量がより多く(又はより少なく)なるように制御されてもよい。
【0116】
少なくとも、対象格子に流入する水の流向を算出するためには、対象格子の周囲に隣接する8個の格子の最大勾配方向を算出する必要がある。対象格子が格子(i,j)である場合、対象格子の周囲に隣接する8個の格子とは、x=i−1、i又はi+1、y=j−1、j又はj+1を満たす9個の格子(x、y)のうち、対象格子を除く8個の格子である。
【0117】
対象格子の周囲に隣接する8個の格子の最大勾配方向を算出するためには、対象格子の標高値、及び、対象格子の周囲に隣接する8個の格子の標高値に加えて、対象格子の周囲に隣接する8個の格子のさらに周囲に隣接する16個の格子の標高値を取得する必要がある。対象格子が格子(i,j)である場合、上記の16個の格子は、x=i−2、i−1、i、i+1又はi+2、y=j−2、j−1、j、j+1又はj+2を満たす25個の格子(x、y)のうち、対象格子及び対象格子に隣接する8個の格子を除く16個の格子である。
【0118】
このため、ステップ1205において、少なくとも、対象格子、対象格子の周囲に隣接する8個の格子、及び、それらの8個の格子の周囲に隣接する16個の格子からなる25個の格子のデータがメモリ120に格納される必要がある。
【0119】
図13は、本発明の実施形態の部分領域読み込み処理(ステップ1102)の詳細を示す第2のフローチャートである。
【0120】
ステップ1301において、CPU130は、配列Sinks内の窪地データについてステップ1302からステップ1305までの処理を繰り返す。
【0121】
ステップ1302において、CPU130は、窪地を埋める処理を実行する。この処理の詳細を後述する図14にて説明する。窪地を埋める処理によって、窪地を埋める処理が終了したことを示す窪地埋め終了フラグIsFinish(1750)が変化する。
【0122】
ステップ1304において、CPU130は、窪地埋め終了フラグIsFinishが真であるか否かを判定する。窪地埋め終了フラグIsFinishが真の場合、窪地を埋める処理が終了している。この場合、処理はステップ1305に進む。一方、窪地埋め終了フラグIsFinishが偽の場合、窪地を埋める処理が終了していない。この場合、処理はステップ1306に進む。
【0123】
ステップ1305において、CPU130は、窪地を埋める処理が終了した窪地データを配列Sinkから削除する。
【0124】
ステップ1306において、CPU130は、ステップ1301のループが完了するまでステップ1301に戻る。
【0125】
ステップ1307において、CPU130は、ステップ1207と同じ処理(最大勾配方向の算出)を再び実行する。このステップ1307でステップ1207と同じ処理を再び行う理由は、ステップ1302の窪地埋め処理によって格子の標高値が変更されたためである。すなわち、ステップ1307において、変更された標高値を用いて最大勾配方向が算出される。
【0126】
図14は、本発明の実施形態の窪地を埋める処理(ステップ1302)の詳細を示すフローチャートである。
【0127】
まず、ステップ1401において、CPU130は、配列Cells内の格子に隣接する格子を配列Neibsに格納する。
【0128】
ステップ1402において、CPU130は、窪地を埋めるために必要な標高データがメモリに展開されているか否かを判定する。具体的には、CPU130は、配列Neibs内の全ての格子がメモリ120に展開されているか否かを判定する。これは、配列Neibs内の格子(i,j)を含む部分領域(bi,bj)を(2)式によって求め、その値が配列Domainに含まれているか否かを判定することによって実行される。
【0129】
ステップ1402の判定の結果が真であれば、この処理をさらに進めるためステップ1403に進む。判定の結果が偽であれば、窪地埋め処理を実行するために必要な標高データの少なくとも一部がまだメモリ120に展開されていない。この場合、この窪地埋め処理を保留するため、処理は図13のステップ1304に進む。
【0130】
ステップ1403において、CPU130は、配列Neibs内の格子で最低の標高値を変数GlevNewに格納する。
【0131】
ステップ1404において、CPU130は、窪地を埋める処理が終了したか否かを判定する。これは、条件式GlevNew>GlevCurによって判定される。この条件式が真であれば、窪地を埋める処理は終了していないためステップ1408に進む。偽であれば窪地を埋める処理は終了したためステップ1405に進む。
【0132】
ステップ1405において、CPU130は、配列Cells内の格子の標高をGlevCurに書き換える。
【0133】
ステップ1406において、CPU130は、窪地埋め終了フラグIsFinishをtrueにし、この窪地埋め処理を終了するため図13のステップ1304に進む。
【0134】
ステップ1408において、CPU130は、現在の標高GlevCurに新しい標高GlevNewの値を代入する。
【0135】
ステップ1409において、CPU130は、変数GlevCurの値と等しい標高の格子を配列Cellsに追加する。
【0136】
ステップ1410において、CPU130は、窪地の大きさ(例えば面積)が所定の基準値よりも小さいか否かを判定する。窪地の面積が所定の基準値よりも大きい場合、その窪地は、標高の誤差に起因する窪地ではなく、実際にその場所に存在する窪地であるとみなされる。この基準値は、その土地にあった値に設定するとよい。たとえば降雨量が多く土地の浸食の激しい日本ではこの基準値を1平方キロメートル程度にするのが適当と考えられる。逆に、降雨量が少なく土地の浸食が緩やかな米国中西部では、この基準値を10平方キロメートル程度にするのが適当と考えられる。
【0137】
このステップ1410は、実際には、Cellsの要素数が、上記の所定の基準値を格子の面積で割った値より小さいか否かを判定することによって実行されてもよい。あるいは、ステップ1410の判定基準として窪地の面積ではなく、窪地の体積が用いられてもよい。ただし、判定基準として面積を使った方が、CPU130の負荷は軽くなる。
【0138】
窪地の体積は、窪地に含まれる各格子の深さを格子の面積に乗算した値を合計することによって算出される。各格子の深さは、各格子の現在の標高GlevCurからその格子の標高Glevを減算することによって算出される。
【0139】
このステップ1410の判別結果が真であれば、窪地は地形データの誤差に起因すると見なされるため、処理はステップ1401に戻る。ステップ1410の判別結果が偽であれば、窪地は実際の地形に起因すると見なされるため、処理はステップ1411に進む。
【0140】
ステップ1411において、CPU130は、窪地埋め終了フラグIsFinishをtrueにし、この窪地埋め処理を終了するため図13のステップ1304に進む。
【0141】
上記のように、ステップ1404の判定結果が偽(すなわちNo)であった場合、窪地内の格子の標高が変更され、確定する。ステップ1410の判定結果が偽であった場合、窪地内の格子の標高が変更されないことが確定する。
【0142】
一方、ステップ1402の判定結果が偽であった場合、窪地埋め処理が保留される。すなわち、この場合、窪地内の格子の標高がまだ確定しない。その後、図12のステップ1205において、新たな部分領域がメモリ120に展開されると、ステップ1402の判定結果が真(すなわちYes)となり、窪地内の格子の標高を確定させるための処理が続行される。
【0143】
しかし、ステップ1307が実行される時点で、最大勾配方向が算出される格子及びその格子に隣接する格子の標高が確定している必要がある。言い換えると、ステップ1301から1306までのループが終了した時点で、少なくとも、現在の検査対象の格子を含む部分領域内の全ての格子の標高が確定している必要がある。この確定のために、ステップ1205において、ステップ1410の基準値が示す面積より十分に広い範囲の部分領域がメモリ120に展開される必要がある。
【0144】
具体的には、ステップ1205において、対象部分領域内の格子から半径r(m)以内の全ての格子がメモリ120に展開される必要がある。ここで、ステップ1410の基準値がA(平方m)、一格子が1辺dx(m)の正方形である(すなわちdxとdyが等しい)場合、半径rは、次の式(6)を満たす必要がある。
【0145】
r≧A/dx・・・(6)
上記の条件が満たされる場合、対象部分領域内の格子を含み、かつ、面積が基準値A以内である窪地は、それがどのような形状であっても、ステップ1205において展開された部分領域の中に含まれる。したがって、この場合、対象部分領域の少なくとも一部の格子が窪地に含まれていても、その対象部分領域内の全ての格子の標高は、ステップ1307が実行される時点で全て確定している。
【0146】
図15は、本発明の実施形態の上流探索処理(ステップ1105)の詳細を示すフローチャートである。
【0147】
ステップ1501において、CPU130は、配列CurCell内の格子について以降の処理を繰り返す。図15において、ステップ1501から1507までのループの処理対象の格子を、Cell0と記載する。
【0148】
ステップ1502において、CPU130は、Cell0に隣接する8個の格子について以降の処理を繰り返す。図15において、ステップ1502から1506までのループの処理対象の格子を、Cell1と記載する。したがって、Cell0とCell1とは隣接している。
【0149】
ステップ1503において、CPU130は、Cell1の最大勾配方向にCell0があり、かつ、Cell1の流域フラグ(IsBasin)がFalseであるか否かを判定する。Cell1の最大勾配方向にCell0がある場合、そのCell1から流出した水がCell0に流入すると推定される。Cell1の流域フラグ(IsBasin)がFalseである場合、そのCell1がどの流域に属するかまだ確定していない。
【0150】
ステップ1503の判定の結果が真の場合、Cell1とCell0とが一つの流域に含まれる。この場合、処理はステップ1504に進む。
【0151】
一方、判定の結果が偽の場合(すなわち、Cell1の最大勾配方向にCell0がないか、又は、Cell0の流域フラグ(IsBasin)がTrueである場合)、処理はステップ1506に進む。
【0152】
ステップ1504において、CPU130は、Cell1の流向候補配列(DownDir1)にCell0の方向を追加する。たとえば、Cell0がCell1の北西方向にあれば、その方向が流向の候補として配列に追加される。
【0153】
ステップ1505において、CPU130は、Cell1の流域フラグ(IsBasin)を真にする。
【0154】
ステップ1506において、CPU130は、ステップ1502のループが完了するまでステップ1502に戻る。
【0155】
ステップ1502からステップ1506までのループが完了した時点で、Cell1の流向候補配列(DownDir1)に含まれる流向候補が確定する。例えば、ステップ1504において、Cell0がCell1の北西方向にある場合、その方向(北西方向)がCell1の流向の候補として追加される。そして、ループが完了すると、この流向が確定する。流向の確定は、以下のようにすればよい。流向候補配列DownDir1に1つの方向が格納されている場合、その方向を流向として確定する。流向候補配列DownDir1に2以上の方向が格納されている場合、あらかじめ決めた方法にしたがって1つの方向を選択する。選択する方法は、乱数により決めてもいいし、あらかじめ決めた優先度(たとえば、東、北東、北、北西、西、南西、南、南東の順に優先して選択する)に従って決めてもよい。Cell1の水がCell0に流出する場合、Cell0とCell1とが一つの流域に含まれると判定される。このCell1は、Cell0の次の検査対象として選択される。すなわち、このCell1は、配列NextCellsに追加され、図11のステップ1106において、現在の検査対象として新たに選択される。
【0156】
ステップ1507において、CPU130は、ステップ1501のループが完了するまでステップ1501に戻る。
【0157】
図16は、本発明の実施形態の部分領域に付加されたゴーストセルの同期処理(ステップ1104)の詳細を示すフローチャートである。
【0158】
ステップ1601において、CPU130は、配列Domain内の部分領域について以降の処理を繰り返す。
【0159】
ステップ1602において、CPU130は、部分領域に付加されたすべてのゴーストセルについて以降の処理を繰り返す。
【0160】
ステップ1603において、CPU130は、ゴーストセルに対応する内部セルの変数値をコピーする。例えば、図10のゴーストセル1012についてステップ1603が実行される場合、ゴーストセル1012に対応する内部セル1022の変数値(すなわち、図8に示す各変数の値)がゴーストセル1012にコピーされる。その結果、内部セル1022の標高値が窪地埋め処理によって変更された場合、その変更がゴーストセル1012に反映される。
【0161】
ステップ1604において、CPU130は、ステップ1602のループが完了するまでステップ1602に戻る。
【0162】
ステップ1605において、CPU130は、ステップ1601のループが完了するまでステップ1601に戻る。
【0163】
以上述べたとおり、本発明の実施形態によれば、流域に関する事前知識を要求としない、流域推定コンピュータプログラムを提供することができる。このプログラムを使用することによって、コンピュータが使えるユーザであれば、専門家と同等の品質の流域推定が可能になる。
【図面の簡単な説明】
【0164】
【図1】本発明の実施形態におけるコンピュータシステムの構成を示す概略ブロック図である。
【図2】本発明の実施形態のPCによって実行される処理を示すシーケンス図である。
【図3】本発明の実施形態の流域推定プログラムが提供するGUIの入力待ちの状態を示す説明図である。
【図4】本発明の実施形態の流域推定プログラムが提供するGUIの解析中の状態を示す第1の説明図である。
【図5】本発明の実施形態の流域推定プログラムが提供するGUIの解析中の状態を示す第2の説明図である。
【図6】本発明の実施形態の流域推定プログラムが提供するGUIの流域推定済みの状態を示す説明図である。
【図7】本発明の実施形態の流域推定プログラムが利用する格子及び部分領域を示す説明図である。
【図8】本発明の実施形態の格子に割り当てられる変数の説明図である。
【図9】本発明の実施形態において算出される勾配の説明図である。
【図10】本発明の実施形態のメモリに展開された状態の部分領域を説明するための図である。
【図11】本発明の実施形態の流域推定プログラムの流向算出処理を示すフローチャートである。
【図12】本発明の実施形態の部分領域読み込み処理の詳細を示す第1のフローチャートである。
【図13】本発明の実施形態の部分領域読み込み処理の詳細を示す第2のフローチャートである。
【図14】本発明の実施形態の窪地を埋める処理の詳細を示すフローチャートである。
【図15】本発明の実施形態の上流探索処理の詳細を示すフローチャートである。
【図16】本発明の実施形態の部分領域に付加されたゴーストセルの同期処理の詳細を示すフローチャートである。
【図17】本発明の実施形態の窪地データの詳細を示す説明図である。
【図18】DEMの誤差の影響を説明するための図である。
【符号の説明】
【0165】
100 PC
310 地図
321 下流端を示すアイコン
413、513 処理済み領域
614 流向ベクトル
703 格子線
706 部分領域線
1010、1020 部分領域
【技術分野】
【0001】
本願明細書で開示される技術は、コンピュータを使って流域を推定する方法に関する。本願明細書で開示される技術は特に、1以上の地点の位置を入力データとし、それぞれの地点の流域を数値地形モデル(digital elevation mode,DEM)に基づいて推定するコンピュータプログラムに関する。
【背景技術】
【0002】
流域は、河川、ダム、下水などの水を管理する土木構造物にとって非常に重要な情報である。多くの場合、土木構造物に入ってくる水の起源は降雨である。つまり、降雨が地表面に落ち、地表面を流れ下って構造物に入る。したがって、構造物に至る全ての流れをさかのぼれば、降雨が落ちた地表面に達する。この地表面を構造物の流域という。
【0003】
近年では、地表面の標高は電子データとして得られる。このような標高の電子データは、一般的にDigital Elevation Model (DEM)と呼ばれる。DEMでは、ある領域の地表面が格子(grid又はcell)と呼ばれる小領域に分割され、それぞれの格子に標高値が与えられる。多くの場合、DEMの格子は正方形である。
【0004】
このDEMを使い、土木構造物の流域を推定するコンピュータプログラムが作られている。通常、地表面に落ちた降雨は最も急な下り勾配(gradient)の方向に流れ下る。したがって、DEMの格子ごとの勾配を求めれば、流域を推定できる。勾配から流域を推定する方法は、非特許文献1に詳しい。
【0005】
このような流域を推定するコンピュータプログラムに共通の課題は、DEMの誤差である。勾配はベクトル解析における勾配演算によって算出される。勾配演算は元データの誤差に敏感である。したがって、DEMデータから流域を推定する方法は誤差に敏感である。
【0006】
図18は、DEMの誤差の影響を説明するための図である。
【0007】
グラフ1800は、ある断面に沿った標高である。格子1801から格子1809までの格子に標高が与えられ、勾配が算出されている。勾配を矢印(たとえば1811)で示す。グラフ1800では、格子1806の標高が、隣接する格子1805及び1807の標高よりも低い。下り勾配の方向(すなわち図の矢印の方向)と水が流れる方向とが一致すると仮定すると、格子1801から格子1807までに降った雨は格子1806に流れ出て、格子1806からは水が流れ出ないことになる。また、格子1809の流域は格子1807及び1808となる。この結果と、地表面を流れる水は最終的に標高の低い場所に至るという私たちの常識とは矛盾する。この矛盾の原因は、格子1806近傍の標高データの誤差にあると推測される。
【0008】
誤差の修正方法として、いくつかの方法が提案されている。最も一般的な修正方法は、窪地埋め(sink filling)である。窪地とは1以上の格子からなる、周囲に比べ相対的に標高が低い領域である。窪地埋めの方法は非特許文献1に詳しく説明されている。この方法では、ある領域内の全ての格子のうち、ある格子の標高が、隣接するすべての格子の標高と同じ又は低い場合、ごく小さな値をその格子の標高に加える。この処理を繰り返すことによって修正が完了する。このように誤差が修正されたDEMを元に推定した流域と、私たちの常識とは一致する。
【0009】
図18のグラフ1820は、グラフ1800に示したDEMデータをこの方法によって修正した結果である。格子1821から格子1829は、それぞれ、修正前のグラフ1800の格子1801から格子1809に対応する。窪地(すなわち格子1825及び1826)が埋められた結果、格子1829の流域が格子1821から格子1829までとなった。
【0010】
さらに別の誤差修正方法として、特許文献1に開示された「Method for flow analysis utilizing cell elevation topography」が挙げられる。この方法では、あらかじめ領域の内部が複数のmajor cellに分割される。さらに、major cellの内部が、少なくとも横方向に3分割、縦方向に3分割することによって、少なくとも9個のminor cellに分割される。あるminor cellにおける勾配を算出するときは、そのminor cellを含むmajor cellと、さらにそのmajor cellに隣接するmajor cellについてDEMデータのエラーが修正される。その後、これらのmajor cellに含まれるminor cellについて勾配が再度算出される。
【0011】
非特許文献1では処理の対象とする領域全体に誤差修正処理をする必要があったが、特許文献1に開示された方法では処理の対象とする領域を複数に分割し、分割された領域ごとに勾配を求めることが可能になる。
【0012】
いずれの誤差修正方法であっても、DEMデータの誤差を修正した後に流域を推定する。つまり、まずDEMデータを修正する。次にDEMデータから勾配データを算出する。この勾配データを使って上流方向にたどると、流域が求まる。
【特許文献1】米国特許出願公開第2005/0049802号明細書
【非特許文献1】Costa−Cabral,M.C.,and S.J.Burges(1994),Digital elevation model networks(DEMON): A model of flow over hillslopes for computation of contributing and dispersal areas,Water Resour.Res.,30(6),1681−1692.
【発明の開示】
【発明が解決しようとする課題】
【0013】
従来の流域推定プログラムは、DEMデータの誤差を修正した後に、流域を推定する。したがって、流域を推定する前に、修正すべきDEMデータの範囲を知っておく必要がある。ところが流域を推定したい場合、修正すべきDEMデータの範囲は流域である。つまり従来の流域推定プログラムのユーザは、そのプログラムの実行結果である流域を、プログラムを実行する前に知っておく必要がある。したがって、従来の流域推定プログラムを使えるユーザは、流域をあらかじめ知っているユーザに限られていた。流域を知らないユーザが従来の流域推定プログラムを使用すると、DEMデータを適切に修正できないために、流域を正確に推定することが困難であった。
【0014】
本発明はこの問題に鑑みてなされたものである。本発明の目的は、流域に関する事前知識のないユーザが使用しても、流域を正確に推定することができる流域推定コンピュータプログラムを提供することである。
【課題を解決するための手段】
【0015】
本願で開示する代表的な発明は、計算機を制御するプログラムであって、前記計算機は、前記プログラムが格納されるメモリと、前記メモリに格納された前記プログラムを実行するプロセッサと、を備え、前記プログラムは、地図上の地点を指示する入力を受け付ける第1手順と、前記地図を互いに直交して設定された第1軸及び第2軸に沿ってそれぞれ等間隔に区切る線によって囲まれた格子のうち、前記入力によって指定された地点を含む格子を、処理対象である第1格子として選択する第2手順と、前記第1格子を含む第1領域内の格子に対して定められた標高値を前記メモリに格納する第3手順と、前記第1領域内の窪地を検出する第4手順と、前記検出された窪地に含まれる格子の標高値を、前記窪地に含まれる格子に隣接する一つの格子の標高値に変更する第5手順と、前記第1領域内の格子の標高値に基づいて、前記第1領域内の格子のうち、前記第1格子に隣接する第2格子から流出する水の流向を判定する第6手順と、前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子と前記第1格子とが一つの流域に含まれると判定する第7手順と、前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子を、処理対象である第1格子として新たに選択する第8手順と、前記第1格子として新たに選択された格子が前記一つの流域に含まれることを示す情報を出力する第9手順と、を前記プロセッサに実行させることを特徴とする。
【発明の効果】
【0016】
本発明の一実施形態によれば、流域に関する事前知識を要求しない、流域推定コンピュータプログラムが提供される。コンピュータが使えるユーザであれば、このプログラムを使用することによって、専門家と同等の品質の流域推定をすることができる。
【発明を実施するための最良の形態】
【0017】
最初に、本発明の実施形態の概要を説明する。本実施形態では、DEMデータの誤差を修正しながら流域を推定する。また、この処理をコンピュータで効率的に行うために、部分領域(subdomain)を使用する。部分領域とは、複数の格子からなる領域である。本発明の処理の概要は以下の通りである。まず、現在流域とわかっている領域を含む部分領域との距離が所定の値より近い部分領域のDEMデータを読み込む。次に、読み込んだDEMデータを修正する。DEMデータの修正とは窪地を埋める処理である。この窪地を埋める処理を、窪地がなくなるまで繰り返す。ただし、窪地が所定の体積又は面積よりも大きい場合、その窪地は埋めない。また、すでにDEMデータを読み込んである部分領域よりも外側に窪地が拡がる可能性がある場合、その窪地が拡がる可能性がある部分領域のDEMデータが読み込まれるまでその窪地を埋める処理を保留する。続いて、現在流域とわかっている領域の1格子外側の格子が、流域か否かを判定する。その格子が流域であると判定された場合、その格子を流域に含める。この一連の処理を繰り返し行う。
【0018】
以下、本発明の実施形態を添付図面に基づいて説明する。
【0019】
図1は、本発明の実施形態におけるコンピュータシステムの構成を示す概略ブロック図である。
【0020】
本実施の形態のコンピュータシステムは、PC(Personal Computer)100によって構成される。PC100は、入出力部110及びHDD(Hard Disk Drive)190を備える。入出力部110は、キーボード111及びびマウス112などからなる入力部と、ディスプレイ113などからなる出力部とによって構成される。ユーザは、入力部から命令を入力し、出力部から結果を確認することができる。
【0021】
さらにPC100は、メモリ120及びCPU(Central Processing Unit)130を備える。メモリ120には流域推定プログラム141が展開される。この流域推定プログラム141はCPUへの命令によって構成される。CPU130は、流域推定プログラム141の命令に従って、計算、HDD190へのアクセス、及び入出力部110との情報の交換などを行う。以下の説明において流域推定プログラム141が実行する処理は、実際には、流域推定プログラム141の命令に従うCPU130によって実行される。
【0022】
HDD190には地図データ191及び標高データ192が格納される。流域推定プログラム141はこれらのデータを読み込むことができる。さらにHDD190には流向データ193を格納することができる。流域推定プログラム141はこのデータを書き込むことができる。なお、HDD190は、PC100に内蔵されてもよいし、PC100の外部に接続されてもよいし、PC100からネットワーク(図示省略)経由でアクセスできる別の装置に接続されてもよい。
【0023】
地図データ191は、ユーザに場所を理解させるために必要な情報を含んでいれば、どのような種類のものであってもよい。地図データ191に適している情報として、道路、川、山頂などの位置、等高線、地名、衛星から撮影した地表面の画像、及び緯度経度を示す線などが挙げられる。本実施形態では、川の位置、山頂の位置、及び等高線を含む地図データ191が使用される。
【0024】
標高データ192は、一般的にDigital elevation model(DEM)と呼ばれるデータである。すなわち、標高データ192は、地表面に区画された格子とその格子における地表面の標高とを記載した情報である。例えば、標高データ192は、地表面に等間隔で並べた正方形の格子(square grid)、あるいは不規則三角形ネットワーク(triangular irregular network)で表現されている格子における標高の値を含む。
【0025】
流向データ193は、流域推定プログラム141によって得られた結果に関する情報である。この流向データ193については、後述する図6で詳細に説明する。
【0026】
図2は、本発明の実施形態のPC100によって実行される処理を示すシーケンス図である。
【0027】
以下、図2にしたがってシステムの処理シーケンスを説明する。
【0028】
PC100で流域推定プログラム141が起動すると、CPU130は、流域推定プログラム141の命令に基づいて、HDD190から地図データ191を読み出す(ステップ201)。以下、図2においてCPU130が実行する処理は、流域推定プログラム141の命令に基づいて実行される。
【0029】
データを読み出したCPU130は、ウィンドウ300からなるGUI(Graphical User Interface)をディスプレイ113に出力する(ステップ202)。
【0030】
図3は、本発明の実施形態の流域推定プログラム141が提供するGUIの入力待ちの状態を示す説明図である。
【0031】
図3のGUIは、ディスプレイ113の所定の領域に表示されるウィンドウ300からなり、キーボード111及びマウス112による入力を受け付ける。
【0032】
ウィンドウ300は、少なくとも地図310を表示する。ユーザは、所定の操作をすることによって、地図310として表示される地域を所望の地域に変更することができる。
【0033】
地図310の縮尺は、流出現象の空間スケールと同程度であることが望ましい。したがって典型的な流出現象であれば、1/25,000かそれより粗い縮尺が適当である。
【0034】
本実施形態の地図310は、等高線311、川312及び山頂313の位置を示す情報を含む。
【0035】
さらにウィンドウ300は少なくとも、ユーザに1以上の地点を指定させる機能、及び、ユーザにその指定を確定させる機能を有する。後述するように、1以上の地点を指定するためにマウスポインタ301が、およびその指定を確定するためにOKボタン302が使用される。
【0036】
このGUIを用いてユーザは、興味がある地点を1点以上指定する(ステップ203)。興味がある地点を以後、下流端(terminal)と呼ぶ。例えば、ユーザは、ある地点に流入する水の流域を知りたい場合、その地点を下流端として指定する。本実施形態では、ユーザがマウス112を動かすことによってマウスポインタ301を地図310上で動かし、マウス112をクリックすることによって1地点を指定する。なお、指定した地点にアイコン321を表示することが望ましい。これによって、ユーザの操作結果をユーザにわかりやすく伝えることができる。
【0037】
ユーザは、興味ある全ての地点を入力した後、OKボタン302をクリックする。OKボタン302がクリックされると、CPU130はステップ203を終了する。図3は、ユーザが川付近の1地点をアイコン321によって下流端として指定した状態を示している。したがって、CPU130はこれからこの1地点の上流域を解析する。
【0038】
次に流域推定プログラム141は、流向算出処理(ステップ204)を繰り返し実行する。ステップ204の詳細は後述する図11で説明する。
【0039】
ステップ204は、標高データ192読み出し処理(ステップ205)及び処理済み領域表示処理(206)を含む。ステップ205では、CPU130がHDD190から標高データ192を読み込む。ステップ206では、CPU130がウィンドウ300に処理済み領域を表示する。処理済み領域とは、流向算出処理が終了した領域である。
【0040】
図4は、本発明の実施形態の流域推定プログラム141が提供するGUIの解析中の状態を示す第1の説明図である。
【0041】
図4の例では、処理済み領域を示す矩形413が地図310上に表示される。なお、CPU130が流域推定プログラム141を処理中であることをマウスポインタのアイコン401によって表すことが望ましい。
【0042】
図5は、本発明の実施形態の流域推定プログラム141が提供するGUIの解析中の状態を示す第2の説明図である。
【0043】
図5は、図4の状態のGUIが表示された時点からしばらく時間が経った時点で表示される。つまり、図4の処理済み領域(矩形413で囲まれた領域)よりも図5の処理済み領域(矩形513で囲まれた領域)の方が広い。このように、ステップ204が繰り返し実行されている間に処理済み領域が拡大し、そのことがユーザに提示される。
【0044】
ステップ204が終了した時点で、処理済み領域に含まれる各格子の流向が確定する。
【0045】
次に、CPU130は、確定した流向を示す情報をHDD190に流向データ193として書き込む(ステップ208)。
【0046】
さらに、CPU130は、図6に示すように、確定した流向をウィンドウ300に表示する(ステップ209)。
【0047】
図6は、本発明の実施形態の流域推定プログラム141が提供するGUIの流域推定済みの状態を示す説明図である。
【0048】
流向を示す線(流向ベクトル;flow direction vector)614が地図310上に表示される。それぞれの流向ベクトル614は、下流端(すなわちアイコン321によって指示された地点)に達することが確認できる。また、図5と図6を比較すると、図5の処理済み領域513の内に、流向ベクトル614が生成されることが確認できる。この流向ベクトル614が表示された領域が、下流端に流れ込む水の流域である。
【0049】
図6には、ステップ209において流向を示す情報が表示される例を示した。しかし、ある格子が流域に含まれると判定された場合、その格子が流域に含まれることを示す情報のみが地図310上に表示されてもよい。少なくとも、ステップ209において、格子を識別する情報(例えば、格子の位置を示す情報)、及び、その格子が流域に含まれることを示す情報が出力される。
【0050】
以上、図2にしたがってPC100によって実行される処理を示すシーケンスについて説明した。流域推定プログラム141は、空間をコンピュータで表現するために変数及び格子を利用する。また、流域推定プログラム141は、格子をコンピュータで効率的に扱うために部分領域を利用する。そこで、流域推定プログラム141が利用する格子、部分領域及び変数を説明する。
【0051】
図7は、本発明の実施形態の流域推定プログラム141が利用する格子及び部分領域を示す説明図である。
【0052】
本実施形態では、空間の東西方向(701)をx軸、南北方向(702)をy軸とする直交座標系(Cartesian coordinate system)を利用する。さらにこの空間をx軸及びy軸に平行な格子線(図中の細線、例えば格子線703)で分割する。格子線のx軸方向の間隔(704)をdx、y軸方向の間隔(705)をdyとする。格子線で囲まれた正方形(又は長方形)の領域が格子である。
【0053】
格子は、その格子の位置を示す情報(例えば、座標(i,j))によって識別されてもよい。地点(x,y)を含む格子(i,j)は以下の式で求められる。
【0054】
i=floor(x/dx), j=floor(y/dy) ・・・(1)
ただし、floor()は、括弧内の値の小数部分を切り捨てることによって、括弧内の値の整数部分のみを取得する関数である。
【0055】
さらに本実施形態では、空間をx軸及びy軸に平行な部分領域線(図中の太線、例えば部分領域線706)で分割する。部分領域線のx軸方向の間隔(707)をsi*dx、y軸方向の間隔(708)をsj*dyとする。ただし、si及びsjは1以上の整数である。それぞれの格子は1つの部分領域に属することになる。
【0056】
格子(i,j)が属する部分領域(bi,bj)は以下の式で求められる。
【0057】
bi=floor(i/si), bj=floor(j/sj) ・・・(2)
部分領域(bi,bj)に属する格子は以下の式を満たす格子(i,j)である。
【0058】
bi*si<=i<(bi+1)*si, bj*sj<=j<(bj+1)*sj ・・・(3)
それぞれの格子には、図8に示す変数が割り当てられる。
【0059】
図8は、本発明の実施形態の格子(i,j)に割り当てられる変数の説明図である。
【0060】
各格子には、少なくとも図8に示した情報、すなわち、標高(810)、最大勾配方向配列(820)、流向候補配列(830)及び流域フラグ(850)が割り当てられる。言い換えると、格子ごとに、図8に示す情報が生成され、メモリ120に保持される。
【0061】
説明のために、それぞれの変数に名前をつける。標高(810)は変数Glev、最大勾配方向配列(820)は配列DownDir0、流向候補配列(830)は配列DownDir1、流域フラグ(850)は変数IsBasinにそれぞれ格納される。
【0062】
なお、上記のような変数が格納される代わりに、図8で示した各変数と同等の情報がコンピュータに格納されてもよい。たとえば、変数に別の名前をつけてもよい。
【0063】
標高(810)は、格子の標高値を格納するための変数である。
【0064】
格子ごとの標高値に基づいて、格子ごとの勾配を算出することができる。
【0065】
図9は、本発明の実施形態において算出される勾配の説明図である。
【0066】
格子(i,j)における勾配は、格子(i,j)の標高値とその格子に隣接する格子における標高値との差を格子間の距離で割った値である。1格子に隣接する格子は8ある。したがって、格子(i,j)における勾配の方向は8ある。すなわち、東、北東、北、北西、西、南西、南、南東である。勾配の方向をそれぞれ方向901から方向908の矢印で示す。説明のために、格子900における8方向の勾配を、変数Grad1からGrad8と記載する。
【0067】
変数Grad1からGrad8の値は、以下式によって求められる。
【0068】
Grad1=(Glev[i,j]-Glev[i-1,j+1])/hypot(dx,dy) ・・・(4−1)
Grad2=(Glev[i,j]-Glev[i,j+1])/dy ・・・(4−2)
Grad3=(Glev[i,j]-Glev[i+1,j+1])/hypot(dx,dy) ・・・(4−3)
Grad4=(Glev[i,j]-Glev[i-1,j])/dx ・・・(4−4)
Grad5=(Glev[i,j]-Glev[i+1,j])/dx ・・・(4−5)
Grad6=(Glev[i,j]-Glev[i-1,j-1])/hypot(dx,dy) ・・・(4−6)
Grad7=(Glev[i,j]-Glev[i,j-1])/dy ・・・(4−7)
Grad8=(Glev[i,j]-Glev[i+1,j-1])/hypot(dx,dy) ・・・(4−8)
ただし、Glev[i,j]は格子(i,j)における勾配、hypot(x,y)は原点(0,0)と点(x,y)との距離を返す関数である。
【0069】
上記の式によって算出された変数Grad1からGrad8の値は、格子(i,j)から、その格子の周囲に隣接する8個の格子へ向かう方向の下り勾配を示す。例えば、格子(i,j)から格子(i−1,j+1)に向かう方向の勾配が下りである(すなわち、格子(i,j)の標高より格子(i−1,j+1)の標高が低い)場合、変数Grad1の値は正となる。そして、その下り勾配が急である(すなわち、格子(i,j)の標高と格子(i−1,j+1)の標高との差が大きい)ほど、変数Grad1の値は大きくなる。
【0070】
なお、本実施形態では、格子と、その格子に隣接する8格子との間の勾配が計算される。しかし、格子と、その格子の東西方向及び南北方向に隣接する4格子との間の勾配が計算されてもよい。その場合は、上記8方向の勾配変数のうちGrad2、Grad4、Grad5及びGrad7のみが使用される。ただし、勾配が計算される隣接格子の数が増えるほど、精度のよい結果が期待できる。
【0071】
図8に示した最大勾配方向配列DownDir0(820)は、これら8方向の変数(Grad1からGrad8)のうち、値が最大である変数に対応する方向を保持する配列である。すなわち、配列DownDir0に格納できる要素は、東、北東、北、北西、西、南西、南及び南東の8方向のうち少なくとも一つを識別するための情報であり、要素の数(配列サイズ)は0から8のいずれかである。この配列の初期値は、要素数0を示す状態であるemptyである。一つの格子について計算されたGrad1からGrad8のうち、値が最大であるものが複数存在する場合、複数の方向を識別する値が最大勾配方向配列DownDir0(820)に保持される。
【0072】
流向候補配列DownDir1(830)は、最大勾配方向配列DownDir0(820)に格納された要素のうち、さらに別の基準を満たす要素のみを保持する配列である。この配列の初期値は、要素数0を示す状態であるemptyである。流向候補配列DownDir1(830)に保持される要素については、後に図15を参照して詳述する。
【0073】
流域フラグ(850)は、その格子が流域に含まれるか否かを判別した結果を格納する変数である。この変数の値は、true又はfalseのいずれかとなる。trueは格子が流域に含まれることを、falseは格子が流域に含まれないことを示す。この変数の初期値が、falseである。
【0074】
それぞれの格子に対応する、図8に示す変数が、メモリ120に展開される。格子の数は、極めて多くなる場合がある。その場合、メモリ120に展開される変数が非常に多くなる。変数の展開を効率的に行うためには、変数の実装をコンピュータの構造に適した設計にする必要がある。本発明では、格子をコンピュータで効率的に扱うために、部分領域にゴーストセル(ghost cell)を追加する。
【0075】
図10は、本発明の実施形態のメモリ120に展開された状態の部分領域を説明するための図である。
【0076】
部分領域には、ゴーストセルが付加される。図においてゴーストセルは斜線でハッチングされた格子である。一方、ドットで網掛けされた格子は、部分領域に含まれる格子(すなわち内部セル)である。
【0077】
ある部分領域に付加されたゴーストセルは、その部分領域に隣接する部分領域に属する内部セルのコピーである。図10には、(bi,bj)=(0,0)を満たす部分領域1010及び(bi,bj)=(1,0)を満たす部分領域1020が書かれている。部分領域1020に付加されたゴーストセル1021は、部分領域1010に含まれる内部セル1011のコピーである。同様に、部分領域1010に付加されたゴーストセル1012は、部分領域1020に含まれる内部セル1022のコピーである。このように、全てのゴーストセルは対応する内部セルのコピーである。
【0078】
部分領域(bi,bj)に含まれる内部セルは、前述したとおり(3)式を満たす格子である。
【0079】
部分領域(bi,bj)に付加されたゴーストセルは、(3)式を満たさず、かつ以下の(5)式を満たす格子である。
【0080】
bi*si-mi<=I<(bi+1)*si+mi, bj*sj-mj<=j<(bj+1)*sj+mj ・・・(5)
mi及びmjは1以上の整数である。これらの数は、部分領域の内部セルにおける変数を求めるために参照される必要がある格子が、ゴーストセルとしてその部分領域に付加されるように定められる。本実施形態においては、mi=1,mj=1とした。これは、ある格子の勾配を計算するために、その格子に隣接する8格子の標高値を参照する必要があるためである。ゴーストセルの標高値を参照しなければ、部分領域の端に位置する内部セルの勾配を算出することができない。しかし、mi=1,mj=1とすれば、一つの部分領域の内部セル及びその部分領域に付加されたゴーストセルの標高値に基づいて、その部分領域の全内部セルの勾配を計算することができる。
【0081】
このように、部分領域にゴーストセルが付加される場合、部分領域の内部セルを処理するために必要な情報が全てその部分領域及びゴーストセルに含まれる。このことは、複数の部分領域を並列処理することを可能にする。したがって、ゴーストセルが付加された部分領域を利用することで、プログラムの効率が向上することが期待できる。
【0082】
以上、図7から図10を使って、流域推定プログラム141の処理で使用される格子、部分領域、及び変数を説明した。続いて、流域推定プログラム141における流向算出処理(ステップ204)の詳細を説明する。
【0083】
図11は、本発明の実施形態の流域推定プログラム141の流向算出処理(ステップ204)を示すフローチャートである。
【0084】
まず、ステップ1101において、CPU130は、下流端を含む格子を現在の検査対象として指定する。下流端は地図310に入力される(図3参照)。CPU130は、下流端の位置情報を地図310における座標系から直交座標系に変換する。続いてCPU130は、(1)式によって直交座標(x,y)を格子(i,j)に変換する。CPU130は、この格子(i,j)に関する情報を現在の検査対象としてメモリ120に記憶する。現在の検査対象を記憶するための配列を、ここではCurCellsと記載する。
【0085】
ステップ1102において、CPU130は、現在の検査対象の格子を含む部分領域を読み込む。このとき、図10に示すように、ゴーストセルも読み込まれ、部分領域に付加される。このステップの詳細を後述する図12及び図13で説明する。
【0086】
ステップ1103において、CPU130は、処理済み領域をウィンドウ300に出力する(図4、図5参照)。この処理は、すでに図2で説明したステップ206に相当する。
【0087】
ステップ1104において、CPU130は、部分領域に付加されたゴーストセルの同期を行う。このステップ1104の詳細を後述する図16で説明する。
【0088】
ステップ1105において、CPU130は、現在の検査対象の上流の格子を次の検査対象として記憶する。具体的には、CPU130は、配列CurCellsに格納された格子に隣接し、かつその格子の上流に位置する格子を次の検査対象としてメモリ120に記憶する。次の検査対象を記憶するための配列を、ここではNextCellsと記載する。このステップ1105の詳細を後述する図15で説明する。
【0089】
ステップ1106において、CPU130は、次の検査対象を現在の検査対象として新たに指定する。具体的には、CPU130は、配列CurCellsを空にした後、配列NextCellsの全ての要素を配列CurCellsに格納する。さらに、CPU130は、配列NextCellsを空にする。
【0090】
ステップ1107において、CPU130は、現在の検査対象の要素数が0より大か否かを判定する。具体的には、配列CurCellsの要素数と0とが比較される。
【0091】
ステップ1107の結果が真である場合、現在の検査対象の格子の上流の格子が存在する可能性がある。この場合、処理はステップ1102に戻る。一方、ステップ1107の結果が偽である場合、前回のステップ1105において、配列NextCellsに追加された格子が存在しない。すなわち、現在までに検出された流域の上流の格子が存在しない。この場合、上流の探索が終了し、処理は図2に示したステップ208に進む。
【0092】
このように、ステップ1102からステップ1107の処理によって、現在の検査対象の格子に隣接し、かつ上流にある格子が検査対象として指定される。また、ステップ1105において現在の検査対象の格子の上流の格子が存在する限りステップ1102からステップ1107が繰り返される。したがって、図11に示したステップによって、一つの流域に含まれる下流端から上流までに位置する全ての格子が、必ず一度検査対象として指定される。
【0093】
図12は、本発明の実施形態の部分領域読み込み処理(ステップ1102)の詳細を示す第1のフローチャートである。
【0094】
ステップ1201において、CPU130は、現在の検査対象として指定された全ての格子についてステップ1202からステップ1208までの処理を繰り返す。具体的には、CPU130は、現在の検査対象として指定された格子のうち一つを選択し、選択された格子についてステップ1202から1208までの処理を実行する。この選択された格子は、図12の説明において対象格子と記載される。現在の検査対象として指定された全ての格子についてステップ1202から1208までの処理が終了するまで、上記の選択及び処理が繰り返される。
【0095】
ステップ1202において、CPU130は、対象格子を含む部分領域の識別子(部分領域ID)を算出する。部分領域IDとして、式(2)によって算出される部分領域の座標(bi,bj)が使用される。格子(i,j)を含む部分領域座標(bi,bj)の算出方法は式(2)に示した。算出された部分領域IDは、図12の説明において対象部分領域IDと記載される。対象部分領域IDによって識別される部分領域は、図12の説明において対象部分領域と記載される。
【0096】
ステップ1203において、CPU130は、対象部分領域IDが配列Domainに含まれているか否かを判定する。この配列Domainは、ステップ1204以下のステップが実行された部分領域IDを記憶するための配列であり、要素数は0以上である。ステップ1203の結果が真であれば、対象部分領域について、既にステップ1204以降の処理が実行されている。この場合、処理はステップ1209に進む。ステップ1203の結果が偽であれば、処理はステップ1204以下に進む。
【0097】
ステップ1204において、CPU130は、対象部分領域IDを配列Domainに追加する。
【0098】
ステップ1205において、CPU130は、対象部分領域から所定の距離内にある部分領域をメモリ120に展開する。したがって、少なくとも対象部分領域と、対象部分領域に隣接する部分領域がメモリ120に展開される。具体的には、それらの部分領域に属する内部セル及びそれらに付加されたゴーストセルのデータ(図8参照)がメモリ120に格納される。対象部分領域に隣接する部分領域とは、東西方向3列、南北方向3列の9個の部分領域である。それらの9個の部分領域の中心が対象部分領域である。
【0099】
なお、後述するように、窪地を埋める処理によって、格子の標高値が変更される場合がある。しかし、対象部分領域から上記の所定の距離より遠くにある窪地を埋めても、対象部分領域の標高は変更されない。これは、窪地を埋める処理において、窪地の面積が所定の値を超えた場合には窪地の標高値が変更されないためである。この処理については後述する(図14参照)。
【0100】
上記の所定の距離は、その土地にあった値に設定されることが望ましい。たとえば降雨量が多く土地の浸食の激しい日本では、この所定の距離を1km程度にするのが適当と考えられる。逆に、降雨量が少なく土地の浸食が緩やかな米国中西部では、この所定の距離を10km程度にするのが適当と考えられる。部分領域の詳細は上記図10にて説明した。
【0101】
ステップ1206において、CPU130は、標高データ192を読み出す。この処理はすでに図2でステップ205として説明した。CPU130は、読み出した標高データのうち、ステップ1205において展開された部分領域に属する格子の標高データを、その格子の標高Glev(810)に代入する。
【0102】
ステップ1207において、CPU130は、最大勾配方向を算出する。勾配についてはすでに図9で説明した。各方向の勾配は、式(4−1)から式(4−8)によって算出される。CPU130は、算出した8方向の勾配の最大値に対応する勾配方向を最大勾配方向配列DownDir0(820)に格納する。
【0103】
ステップ1208において、CPU130は、最大勾配の値が0以下である格子を初期値として、窪地データを生成する。さらに、CPU130は、生成した窪地データを配列Sinksに格納する。ここで、配列Sinksは窪地データを記憶するための配列である。
【0104】
図17は、本発明の実施形態の窪地データの詳細を示す説明図である。
【0105】
窪地データは、現在の標高(1710)、新しい標高(1720)、格子配列(1730)、隣接格子配列(1740)及び窪地埋め終了フラグ(1750)からなる。説明のため、これらをそれぞれGlevCur、GlevNew、Cells、Neibs及びIsFinishと記載する。
【0106】
格子配列Cellsは、窪地に含まれる格子を識別する情報を格納する配列である。
【0107】
隣接格子配列Neibsは、窪地に含まれる格子に隣接する格子を識別する情報を格納する配列である。より詳細には、隣接格子配列Neibsには、窪地に含まれる各格子に隣接する全ての格子を識別する情報のうち、格子配列Cellsに含まれないものが格納される。
【0108】
格子配列Cells及び隣接格子配列Neibsの初期値は、要素のないempty状態である。この窪地データの初期化は、1つの格子theCellを与えることによって実行される。ここで与えられるtheCellは、窪地の底に相当する格子である。
【0109】
現在の標高GlevCurは、窪地内の格子の標高値の候補を格納する変数である。現在の標高GlevCurの初期値は、その格子theCellの標高である。
【0110】
新しい標高GlevNewは、窪地内の格子の標高値の候補となる可能性がある値を一時的に格納する変数である。
【0111】
格子配列Cellsには、初期値として、その格子theCellが格納される。
【0112】
窪地埋め終了フラグIsFinishの初期値は、窪地を埋める処理(図14参照)が終了していないことを示す偽(false)である。この値は、窪地を埋める処理が終了すると、真(true)に更新される。
【0113】
図17に示すデータの一組が、配列Sinksの一要素に相当する。
【0114】
再び図12に戻り説明する。ステップ1209において、ステップ1201のループが完了するまで処理はステップ1201に戻る。ステップ1201のループが完了した場合、処理は図13に示したステップ1301に進む。
【0115】
図12の例では、ステップ1205において、対象格子を含む部分領域及びその周囲の一つ以上の部分領域のデータがメモリ120に格納される。しかし、図12は一例であり、メモリ120に格納されるデータ量がより多く(又はより少なく)なるように制御されてもよい。
【0116】
少なくとも、対象格子に流入する水の流向を算出するためには、対象格子の周囲に隣接する8個の格子の最大勾配方向を算出する必要がある。対象格子が格子(i,j)である場合、対象格子の周囲に隣接する8個の格子とは、x=i−1、i又はi+1、y=j−1、j又はj+1を満たす9個の格子(x、y)のうち、対象格子を除く8個の格子である。
【0117】
対象格子の周囲に隣接する8個の格子の最大勾配方向を算出するためには、対象格子の標高値、及び、対象格子の周囲に隣接する8個の格子の標高値に加えて、対象格子の周囲に隣接する8個の格子のさらに周囲に隣接する16個の格子の標高値を取得する必要がある。対象格子が格子(i,j)である場合、上記の16個の格子は、x=i−2、i−1、i、i+1又はi+2、y=j−2、j−1、j、j+1又はj+2を満たす25個の格子(x、y)のうち、対象格子及び対象格子に隣接する8個の格子を除く16個の格子である。
【0118】
このため、ステップ1205において、少なくとも、対象格子、対象格子の周囲に隣接する8個の格子、及び、それらの8個の格子の周囲に隣接する16個の格子からなる25個の格子のデータがメモリ120に格納される必要がある。
【0119】
図13は、本発明の実施形態の部分領域読み込み処理(ステップ1102)の詳細を示す第2のフローチャートである。
【0120】
ステップ1301において、CPU130は、配列Sinks内の窪地データについてステップ1302からステップ1305までの処理を繰り返す。
【0121】
ステップ1302において、CPU130は、窪地を埋める処理を実行する。この処理の詳細を後述する図14にて説明する。窪地を埋める処理によって、窪地を埋める処理が終了したことを示す窪地埋め終了フラグIsFinish(1750)が変化する。
【0122】
ステップ1304において、CPU130は、窪地埋め終了フラグIsFinishが真であるか否かを判定する。窪地埋め終了フラグIsFinishが真の場合、窪地を埋める処理が終了している。この場合、処理はステップ1305に進む。一方、窪地埋め終了フラグIsFinishが偽の場合、窪地を埋める処理が終了していない。この場合、処理はステップ1306に進む。
【0123】
ステップ1305において、CPU130は、窪地を埋める処理が終了した窪地データを配列Sinkから削除する。
【0124】
ステップ1306において、CPU130は、ステップ1301のループが完了するまでステップ1301に戻る。
【0125】
ステップ1307において、CPU130は、ステップ1207と同じ処理(最大勾配方向の算出)を再び実行する。このステップ1307でステップ1207と同じ処理を再び行う理由は、ステップ1302の窪地埋め処理によって格子の標高値が変更されたためである。すなわち、ステップ1307において、変更された標高値を用いて最大勾配方向が算出される。
【0126】
図14は、本発明の実施形態の窪地を埋める処理(ステップ1302)の詳細を示すフローチャートである。
【0127】
まず、ステップ1401において、CPU130は、配列Cells内の格子に隣接する格子を配列Neibsに格納する。
【0128】
ステップ1402において、CPU130は、窪地を埋めるために必要な標高データがメモリに展開されているか否かを判定する。具体的には、CPU130は、配列Neibs内の全ての格子がメモリ120に展開されているか否かを判定する。これは、配列Neibs内の格子(i,j)を含む部分領域(bi,bj)を(2)式によって求め、その値が配列Domainに含まれているか否かを判定することによって実行される。
【0129】
ステップ1402の判定の結果が真であれば、この処理をさらに進めるためステップ1403に進む。判定の結果が偽であれば、窪地埋め処理を実行するために必要な標高データの少なくとも一部がまだメモリ120に展開されていない。この場合、この窪地埋め処理を保留するため、処理は図13のステップ1304に進む。
【0130】
ステップ1403において、CPU130は、配列Neibs内の格子で最低の標高値を変数GlevNewに格納する。
【0131】
ステップ1404において、CPU130は、窪地を埋める処理が終了したか否かを判定する。これは、条件式GlevNew>GlevCurによって判定される。この条件式が真であれば、窪地を埋める処理は終了していないためステップ1408に進む。偽であれば窪地を埋める処理は終了したためステップ1405に進む。
【0132】
ステップ1405において、CPU130は、配列Cells内の格子の標高をGlevCurに書き換える。
【0133】
ステップ1406において、CPU130は、窪地埋め終了フラグIsFinishをtrueにし、この窪地埋め処理を終了するため図13のステップ1304に進む。
【0134】
ステップ1408において、CPU130は、現在の標高GlevCurに新しい標高GlevNewの値を代入する。
【0135】
ステップ1409において、CPU130は、変数GlevCurの値と等しい標高の格子を配列Cellsに追加する。
【0136】
ステップ1410において、CPU130は、窪地の大きさ(例えば面積)が所定の基準値よりも小さいか否かを判定する。窪地の面積が所定の基準値よりも大きい場合、その窪地は、標高の誤差に起因する窪地ではなく、実際にその場所に存在する窪地であるとみなされる。この基準値は、その土地にあった値に設定するとよい。たとえば降雨量が多く土地の浸食の激しい日本ではこの基準値を1平方キロメートル程度にするのが適当と考えられる。逆に、降雨量が少なく土地の浸食が緩やかな米国中西部では、この基準値を10平方キロメートル程度にするのが適当と考えられる。
【0137】
このステップ1410は、実際には、Cellsの要素数が、上記の所定の基準値を格子の面積で割った値より小さいか否かを判定することによって実行されてもよい。あるいは、ステップ1410の判定基準として窪地の面積ではなく、窪地の体積が用いられてもよい。ただし、判定基準として面積を使った方が、CPU130の負荷は軽くなる。
【0138】
窪地の体積は、窪地に含まれる各格子の深さを格子の面積に乗算した値を合計することによって算出される。各格子の深さは、各格子の現在の標高GlevCurからその格子の標高Glevを減算することによって算出される。
【0139】
このステップ1410の判別結果が真であれば、窪地は地形データの誤差に起因すると見なされるため、処理はステップ1401に戻る。ステップ1410の判別結果が偽であれば、窪地は実際の地形に起因すると見なされるため、処理はステップ1411に進む。
【0140】
ステップ1411において、CPU130は、窪地埋め終了フラグIsFinishをtrueにし、この窪地埋め処理を終了するため図13のステップ1304に進む。
【0141】
上記のように、ステップ1404の判定結果が偽(すなわちNo)であった場合、窪地内の格子の標高が変更され、確定する。ステップ1410の判定結果が偽であった場合、窪地内の格子の標高が変更されないことが確定する。
【0142】
一方、ステップ1402の判定結果が偽であった場合、窪地埋め処理が保留される。すなわち、この場合、窪地内の格子の標高がまだ確定しない。その後、図12のステップ1205において、新たな部分領域がメモリ120に展開されると、ステップ1402の判定結果が真(すなわちYes)となり、窪地内の格子の標高を確定させるための処理が続行される。
【0143】
しかし、ステップ1307が実行される時点で、最大勾配方向が算出される格子及びその格子に隣接する格子の標高が確定している必要がある。言い換えると、ステップ1301から1306までのループが終了した時点で、少なくとも、現在の検査対象の格子を含む部分領域内の全ての格子の標高が確定している必要がある。この確定のために、ステップ1205において、ステップ1410の基準値が示す面積より十分に広い範囲の部分領域がメモリ120に展開される必要がある。
【0144】
具体的には、ステップ1205において、対象部分領域内の格子から半径r(m)以内の全ての格子がメモリ120に展開される必要がある。ここで、ステップ1410の基準値がA(平方m)、一格子が1辺dx(m)の正方形である(すなわちdxとdyが等しい)場合、半径rは、次の式(6)を満たす必要がある。
【0145】
r≧A/dx・・・(6)
上記の条件が満たされる場合、対象部分領域内の格子を含み、かつ、面積が基準値A以内である窪地は、それがどのような形状であっても、ステップ1205において展開された部分領域の中に含まれる。したがって、この場合、対象部分領域の少なくとも一部の格子が窪地に含まれていても、その対象部分領域内の全ての格子の標高は、ステップ1307が実行される時点で全て確定している。
【0146】
図15は、本発明の実施形態の上流探索処理(ステップ1105)の詳細を示すフローチャートである。
【0147】
ステップ1501において、CPU130は、配列CurCell内の格子について以降の処理を繰り返す。図15において、ステップ1501から1507までのループの処理対象の格子を、Cell0と記載する。
【0148】
ステップ1502において、CPU130は、Cell0に隣接する8個の格子について以降の処理を繰り返す。図15において、ステップ1502から1506までのループの処理対象の格子を、Cell1と記載する。したがって、Cell0とCell1とは隣接している。
【0149】
ステップ1503において、CPU130は、Cell1の最大勾配方向にCell0があり、かつ、Cell1の流域フラグ(IsBasin)がFalseであるか否かを判定する。Cell1の最大勾配方向にCell0がある場合、そのCell1から流出した水がCell0に流入すると推定される。Cell1の流域フラグ(IsBasin)がFalseである場合、そのCell1がどの流域に属するかまだ確定していない。
【0150】
ステップ1503の判定の結果が真の場合、Cell1とCell0とが一つの流域に含まれる。この場合、処理はステップ1504に進む。
【0151】
一方、判定の結果が偽の場合(すなわち、Cell1の最大勾配方向にCell0がないか、又は、Cell0の流域フラグ(IsBasin)がTrueである場合)、処理はステップ1506に進む。
【0152】
ステップ1504において、CPU130は、Cell1の流向候補配列(DownDir1)にCell0の方向を追加する。たとえば、Cell0がCell1の北西方向にあれば、その方向が流向の候補として配列に追加される。
【0153】
ステップ1505において、CPU130は、Cell1の流域フラグ(IsBasin)を真にする。
【0154】
ステップ1506において、CPU130は、ステップ1502のループが完了するまでステップ1502に戻る。
【0155】
ステップ1502からステップ1506までのループが完了した時点で、Cell1の流向候補配列(DownDir1)に含まれる流向候補が確定する。例えば、ステップ1504において、Cell0がCell1の北西方向にある場合、その方向(北西方向)がCell1の流向の候補として追加される。そして、ループが完了すると、この流向が確定する。流向の確定は、以下のようにすればよい。流向候補配列DownDir1に1つの方向が格納されている場合、その方向を流向として確定する。流向候補配列DownDir1に2以上の方向が格納されている場合、あらかじめ決めた方法にしたがって1つの方向を選択する。選択する方法は、乱数により決めてもいいし、あらかじめ決めた優先度(たとえば、東、北東、北、北西、西、南西、南、南東の順に優先して選択する)に従って決めてもよい。Cell1の水がCell0に流出する場合、Cell0とCell1とが一つの流域に含まれると判定される。このCell1は、Cell0の次の検査対象として選択される。すなわち、このCell1は、配列NextCellsに追加され、図11のステップ1106において、現在の検査対象として新たに選択される。
【0156】
ステップ1507において、CPU130は、ステップ1501のループが完了するまでステップ1501に戻る。
【0157】
図16は、本発明の実施形態の部分領域に付加されたゴーストセルの同期処理(ステップ1104)の詳細を示すフローチャートである。
【0158】
ステップ1601において、CPU130は、配列Domain内の部分領域について以降の処理を繰り返す。
【0159】
ステップ1602において、CPU130は、部分領域に付加されたすべてのゴーストセルについて以降の処理を繰り返す。
【0160】
ステップ1603において、CPU130は、ゴーストセルに対応する内部セルの変数値をコピーする。例えば、図10のゴーストセル1012についてステップ1603が実行される場合、ゴーストセル1012に対応する内部セル1022の変数値(すなわち、図8に示す各変数の値)がゴーストセル1012にコピーされる。その結果、内部セル1022の標高値が窪地埋め処理によって変更された場合、その変更がゴーストセル1012に反映される。
【0161】
ステップ1604において、CPU130は、ステップ1602のループが完了するまでステップ1602に戻る。
【0162】
ステップ1605において、CPU130は、ステップ1601のループが完了するまでステップ1601に戻る。
【0163】
以上述べたとおり、本発明の実施形態によれば、流域に関する事前知識を要求としない、流域推定コンピュータプログラムを提供することができる。このプログラムを使用することによって、コンピュータが使えるユーザであれば、専門家と同等の品質の流域推定が可能になる。
【図面の簡単な説明】
【0164】
【図1】本発明の実施形態におけるコンピュータシステムの構成を示す概略ブロック図である。
【図2】本発明の実施形態のPCによって実行される処理を示すシーケンス図である。
【図3】本発明の実施形態の流域推定プログラムが提供するGUIの入力待ちの状態を示す説明図である。
【図4】本発明の実施形態の流域推定プログラムが提供するGUIの解析中の状態を示す第1の説明図である。
【図5】本発明の実施形態の流域推定プログラムが提供するGUIの解析中の状態を示す第2の説明図である。
【図6】本発明の実施形態の流域推定プログラムが提供するGUIの流域推定済みの状態を示す説明図である。
【図7】本発明の実施形態の流域推定プログラムが利用する格子及び部分領域を示す説明図である。
【図8】本発明の実施形態の格子に割り当てられる変数の説明図である。
【図9】本発明の実施形態において算出される勾配の説明図である。
【図10】本発明の実施形態のメモリに展開された状態の部分領域を説明するための図である。
【図11】本発明の実施形態の流域推定プログラムの流向算出処理を示すフローチャートである。
【図12】本発明の実施形態の部分領域読み込み処理の詳細を示す第1のフローチャートである。
【図13】本発明の実施形態の部分領域読み込み処理の詳細を示す第2のフローチャートである。
【図14】本発明の実施形態の窪地を埋める処理の詳細を示すフローチャートである。
【図15】本発明の実施形態の上流探索処理の詳細を示すフローチャートである。
【図16】本発明の実施形態の部分領域に付加されたゴーストセルの同期処理の詳細を示すフローチャートである。
【図17】本発明の実施形態の窪地データの詳細を示す説明図である。
【図18】DEMの誤差の影響を説明するための図である。
【符号の説明】
【0165】
100 PC
310 地図
321 下流端を示すアイコン
413、513 処理済み領域
614 流向ベクトル
703 格子線
706 部分領域線
1010、1020 部分領域
【特許請求の範囲】
【請求項1】
計算機を制御するプログラムであって、
前記計算機は、前記プログラムが格納されるメモリと、前記メモリに格納された前記プログラムを実行するプロセッサと、を備え、
前記プログラムは、
地図上の地点を指示する入力を受け付ける第1手順と、
前記地図を互いに直交して設定された第1軸及び第2軸に平行にそれぞれ等間隔に区切る線によって囲まれた格子のうち、前記入力によって指定された地点を含む格子を、処理対象である第1格子として選択する第2手順と、
前記第1格子を含む第1領域内の格子に対して定められた標高値を前記メモリに格納する第3手順と、
前記第1領域内の窪地を検出する第4手順と、
前記検出された窪地に含まれる格子の標高値を、前記窪地に含まれる格子に隣接する一つの格子の標高値に変更する第5手順と、
前記第1領域内の格子の標高値に基づいて、前記第1領域内の格子のうち、前記第1格子に隣接する第2格子から流出する水の流向を判定する第6手順と、
前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子と前記第1格子とが一つの流域に含まれると判定する第7手順と、
前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子を、処理対象である第1格子として新たに選択する第8手順と、
前記第1格子として新たに選択された格子が前記一つの流域に含まれることを示す情報を出力する第9手順と、を前記プロセッサに実行させることを特徴とするプログラム。
【請求項2】
前記第1領域は、少なくとも、前記第1格子の周囲に隣接する8個の前記第2格子、及び、前記8個の第2格子の周囲に隣接する16個の格子を含むことを特徴とする請求項1に記載のプログラム。
【請求項3】
前記第4手順は、前記第1領域内の格子の標高値が、その格子に隣接する8個の格子のうち最も標高が低い格子の標高値以下である場合、その格子を含む窪地を検出する手順を含み、
前記第5手順は、
前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子が、前記第1領域に含まれ、かつ、前記検出された窪地の大きさが所定の閾値を超えない場合に、前記検出された窪地に含まれる格子の標高値を変更すると判定する手順と、
前記検出された窪地に含まれる格子の標高値を変更すると判定された場合、前記検出された窪地に含まれる全ての格子の標高値を、前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子の標高値のうち最も低い値に変更する手順と、を含むことを特徴とする請求項1に記載のプログラム。
【請求項4】
前記第5手順は、さらに、
前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子の標高値のうち最も低い値を、前記窪地に含まれる全ての格子の標高値の候補として前記メモリに保持する手順と、
前記検出された窪地の大きさが前記所定の閾値を超えた場合、前記標高値の候補を前記メモリから削除する手順と、を含み、
前記格子の標高値の候補が保持されている場合、前記第4手順において、前記保持されている標高値の候補が前記格子の標高値として使用されることを特徴とする請求項3に記載のプログラム。
【請求項5】
前記検出された窪地の大きさは、前記検出された窪地の面積又は前記検出された窪地の体積であることを特徴とする請求項3に記載のプログラム。
【請求項6】
前記第6手順は、
前記第2格子の標高値から、前記第2格子に隣接する8個の各格子の標高値を減算した値を、前記第2格子と前記第2格子に隣接する各格子との間の距離で除算することによって、前記第2格子から前記第2格子に隣接する各格子への下り勾配の値を算出する手順と、
前記第2格子から前記第1格子への下り勾配の値が、前記第2格子に隣接する8個の各格子への下り勾配の値の最大値である場合、前記第2格子から流出する水が前記第1格子へ流れると判定する手順と、を含むことを特徴とする請求項1に記載のプログラム。
【請求項7】
前記第9手順は、前記第1格子として新たに選択された格子から流出する水の流向を示す情報を出力する手順を含むことを特徴とする請求項1に記載のプログラム。
【請求項8】
前記プログラムは、前記第8手順において処理対象である第1格子が新たに選択された場合、さらに前記第3手順から前記第8手順を前記プロセッサに実行させることを特徴とする請求項1に記載のプログラム。
【請求項9】
プログラムが格納されるメモリと、前記メモリに格納された前記プログラムを実行するプロセッサと、を備える計算機であって、
前記プロセッサは、
地図上の地点を指示する入力を受け付ける第1手順と、
前記地図を互いに直交して設定された第1軸及び第2軸に平行にそれぞれ等間隔に区切る線によって囲まれた格子のうち、前記入力によって指定された地点を含む格子を、処理対象である第1格子として選択する第2手順と、
前記第1格子を含む第1領域内の格子に対して定められた標高値を前記メモリに格納する第3手順と、
前記第1領域内の窪地を検出する第4手順と、
前記検出された窪地に含まれる格子の標高値を、前記窪地に含まれる格子に隣接する一つの格子の標高値に変更する第5手順と、
前記第1領域内の格子の標高値に基づいて、前記第1領域内の格子のうち、前記第1格子に隣接する第2格子から流出する水の流向を判定する第6手順と、
前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子と前記第1格子とが一つの流域に含まれると判定する第7手順と、
前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子を、処理対象である第1格子として新たに選択する第8手順と、
前記第1格子として新たに選択された格子が前記一つの流域に含まれることを示す情報を出力する第9手順と、を実行することを特徴とする計算機。
【請求項10】
前記第1領域は、少なくとも、前記第1格子の周囲に隣接する8個の前記第2格子、及び、前記8個の第2格子の周囲に隣接する16個の格子を含むことを特徴とする請求項9に記載の計算機。
【請求項11】
前記第4手順は、前記第1領域内の格子の標高値が、その格子に隣接する8個の格子のうち最も標高が低い格子の標高値以下である場合、その格子を含む窪地を検出する手順を含み、
前記第5手順は、
前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子が、前記第1領域に含まれ、かつ、前記検出された窪地の大きさが所定の閾値を超えない場合に、前記検出された窪地に含まれる格子の標高値を変更すると判定する手順と、
前記検出された窪地に含まれる格子の標高値を変更すると判定された場合、前記検出された窪地に含まれる全ての格子の標高値を、前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子の標高値のうち最も低い値に変更する手順と、を含むことを特徴とする請求項9に記載の計算機。
【請求項12】
前記第5手順は、さらに、
前記検出された窪地に含まれる全ての格子の周囲に隣接する全て格子の標高値のうち最も低い値を、前記窪地に含まれる全ての格子の標高値の候補として前記メモリに保持する手順と、
前記検出された窪地の大きさが前記所定の閾値を超えた場合、前記標高値の候補を前記メモリから削除する手順と、を含み、
前記格子の標高値の候補が保持されている場合、前記第4手順において、前記保持されている標高値の候補が前記格子の標高値として使用されることを特徴とする請求項11に記載の計算機。
【請求項13】
前記検出された窪地の大きさは、前記検出された窪地の面積又は前記検出された窪地の体積であることを特徴とする請求項11に記載の計算機。
【請求項14】
前記第6手順は、
前記第2格子の標高値から、前記第2格子に隣接する8個の各格子の標高値を減算した値を、前記第2格子と前記第2格子に隣接する各格子との間の距離で除算することによって、前記第2格子から前記第2格子に隣接する各格子への下り勾配の値を算出する手順と、
前記第2格子から前記第1格子への下り勾配の値が、前記第2格子に隣接する8個の各格子への下り勾配の値の最大値である場合、前記第2格子から流出する水が前記第1格子へ流れると判定する手順と、を含むことを特徴とする請求項9に記載の計算機。
【請求項15】
前記第9手順は、前記第1格子として新たに選択された格子から流出する水の流向を示す情報を出力する手順を含むことを特徴とする請求項9に記載の計算機。
【請求項16】
前記プロセッサは、前記第8手順において処理対象である第1格子が新たに選択された場合、さらに前記第3手順から前記第8手順を実行することを特徴とする請求項9に記載の計算機。
【請求項1】
計算機を制御するプログラムであって、
前記計算機は、前記プログラムが格納されるメモリと、前記メモリに格納された前記プログラムを実行するプロセッサと、を備え、
前記プログラムは、
地図上の地点を指示する入力を受け付ける第1手順と、
前記地図を互いに直交して設定された第1軸及び第2軸に平行にそれぞれ等間隔に区切る線によって囲まれた格子のうち、前記入力によって指定された地点を含む格子を、処理対象である第1格子として選択する第2手順と、
前記第1格子を含む第1領域内の格子に対して定められた標高値を前記メモリに格納する第3手順と、
前記第1領域内の窪地を検出する第4手順と、
前記検出された窪地に含まれる格子の標高値を、前記窪地に含まれる格子に隣接する一つの格子の標高値に変更する第5手順と、
前記第1領域内の格子の標高値に基づいて、前記第1領域内の格子のうち、前記第1格子に隣接する第2格子から流出する水の流向を判定する第6手順と、
前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子と前記第1格子とが一つの流域に含まれると判定する第7手順と、
前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子を、処理対象である第1格子として新たに選択する第8手順と、
前記第1格子として新たに選択された格子が前記一つの流域に含まれることを示す情報を出力する第9手順と、を前記プロセッサに実行させることを特徴とするプログラム。
【請求項2】
前記第1領域は、少なくとも、前記第1格子の周囲に隣接する8個の前記第2格子、及び、前記8個の第2格子の周囲に隣接する16個の格子を含むことを特徴とする請求項1に記載のプログラム。
【請求項3】
前記第4手順は、前記第1領域内の格子の標高値が、その格子に隣接する8個の格子のうち最も標高が低い格子の標高値以下である場合、その格子を含む窪地を検出する手順を含み、
前記第5手順は、
前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子が、前記第1領域に含まれ、かつ、前記検出された窪地の大きさが所定の閾値を超えない場合に、前記検出された窪地に含まれる格子の標高値を変更すると判定する手順と、
前記検出された窪地に含まれる格子の標高値を変更すると判定された場合、前記検出された窪地に含まれる全ての格子の標高値を、前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子の標高値のうち最も低い値に変更する手順と、を含むことを特徴とする請求項1に記載のプログラム。
【請求項4】
前記第5手順は、さらに、
前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子の標高値のうち最も低い値を、前記窪地に含まれる全ての格子の標高値の候補として前記メモリに保持する手順と、
前記検出された窪地の大きさが前記所定の閾値を超えた場合、前記標高値の候補を前記メモリから削除する手順と、を含み、
前記格子の標高値の候補が保持されている場合、前記第4手順において、前記保持されている標高値の候補が前記格子の標高値として使用されることを特徴とする請求項3に記載のプログラム。
【請求項5】
前記検出された窪地の大きさは、前記検出された窪地の面積又は前記検出された窪地の体積であることを特徴とする請求項3に記載のプログラム。
【請求項6】
前記第6手順は、
前記第2格子の標高値から、前記第2格子に隣接する8個の各格子の標高値を減算した値を、前記第2格子と前記第2格子に隣接する各格子との間の距離で除算することによって、前記第2格子から前記第2格子に隣接する各格子への下り勾配の値を算出する手順と、
前記第2格子から前記第1格子への下り勾配の値が、前記第2格子に隣接する8個の各格子への下り勾配の値の最大値である場合、前記第2格子から流出する水が前記第1格子へ流れると判定する手順と、を含むことを特徴とする請求項1に記載のプログラム。
【請求項7】
前記第9手順は、前記第1格子として新たに選択された格子から流出する水の流向を示す情報を出力する手順を含むことを特徴とする請求項1に記載のプログラム。
【請求項8】
前記プログラムは、前記第8手順において処理対象である第1格子が新たに選択された場合、さらに前記第3手順から前記第8手順を前記プロセッサに実行させることを特徴とする請求項1に記載のプログラム。
【請求項9】
プログラムが格納されるメモリと、前記メモリに格納された前記プログラムを実行するプロセッサと、を備える計算機であって、
前記プロセッサは、
地図上の地点を指示する入力を受け付ける第1手順と、
前記地図を互いに直交して設定された第1軸及び第2軸に平行にそれぞれ等間隔に区切る線によって囲まれた格子のうち、前記入力によって指定された地点を含む格子を、処理対象である第1格子として選択する第2手順と、
前記第1格子を含む第1領域内の格子に対して定められた標高値を前記メモリに格納する第3手順と、
前記第1領域内の窪地を検出する第4手順と、
前記検出された窪地に含まれる格子の標高値を、前記窪地に含まれる格子に隣接する一つの格子の標高値に変更する第5手順と、
前記第1領域内の格子の標高値に基づいて、前記第1領域内の格子のうち、前記第1格子に隣接する第2格子から流出する水の流向を判定する第6手順と、
前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子と前記第1格子とが一つの流域に含まれると判定する第7手順と、
前記第2格子から流出する水が前記第1格子に流れると判定された場合、前記第2格子を、処理対象である第1格子として新たに選択する第8手順と、
前記第1格子として新たに選択された格子が前記一つの流域に含まれることを示す情報を出力する第9手順と、を実行することを特徴とする計算機。
【請求項10】
前記第1領域は、少なくとも、前記第1格子の周囲に隣接する8個の前記第2格子、及び、前記8個の第2格子の周囲に隣接する16個の格子を含むことを特徴とする請求項9に記載の計算機。
【請求項11】
前記第4手順は、前記第1領域内の格子の標高値が、その格子に隣接する8個の格子のうち最も標高が低い格子の標高値以下である場合、その格子を含む窪地を検出する手順を含み、
前記第5手順は、
前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子が、前記第1領域に含まれ、かつ、前記検出された窪地の大きさが所定の閾値を超えない場合に、前記検出された窪地に含まれる格子の標高値を変更すると判定する手順と、
前記検出された窪地に含まれる格子の標高値を変更すると判定された場合、前記検出された窪地に含まれる全ての格子の標高値を、前記検出された窪地に含まれる全ての格子の周囲に隣接する全ての格子の標高値のうち最も低い値に変更する手順と、を含むことを特徴とする請求項9に記載の計算機。
【請求項12】
前記第5手順は、さらに、
前記検出された窪地に含まれる全ての格子の周囲に隣接する全て格子の標高値のうち最も低い値を、前記窪地に含まれる全ての格子の標高値の候補として前記メモリに保持する手順と、
前記検出された窪地の大きさが前記所定の閾値を超えた場合、前記標高値の候補を前記メモリから削除する手順と、を含み、
前記格子の標高値の候補が保持されている場合、前記第4手順において、前記保持されている標高値の候補が前記格子の標高値として使用されることを特徴とする請求項11に記載の計算機。
【請求項13】
前記検出された窪地の大きさは、前記検出された窪地の面積又は前記検出された窪地の体積であることを特徴とする請求項11に記載の計算機。
【請求項14】
前記第6手順は、
前記第2格子の標高値から、前記第2格子に隣接する8個の各格子の標高値を減算した値を、前記第2格子と前記第2格子に隣接する各格子との間の距離で除算することによって、前記第2格子から前記第2格子に隣接する各格子への下り勾配の値を算出する手順と、
前記第2格子から前記第1格子への下り勾配の値が、前記第2格子に隣接する8個の各格子への下り勾配の値の最大値である場合、前記第2格子から流出する水が前記第1格子へ流れると判定する手順と、を含むことを特徴とする請求項9に記載の計算機。
【請求項15】
前記第9手順は、前記第1格子として新たに選択された格子から流出する水の流向を示す情報を出力する手順を含むことを特徴とする請求項9に記載の計算機。
【請求項16】
前記プロセッサは、前記第8手順において処理対象である第1格子が新たに選択された場合、さらに前記第3手順から前記第8手順を実行することを特徴とする請求項9に記載の計算機。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【公開番号】特開2009−163621(P2009−163621A)
【公開日】平成21年7月23日(2009.7.23)
【国際特許分類】
【出願番号】特願2008−2284(P2008−2284)
【出願日】平成20年1月9日(2008.1.9)
【出願人】(000233044)株式会社日立エンジニアリング・アンド・サービス (276)
【公開日】平成21年7月23日(2009.7.23)
【国際特許分類】
【出願日】平成20年1月9日(2008.1.9)
【出願人】(000233044)株式会社日立エンジニアリング・アンド・サービス (276)
[ Back to top ]