説明

流域抽出プログラムおよび流域抽出装置

【課題】あらかじめ流域を知らないユーザが使用しても正しい流域を抽出できるコンピュータプログラムを提供する。
【解決手段】コンピュータを制御する流域抽出プログラムであって、前記コンピュータは地図上の複数の領域の標高を示す標高データを保持し、前記複数の領域は、第1領域を含み、前記流域抽出プログラムは、前記第1領域に流れ込む水の流域を、前記標高データに基づいて上流方向に探索する第1手順と、前記第1手順によって特定された流域が正しいか否かを判定する第2手順と、を前記コンピュータのプロセッサに実行させ、前記第2手順において、前記特定された流域が正しくないと判定された場合、前記第1手順を再び前記プロセッサに実行させる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンピュータを使って流域を抽出する方法に関する。本発明は特に、1以上の地点の位置を入力データとし、それぞれの地点の流域を数値地形モデル(digital elevation mode, DEM)に基づいて抽出するコンピュータプログラム(流域抽出プログラム)に関する。
【背景技術】
【0002】
流域は、河川またはダムなどの水を管理する土木構造物にとって重要な情報である。ある地点の流域とは、その地点に集まってくる水が流れてきた領域である。ダムの建設のためには、そのダムに平均的に入ってくると予想される水量、すなわちダムの流域の平均降雨量が不可欠である。また、ダムの管理のためには、そのダムの水源林、すなわち流域内の森林の状態管理が不可欠である。河川の水位予測のためには、その河川の流域の予想降雨量が不可欠である。都市機能を豪雨から守るための雨水排水設備(下水)の設計には、その設備が対応すべき最大の降雨強度と、流域面積とが不可欠である。
【0003】
流域は、水が流れる方向を逆にたどることによって求めることができる。実際に、この流れの性質を利用して流域を抽出するコンピュータプログラム(流域抽出プログラム)が存在する。主要な流域抽出プログラムの処理手順は、非特許文献1に詳しい。
【0004】
流域抽出プログラムで利用する電子データは、地表面の標高データである。この様な電子データはDEM(Digital Elevation Model)と呼ばれる。DEMでは、ある領域の地表面がセル(cell)と呼ばれる小領域に分割され、それぞれのセルに標高値が与えられる。
【0005】
通常、水が流れる方向はその地点の最も急な下り勾配方向と一致する。この流れの性質を利用した流域抽出方法が、最急勾配法(steepest slope method)と呼ばれる方法である。この方法では、あるセルの流域が、そのセルから最も急な下り勾配の方向を逆にたどった時に通過したセルとなる。あるセルの勾配は、そのセルおよびそのセルの周囲の8セルの標高データから求めることができる。
【0006】
最急勾配法では、周囲のセルの標高以下の標高を持つセルの取り扱いが問題となる。このようなセルは、流域抽出プログラムの研究分野で「平地(flat)」または「窪地(sink, depression)」と呼ばれている。平地は周囲の1以上のセルの標高と同じ標高を持つセルであり、窪地は周囲のすべてのセルの標高より小さい標高を持つセルである。このようなセルが存在する場合、最急勾配法を利用すると、正しい流域を抽出することができない。ところが、平地および窪地は通常のDEMに多数存在する。したがって、最急勾配法のみでは、正しい流域が抽出できない。
【0007】
図18は、窪地を説明するための図である。グラフ1800は、DEMの鉛直断面図に最急勾配法で決定した水が流れる方向を重ねた図である。セル1801は河口であり、最も標高が低い。セル1804は隣接するセル(1803および1805)よりわずかに標高が低い。最急勾配法で決定した水が流れる方向を矢印で示す。セル1801の流域セルはこの矢印をセル1801から逆にたどった範囲であり、セル1802〜1803となる。しかしこの結果は誤りである。専門家であれば、セル1801の流域セルをセル1802〜1809とするであろう。
【0008】
この問題の最も一般的な解決方法は、勾配を無視し、標高の配置に基づいて水の流れる方向を決定する窪地埋め(sink filling)法である。窪地埋め法は、最急勾配法に比べ、より多くのセルの標高データを利用する。窪地埋め法を使う流域抽出プログラムは非特許文献2および非特許文献3に詳しく説明されている。
【0009】
窪地埋め法では、まず窪地を平地に変える。つまり、窪地の標高を、周囲のセルのうち最小の標高にする。図18では、窪地セル1804の標高をセル1805と同じ標高にする。次に、平地の流出口を決定する。具体的には、平地に隣接する平地よりも低い標高を持つセルを流出口として決定する。流出口が存在しない場合は、平地にするセルを広げる。
【0010】
図18では、セル1804および1805の流出口が存在しない。そこで、平地にするセルをセル1803から1805に広げる。広げた後の状態をグラフ1820に示す。
【0011】
グラフ1820のセル1821〜1829は、それぞれ、グラフ1800のセル1801〜1809に対応する。
【0012】
グラフ1820を参照すると、セル1823から1825の標高が等しく、これらのセルが平地になっていることがわかる。この場合、流出口はセル1822となる。最後に、平地内の流れが流出口に向かうように平地内の水が流れる方向を決定する。平地セル1823から1825の水が流れる方向は、その流出口であるセル1822に向かうように決定される。セルごとの水が流れる方向を、グラフ1820に矢印で示す。この矢印をセル1821から逆にたどると、セル1829までたどれる。最急勾配法の結果を窪地埋め法により修正すると、セル1821の流域セルはセル1822〜1829である、という正しい結果が得られる。
【0013】
窪地埋め法の処理効率を上げる実装方法として、特許文献1に開示された「Method for flow analysis utilizing cell elevation topography」が挙げられる。この方法では、あらかじめ領域の内部を複数のmajor cellに分割し、さらにmajor cellの内部を少なくとも横方向3縦方向3のminor cellに分割する。そして、あるminor cellにおける勾配を算出するときに、そのminor cellを含むmajor cellと、さらにそのmajor cellに隣接するmajor cellについて窪地埋め法を適用する。その後、これらのmajor cellに含まれるminor cellについて勾配を再度算出する。非特許文献1に開示された方法では、処理の対象とする領域全体に窪地埋め法を適用する必要があったが、特許文献1に開示された方法では、処理の対象とする領域を複数に分割し、それぞれ分割された領域ごとに窪地埋め法を適用することが可能になる。
【0014】
いずれの方法であっても、次の手順で流域を抽出する。まず、水の流れる方向を勾配のみから決定する(最急勾配法)。次に、水が流れ出ない平地セルおよび窪地セルに対して、そのセルの水の流れる方向を標高の配置に基づいて決定する(窪地埋め法)。最後に、ユーザが指定したセルから水の流れる方向を逆にたどる。そのときに通ったセルが、流域セルである。
【先行技術文献】
【特許文献】
【0015】
【特許文献1】米国特許出願公開第2005/0049802号明細書
【非特許文献】
【0016】
【非特許文献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 Resource Research, 30(6), 1681−1692.
【非特許文献2】O'Callaghan, J. F., and D. M. Mark: The extraction of drainage networks from digital elevation data, Computer Vision, Graphics, and Image Processing, 28 (3), 323-344, 1984.
【非特許文献3】Jenson, S. K., and J. O. Domingue: Extracting topographic structure from digital elevation data for geographic information system analysis, Photogrammetric Engineering and Remote Sensing, 54 (11), 1593−1600, 1988.
【発明の概要】
【発明が解決しようとする課題】
【0017】
従来の流域抽出プログラムでは、水の流れる方向を決定した後に、流域を抽出する。したがって、流域を抽出する前に、水の流れる方向を決定する範囲をプログラムに与える必要がある。もし、水の流れる方向を決定する範囲が流域よりも小さい場合、正しい流域は抽出できない。したがって、正しい流域を抽出するためには、抽出される流域をプログラムのユーザがあらかじめ知っておく必要がある。しかし、流域を知っているユーザは、流域抽出プログラムを使う必要はない。このため、従来の流域抽出プログラムは、限られた用途にしか適用されてこなかった。
【0018】
本発明はこの問題に鑑みてなされたものである。本発明の目的は、あらかじめ流域を知らないユーザであっても流域を抽出できるプログラムコンピュータプログラムを提供することである。
【課題を解決するための手段】
【0019】
本願で開示する代表的な発明は、コンピュータを制御する流域抽出プログラムであって、前記コンピュータは、前記流域抽出プログラムが格納されるメモリと、前記メモリに格納された前記流域抽出プログラムを実行するプロセッサと、を備え、地図上の複数の領域の標高を示す標高データを保持し、前記複数の領域は、第1領域を含み、前記流域抽出プログラムは、前記第1領域に流れ込む水の流域を、前記標高データに基づいて上流方向に探索する第1手順と、前記第1手順によって特定された流域が正しいか否かを判定する第2手順と、を前記プロセッサに実行させ、前記第2手順において、前記特定された流域が正しくないと判定された場合、前記第1手順を再び前記プロセッサに実行させることを特徴とする。
【発明の効果】
【0020】
本発明の一実施形態によれば、DEMから流域を抽出するコンピュータプログラムを提供できる。このプログラムによって、あらかじめ流域を知らないユーザであっても、流域を抽出することができる。
【図面の簡単な説明】
【0021】
【図1】本発明の第1の実施の形態におけるコンピュータシステムの構成を示す概略ブロック図である。
【図2】本発明の実施形態のPCによって実行される処理を示すシーケンス図である。
【図3】本発明の実施形態の流域抽出プログラムが提供するGUIの入力待ちの状態を示す説明図である。
【図4】本発明の実施形態の流域抽出プログラムが提供するGUIの解析終了の状態を示す説明図である。
【図5】本発明の実施形態の流域抽出処理の詳細を示すフローチャートである。
【図6】本発明の実施形態の上流探索処理の詳細を示すフローチャートである。
【図7】本発明の実施形態の流域抽出プログラムが提供するGUIの上流探索処理の進捗を示す説明図である。
【図8】本発明の実施形態の流域抽出プログラムが提供するGUIの流域外セル抽出処理の進捗を示す説明図である。
【図9】本発明の実施形態の下流探索処理の詳細を示すフローチャートである。
【図10】本発明の実施形態の流域抽出プログラムが提供するGUIの下流探索処理の進捗を示す説明図である。
【図11】本発明の実施形態のセルおよび部分領域を示す説明図である。
【図12】本発明の実施形態の部分領域のデータ構造を示す説明図である。
【図13】本発明の実施形態のセルのデータ構造を示す説明図である。
【図14】本発明の実施形態のセル勾配についての説明図である。
【図15】本発明の実施形態において水が流れる方向と、それに対応するフラグの値を説明するための図である。
【図16】本発明の実施形態の窪地のデータ構造を示す説明図である。
【図17】本発明の実施形態の窪地埋め処理の詳細を示すフローチャートである。
【図18】窪地を説明するための図である。
【発明を実施するための形態】
【0022】
最初に、本発明の概要を説明する。
【0023】
本発明は、以下の3つの発見に基づいている。
【0024】
1.窪地および平地の面積、体積、形状等はあらかじめわからない。
【0025】
2.窪地および平地がプログラムで得られた流域に隣接している場合、プログラムで得られたその流域が誤っている可能性がある。
【0026】
3.流域の最上流は自明ではない一方、流域の最下流は自明である。
【0027】
発見1および2は、発明者らが先に出願した発明(特願2008−002284,流域推定プログラム)を様々な流域でDEMデータやセルの大きさを様々に変化させて検証する過程で発見した。そこで、特願2008−002284に示した発明の概要を以下に説明する。
【0028】
特願2008−002284に示した発明は、任意のセルがある面積以下の窪地でないことを証明できる、という発見に基づく。ある面積をもった(すなわちある数のセルからなる)窪地または平地が取り得る最大の長さは、それらのセルを1列に直線上に並べた場合の長さである。あるセルからこの長さよりも近いセルについて窪地埋め法を適用すれば、少なくとも中心にあるセルはある面積以下の窪地または平地ではなくなる。そこで、特願2008−002284に示した発明では「窪地の最大面積」というパラメタを導入し、これ以下の面積の窪地および平地を埋めることにした。この発明はさらに、先に出願した別の発明(特開2007−034373,空間シミュレーションプログラムおよび装置)の「部分領域」という概念を利用する。
【0029】
特願2008−002284に示した発明の実施例は以下の通りである。あらかじめ窪地の最大面積を定義しておく。さらに、あらかじめ隣接する複数のセルから構成される部分領域を定義し、全てのセルを部分領域に対応づけておく。開始セルをユーザが指定すると、プログラムは開始セルを対象セルとする(ステップ1)。つづいて、対象セルを含む部分領域を対象部分領域とする(ステップ2)。対象部分領域からの距離が、最大の窪地が取り得る最大の長さよりも近い部分領域について、窪地埋め処理を行う(ステップ3)。この処理によって、対象部分領域からあらかじめ決めた面積以下の窪地が取り除かれる。つづいて、対象セルに隣接する8セルについて下流方向(すなわち、各セルから流出する水の流向)を算出する(ステップ4)。下流方向は、最も急な下り勾配の方向である。下流方向に対象セルがあるセルを、次の対象セルとする(ステップ5)。次の対象セルが存在する場合、ステップ2に戻る(ステップ6)。
【0030】
一方、本発明は先の発明とは異なる発見を利用する。すなわち、本発明は上述した発見1から3に基づいている。本発明は、先の発明では必要であった「窪地の最大面積」というパラメタを不要にする。発明者らが考案した、本発明の流域抽出プログラムは以下のステップ1およびステップ2からなる。
【0031】
ステップ1:ユーザが指定したセルの上流セルを探索する。
【0032】
水の流れる方向は、最急勾配法、特願2008−002284に示した方法などで決定すればよい。これによって、ユーザが指定したセルを下流端とする流域が抽出される。ところが、ステップ1によって得られた流域は誤っている可能性がある。なぜなら、得られた流域の外側にその流域に隣接する窪地がある場合、得られた流域は誤っている可能性があり(発見2)、そのような窪地が存在しないことを保証できないためである(発見1)。また、最上流は自明ではない(発見3)。つまり、たとえば地図や現場に、最上流を示す印があるわけではないため、ステップ1で得られる流域が正しいことを保証できない。
【0033】
ステップ2:ステップ1で抽出された流域の真偽を判定する。
【0034】
この判定には、流域の定義の対偶を利用する。すなわち、流域でないセルの下流に、流域でないセルしかなければその流域は正しい。発見3によれば、最下流は自明である。つまり、河川の最下流は海である(正確には、最下流は水の流出口がない領域であり、地域によっては、水の流出口がない湖、砂漠などが最下流となる場合もある。以下、水の流出口がない領域を「無効領域」、その領域に含まれるセルを「無効セル」と表記する)。ところが、プログラムでは最下流が無効領域とならない場合がありうる。つまり最下流が窪地となる場合である。そこで、このセル近傍の水の流れる方向を窪地埋め法により決定した後、下流探索をやり直す。こうして、ステップ1で抽出された流域以外のセルを開始セルとし、無効セルまで下流探索する。こうして得られた下流セルにユーザが指定したセルが含まれない場合、ステップ1で抽出された流域は真であると判定する。なお、プログラムの処理においては、標高値などの指標に基づいて下流探索を打ち切ってもよい。
【0035】
ステップ2の判定の結果が偽であれば、ステップ1に戻る。その場合、ユーザが指定したセルの上流に、ステップ1で抽出された流域以外のセルが存在する。したがって、再び実行されたステップ1で得られる流域は、前回のステップ1で得られた流域とは異なる。
【0036】
なお、ステップ2において下流探索の開始セルとするセルは、ステップ1で抽出された流域以外のセルであって、かつステップ1で抽出された流域セルに隣接するセルだけに限定してもよい。なぜならばこれらのセルは、流域が偽と判定される場合に必ず下流探索されるためである。
【0037】
以下、本発明の実施形態を添付図面に基づいて説明する。
【0038】
図1は、本発明の実施形態におけるコンピュータシステムの構成を示す概略ブロック図である。
【0039】
本実施形態のコンピュータシステムは、PC(Personal Computer)100によって構成される。PC100は、入出力部110を備える。入出力部110は、キーボード111およびマウス112などからなる入力部と、ディスプレイ113などからなる出力部によって構成される。ユーザは、入力部から命令を入力し、出力部を用いて結果を確認することができる。
【0040】
さらにPC100は、メモリ120及びCPU(Central Processing Unit)130を備える。メモリ120には流域抽出プログラム141が展開される。この流域抽出プログラム141はCPU130への命令によって構成される。CPU130は、流域抽出プログラム141の命令に従い計算、HDD(Hard Disk Drive)190へのアクセス、および入出力部110との情報の交換などを行う。以下の説明において流域抽出プログラム141が実行する処理は、実際には、流域抽出プログラム141に記述された命令に従うCPU130によって実行される。
【0041】
HDD190には地図データ191、標高データ192、海域データ193が格納されており、流域抽出プログラムはこれらのデータを読み込むことができる。なお、HDD190は、PC100に内蔵されてもよいし、PC100の外部に接続されてもよいし、PC100からネットワーク経由でアクセスできる別の装置に接続されてもよい。
【0042】
地図データ191は、ユーザに場所を理解させる情報であればよい。地図データ191として適している情報として、地名、行政界、道路、鉄道、衛星画像、等高線、海岸線などが挙げられる。本実施形態では少なくとも等高線および海岸線が利用される。さらに、谷線、河道流路線、海岸線、湖沼面、海面等、水面の位置を示す情報、流域境界線など分水嶺の位置を示す情報が必要に応じて利用されてもよい。
【0043】
標高データ192は、一般的にDigital elevation model(DEM)と呼ばれるデータである。すなわち、セルの位置とそのセルにおける地表面の標高を記載した情報である。代表的なDEMは、地表面に等間隔で並べた正方形のセル(square grid)における標高の値である。
【0044】
海域データ193は、流出口がない水域を示すデータである。つまり、海域に加え、閉塞湖沼域(水の流出口がない湖)等が判別できるデータである。多くの場合、このデータは海域を示すデータと同じであり、海域は標高データ192に基づいて判別できる。すなわち、通常の標高データでは、陸域には標高値が、海域には海域を示す値が格納されている。その場合、この海域データ193は不要であり、標高データ192のみで十分である。
【0045】
図2は、本発明の実施形態のPC100によって実行される処理を示すシーケンス図である。
【0046】
以下、図2にしたがってシステムの処理シーケンスを説明する。
【0047】
PC100で流域抽出プログラム141が起動される。流域抽出プログラム141は、HDD190から地図データ191を読み出す(ステップ201)。データを読み出した流域抽出プログラム141は、ウィンドウ300からなるGUI(Graphical User Interface)をディスプレイ113に出力する(ステップ202)。
【0048】
図3は、本発明の実施形態の流域抽出プログラム141が提供するGUIの入力待ちの状態を示す説明図である。
【0049】
図3のGUIは、ディスプレイ113の所定の領域に表示されるウィンドウ300からなり、キーボード111及びマウス112による入力を受け付ける。ウィンドウ300は、少なくとも地図310を表示する。ユーザは、所定の操作によって、ユーザが必要とする地域の地図310を表示させることができる。地図310の縮尺は、流出現象の空間スケールと同程度であることが望ましい。したがって典型的な流出現象であれば、1/25,000かそれより粗い縮尺が適当である。本実施例の地図310は等高線311および海岸線312の情報を含む。
【0050】
さらにウィンドウ300は少なくとも、ユーザが1以上の地点を指定するための機能、および、ユーザがその指定を確定するための機能を有する。後述するように、1以上の地点を指定するためにマウスポインタ301が使用され、その指定を確定するために解析ボタン303が使用される。
【0051】
このGUIを用いてユーザは解析対象を指定する(ステップ203)。本実施の形態では、ユーザがマウス112を動かすことによってマウスポインタ301を地図310上で動かし、マウス112をクリックすることによって、任意の地点を下流端として指定する。なお、ユーザの操作結果をユーザにわかりやすく伝えるために、指定した地点にアイコン302を表示することが望ましい。
【0052】
図3は、ユーザが河口付近のごく近接した2地点を下流端として指定した状態を示している。この場合、流域抽出プログラム141は、これからこれらの2地点を下流端とし、それらの流域を解析することになる。ユーザは解析対象を入力した後、解析ボタン303をクリックする。解析ボタン303がクリックされると、流域抽出プログラム141は、入力された地点に対応するセルを「開始セル」として指定する。
【0053】
なお、ステップ203で入力する解析対象を地点に限定する必要はない。セルに変換できる情報であるかぎり、どのような情報が入力されてもよい。地点以外の代表的な情報として、線又は面が挙げられる。入力された点、線又は面の情報は、地理情報システムの基本的な公知の技術を用いてセルに変換することができる。このような技術は、たとえば、伊里政夫 監修,腰塚武志 編集(1993),計算機科学と地理情報処理 第2版, 共立出版株式会社, ISBN 4320026365.に記載されている。
【0054】
線として河道流路線(河心線)を入力した場合、DEMによる表現が難しい細かい水路を考慮した流域抽出が可能になる。線として海岸線を入力した場合、その海岸線の流域を抽出することが可能になるため、たとえば湾の流域を抽出する際に便利である。面として湖沼面を入力した場合、その湖に対する流域を抽出することが可能になる。
【0055】
あるいは、これらの情報は、ユーザによって入力されるかわりに、地図データ191から取り込まれてもよい。たとえば、河道流路線、海岸線、湖沼面等は地理情報データとして一般に流通しているため、それらを利用することができる。
【0056】
本実施形態では、サブウィンドウ330のラジオボタン332を操作することによって、ユーザが入力方法を選択できる。例えば、ユーザがラジオボタン332の「マウス指定」および「点」を指定した場合、ユーザは、マウス112を使用して下流端の地点を入力することができる。あるいは、ユーザがラジオボタン332の「開く」を指定した場合、ユーザは、地図データ191に含まれる情報(例えば河道流路線等)を入力することができる。
【0057】
さらに、ステップ203で、ユーザは、流域外の点、線、面等を追加的に入力してもよい。その場合、ユーザは、流域内の点、線、面等に加え、流域外の地点、線、面等を入力した後、解析ボタン303をクリックする。解析ボタン303がクリックされると、流域抽出プログラム141は流域外として入力された点、線、面等に対応するセルを「無効セル」に指定する。したがって、1以上のセルが開始セルとして、それ以外の0以上のセルが無効セルとして指定されることになる。流域外の情報を入力すると、後に説明する下流探索処理(ステップ504)を大幅に短縮することが可能になる。本実施形態では、サブウィンドウ330のラジオボタン331を操作することによって、入力された地点等が流域内または流域外のどちらであるかを選択できる。
【0058】
さらに、203で、ユーザは、標高データに基づく流域外セル(または無効セル)の判定方法を定義してもよい。一般に、ある地点の上流には、その地点よりも標高が高い地点のみが存在する。この知識を利用すれば、開始セルよりも標高の低いセルは流域外セル(または無効セル)と見なせる。したがって、流域抽出プログラム141は、開始セルよりも標高の低いセルを流域外セル(または無効セル)と見なしてもよい。あるいは、流域抽出プログラム141は、標高データに誤りがある場合を考慮し、ある値よりも小さい標高を持つセルを流域外セル(または無効セル)と見なしてもよい。
【0059】
次に流域抽出プログラム141は、流域抽出処理(ステップ204)を繰り返し行う。このステップ204は、標高データおよび海域データ読み込み処理(ステップ205)、および、進捗表示処理(ステップ206)を含む。ステップ205では、流域抽出プログラム141がHDD190から標高データ192を読み込む。ステップ206では、流域抽出プログラム141が進捗を示す記号をウィンドウ300に表示する。ステップ206は必須ではないため省いてもよい。ステップ204の詳細は図5から10を用いて説明する。
【0060】
最後に流域抽出プログラム141は処理結果である流域をウィンドウ300に表示する(ステップ207)。
【0061】
図4は、本発明の実施形態の流域抽出プログラム141が提供するGUIの解析終了の状態を示す説明図である。
【0062】
この図4には、流域を示す2種類の記号が表示されている。第1の記号は、水が流れる方向を示す線分401である。水はこの線分に沿って流れ下る。第2の記号は、分水嶺を示す線分402である。この分水嶺の内側にある水は、図3で指定した二つの点302のいずれかに流れ下る。一方で、この分水嶺の外側にある水は、図3で指定した二つの点302のいずれにも流れ下らない。
【0063】
次に、流域抽出処理(ステップ204)の詳細を説明する。
【0064】
図5は、本発明の実施形態の流域抽出処理(ステップ204)の詳細を示すフローチャートである。
【0065】
ステップ501において、流域抽出プログラム141は、開始セルを「流域セル」とする。具体的には、流域抽出プログラム141は、開始セルのデータに含まれる、セルの種類を示す変数を「流域」に変更する。セルのデータについては後述する(図13参照)。開始セルは、ステップ203において解析対象として入力された点、線または面等に対応するセルである。前述の通り、点−セル、線−セル、または面−セルの変換には、地理情報システムの基本的な技術が用いられる。
【0066】
ステップ502において、流域抽出プログラム141は、開始セルの上流を探索する。ここで、ステップ502で実行される上流探索処理について、図6および図7を参照して説明する。
【0067】
図6は、本発明の実施形態の上流探索処理(ステップ502)の詳細を示すフローチャートである。図6の詳細な説明は後述する。
【0068】
図7は、本発明の実施形態の流域抽出プログラム141が提供するGUIの上流探索処理(ステップ502)の進捗を示す説明図である。
【0069】
図6のステップ602で対象セルとして指定されたセルが、図7に点701として示されている。上流探索処理の進捗に伴って、対象セルは開始セルから上流方向に向かって1セルずつ進んでいくため、点701は上流方向に向かって1セルずつ進んでいく。また、ステップ603で読み込んだ部分領域が、図7に矩形702として示されている。この矩形も、上流探索処理の進捗に伴って上流方向に追加されていく。図7には4つの矩形が描かれている。これは、すでに4つの部分領域が読み込まれていることを示す。これらの点および矩形の動きによって、ユーザは、現在上流探索処理が実行されていることを知ることができ、さらに、その処理の進捗を直感的に把握することができる。このステップ502の処理によって、開始セルの流域が「流域セル」として抽出される。
【0070】
ステップ503において、流域抽出プログラム141は、流域外セルを抽出する。この処理によって、ステップ502で抽出された流域セルでなく、かつ流域セルに隣接するセルが抽出される。抽出されたセルを流域外セルと記載する。
【0071】
図8は、本発明の実施形態の流域抽出プログラム141が提供するGUIの流域外セル抽出処理(ステップ503)の進捗を示す説明図である。
【0072】
ステップ503で抽出された流域外セルが、図8に点801として示されている。ステップ504以降に行う流域の真偽判定によって、流域が正しいと判定された場合、これらの点801が分水嶺となる。あらかじめ分水嶺がどこにあるかがわかっているユーザは、これらの点からこれらからなされる真偽判定の結果を予想でき、さらに残りの処理にかかる時間をおおよそ予想することができる。
【0073】
ステップ504において、流域抽出プログラム141は、ステップ503で抽出されたセルの下流を探索する。
【0074】
図9は、本発明の実施形態の下流探索処理(ステップ504)の詳細を示すフローチャートである。図9の詳細な説明は後述する。
【0075】
図10は、本発明の実施形態の流域抽出プログラム141が提供するGUIの下流探索処理(ステップ504)の進捗を示す説明図である。
【0076】
図9ステップ902で対象セルとして指定されたセルが、図10に点1001として示されている。下流探索処理の進捗に伴って、対象セルはステップ503で抽出した流域外セルから下流方向に向かって1セルずつ進んでいく。このため、点1001の動きによって、ユーザは、現在下流探索処理が実行されていることを知ることができ、さらに、その処理の進捗を直感的に把握することができる。下流探索処理によって、ステップ503で抽出した流域外セルの下流のセルが「流域外セル」として抽出される。
【0077】
ステップ505において、流域抽出プログラム141は、やり直しフラグ(図9を参照して後述)の値を判定する。やり直しフラグの値が真であると判定された場合、前回のステップ502の上流探索処理(現在までにステップ502から505のループが複数回実行された場合、最後に実行された上流探索処理)によって得られた流域が誤っている。言い換えると、真の流域は、前回の上流探索処理によって得られた流域のさらに外側まで広がっている。この場合、処理はステップ502に戻る。そして、流域抽出プログラム141は、再び開始セルの上流探索を実行する。前回の下流探索処理の際に窪地埋め処理が実行された場合、後述するように、窪地内のセルの下流方向が決定されている。この場合、今回の上流探索処理の結果は、前回の上流探索処理の結果と異なる。
【0078】
ステップ505において、やり直しフラグの値が偽であると判定された場合、前回の上流探索処理によって得られた流域が正しい。このため、流域抽出プログラム141は、流域抽出処理を終了する。
【0079】
以上、本実施例の全体的な処理の流れについて説明した。以下、個々の処理およびそれらの処理を実現するデータ構造について詳細に述べる。
【0080】
図11は、本発明の実施形態のセルおよび部分領域を示す説明図である。
【0081】
本実施形態では、空間の東西方向をx軸(1101)、南北方向をy軸(1102)とする2次元直交座標系を利用する。さらにこの空間を、x軸方向にdx(1103)、y軸方向にdy(1104)の間隔で分割してセルを生成する。地点(x,y)にあるセル(i,j)は以下の式(1)で求められる。
【0082】
i=floor(x/dx), j=floor(y/dy) ......... (1)
【0083】
ただし、floor()は小数部分を切り捨てることによって整数にする関数である。
【0084】
部分領域は、複数のセルからなる領域である。部分領域は、x軸方向にsi(1105)、y軸方向にsj(1106)のセルからなるとする。ただし、siおよびsjは2以上の整数である(この図11にはsi=10,sj=10の例を示したが、図7、図8及び図10にはsi=28,sj=28の例を示した)。したがって、1つのセルは1つの部分領域に含まれる。セル(i,j)が含まれる部分領域(bi,bj)は次の式(2)で求められる。
【0085】
bi=floor(i/si), bj=floor(j/sj) ......... (2)
【0086】
図12は、本発明の実施形態の部分領域のデータ構造を示す説明図である。
【0087】
以下のデータ構造に関する説明では、C++などオブジェクト指向型言語に向いた実装方法を示す。表1200に部分領域型のデータを示す。実装の際には、これらのデータをメンバ変数として持つ、クラス名CellUnitの型とすればよい。
【0088】
CellUnitは、Id、Cells、Targetsの3つのメンバ変数を持つクラスである。
【0089】
Idは整数型であり、上記式(2)に示したbi,bjから一意に生成した値を保持する(行1201)。Idは、たとえばbi,bjをそれぞれ32ビット整数、Idを64ビット整数とし、0から31ビットまでにbiの値を、32から63ビットまでにbjの値を格納することによって作成されてもよい。
【0090】
Cellsは図13で説明するセル型を格納する固定長配列である(行1202)。配列の長さは、1つの部分領域に含まれるセルの数、すなわち、si*sjである。
【0091】
Targetsは、セル型を格納する可変長配列である(行1203)。この変数の初期値はempty、すなわち格納された要素がない配列である。
【0092】
図13は、本発明の実施形態のセルのデータ構造を示す説明図である。
【0093】
表1300にセル型のデータを示す。セル型(クラス名Cell)は、Glev、Kind、DownDirの3つのメンバ変数を持つクラスである。
【0094】
Glevは実数型であり、標高を保持する(行1301)。
【0095】
Kindは列挙型であり、未定(0)、流域(1)、流域外(2)または無効(3)の別を示すフラグである(行1302)。未定(0)は、セルが有効セルであるが、流域セルまたは流域外セルのいずれであるかがまだ定まっていないことを示す。流域(1)は、セルが有効セルであり、かつ、流域セルであることを示す。流域外(2)は、セルが有効セルであり、かつ、流域外セルである(言い換えると他の流域に属する流域セルである)ことを示す。無効(3)は、セルが無効セルであることを示す。Kindの初期値は、未定(0)である。
【0096】
DownDirは列挙型であり、水が流れる方向(すなわち隣接下流セルの方向)を示すフラグである(行1303)。DownDirの具体的な値については図14及び図15を参照して説明する。DownDirの初期値は、隣接下流セルが存在しないことを示す値0である。水が流れる方向を求めるためには、セル勾配を求める必要がある。
【0097】
図14は、本発明の実施形態のセル勾配についての説明図である。
【0098】
図14には、セル1400を中心にi軸方向に3セル、j軸方向に3セルを示した。セル(i,j)における勾配は、セル(i,j)の標高値と、その格子に隣接するセルにおける標高値との差をセル間の距離で割った値である。1セルには8セルが隣接する。したがって、セル(i,j)における8方向の勾配が算出される。勾配の方向をそれぞれ矢印1401から矢印1408で示す。矢印1401から矢印1408に対応する勾配をそれぞれGrad1からGrad8と命名する。変数Grad1からGrad8の値を求める式は以下の通りである。
【0099】
Grad1=(Glev[i,j]-Glev[i-1,j+1])/hypot(dx,dy) ......... (3-1)
Grad2=(Glev[i,j]-Glev[i,j+1])/dy ......... (3-2)
Grad3=(Glev[i,j]-Glev[i+1,j+1])/hypot(dx,dy) ......... (3-3)
Grad4=(Glev[i,j]-Glev[i-1,j])/dx ......... (3-4)
Grad5=(Glev[i,j]-Glev[i+1,j])/dx ......... (3-5)
Grad6=(Glev[i,j]-Glev[i-1,j-1])/hypot(dx,dy) ......... (3-6)
Grad7=(Glev[i,j]-Glev[i,j-1])/dy ......... (3-7)
Grad8=(Glev[i,j]-Glev[i+1,j-1])/hypot(dx,dy) ......... (3-8)
【0100】
ただし、Glev[i,j]はセル(i,j)における標高、hypot(x,y)は原点(0,0)と点(x,y)との距離を返す関数である。なお、本実施例では隣接するセルとして8近傍(すなわち隣接する8個のセル)を利用した。これは、隣接セルが増えるほど精度のよい結果が期待できるためである。ただし、隣接するセルとして8近傍ではなく4近傍(すなわち隣接する4個のセル)を使用してもよい。その場合は、上記8方向の勾配のうちGrad2、Grad4、Grad5、Grad7のみを利用すればよい。
【0101】
あるセル(i,j)の隣接下流セルは、そのセル(i,j)の勾配Grad1からGrad8から求められる。具体的には、あるセル(i,j)の隣接下流セルは、そのセルの最も急な下り勾配方向にある隣接セルである。最も急な下り勾配とは、勾配Grad1からGrad8の最大値であり、最も急な下り勾配方向とは、勾配Grad1からGrad8の最大値の方向である。この最も急な下り勾配方向は、以下(a)から(c)の3ケースに分類できる。
【0102】
(a)最も急な下り勾配が0より大、かつ1方向の場合。この場合、最も急な下り勾配方向を水が流れる方向とする。
【0103】
(b)最も急な下り勾配が0より大、かつ2方向以上の場合。この場合、最も急な下り勾配方向から、あらかじめ決めた方向優先度に従って1方向を選択する。本実施形態では、下記の式(4)の順に優先度の高さが設定される。
【0104】
Grad2 > Grad5 > Grad7 > Grad4 > Grad1 > Grad3 > Grad8 > Grad6......... (4)
【0105】
例えば、Grad2とGrad3の値が同じであり、かつ、これらが最も急な下り勾配方向である場合、Grad2の優先度がGrad3より高いため、Grad2に対応する方向1402のセル(i,j+1)が隣接下流セルである。
【0106】
(c)最も急な下り勾配が0以下の場合。この場合、水が流れる方向は存在せず、隣接下流セルは存在しないと判定される。本実施形態では後に説明するように無効セルの標高を負の無限大として扱っているため、最も急な下り勾配方向が0以下であると判定されたセルは窪地または平地である。
【0107】
図15は、本発明の実施形態において水が流れる方向と、それに対応するフラグの値を説明するための図である。
【0108】
実装では、セル型Cellのメンバ変数DownDirが、図15に示す値を保持する。最も急な下り勾配方向が上記(a)または(b)の場合、DownDirは1,2,4,8,16,32,64,128のいずれかの値になる。たとえばセル(i,j)の水が流れる方向が図14の方向1405である(すなわち、セル(i,j)の隣接下流セルがセル(i+1,j)である)場合、DownDirの値は1となる。最も急な下り勾配方向が上記(c)の場合(すなわち隣接下流セルが存在しない場合)、DownDirは未定を表す値0になる。
【0109】
次に、図6を用いて上流探索処理(ステップ502)の詳細を説明する。
【0110】
流域抽出プログラム141は、それぞれの流域セルについてステップ601からステップ612までの処理を繰り返す。図6の説明において、このループの処理対象のセルをcell1と記載する。実装では、ステップ501で部分領域クラスCellUnitのメンバ変数Targetsに開始セルを格納し、Targetsのそれぞれの要素についてこのループを実行する。
【0111】
ステップ602において、流域抽出プログラム141は、cell1を「対象セル」として指定する。
【0112】
ステップ603において、流域抽出プログラム141は、対象セル(cell1)を含む部分領域を読み込む。これによって、標高データ192および海域データ193が読み込まれる。流域抽出プログラム141は、海域データ193に基づいて海域と判別されたセルを、無効セルに指定する。さらに、ステップ203で無効セルまたは流域外セルが指定されている場合、流域抽出プログラム141は、そのセルを無効セルまたは流域外セルに指定する。そして、流域抽出プログラム141は、無効セルの標高を負の無限大にする。
【0113】
実装では、例えば、下記の手順が実行される。まず、流域抽出プログラム141は、メモリ120に部分領域クラスCellUnitのインスタンスを生成する。部分領域クラスCellUnitのインスタンスは、変数Idにbi,bjから生成したIDを格納し、変数CellsにセルクラスCellのインスタンスをsi*sj個保持する。セルクラスCellのメンバ変数Kind及びDownDirは表1300に示した初期値に初期化される。
【0114】
メンバ変数GlevおよびKindには、次のような値が格納される。海域データ193、または、ステップ203における指定に基づいて、セルが無効セルであると判定された場合、メンバ変数Glevには標高値として負の無限大が格納され、メンバ変数Kindには無効(3)が格納される。セルが有効セルであると判定された場合、メンバ変数Glevには標高値としてHDD191から読み込まれた標高データ192が格納され、メンバ変数Kindには未定(0)が格納される。ただし、セルが流域外セルであると判定された場合、メンバ変数Kindには流域外(2)が格納される。
【0115】
次に、流域抽出プログラム141は、対象セル(cell1)のそれぞれの隣接セルについてステップ604からステップ611までの処理を繰り返す。図6の説明において、このループの処理対象のセル(すなわち、cell1に隣接する複数のセルの各々)をcell2と記載する。
【0116】
ステップ605において、流域抽出プログラム141は、cell2の隣接下流セルが対象セル(cell1)であるか否かを判定する。この判定の結果が真である場合、処理はステップ606に、偽である場合、処理はステップ611に進む。
【0117】
cell2の隣接下流セルは、図14を参照して説明したように、最急勾配法によって求められる。ただし、後述するように、窪地埋め処理によってcell2の下流方向が決定された場合、その下流方向に基づいてcell2の隣接下流セルが求められる。
【0118】
実装では、このステップによってcell2のメンバ変数DownDirに水が流れる方向を示す値が格納される。
【0119】
ステップ606において、流域抽出プログラム141は、cell2の種類を判定する。具体的には、流域抽出プログラム141は、cell2に関するセルクラスCellのメンバ変数Kindの値を参照して、cell2が流域セル、流域外セル、無効セルまたは未定セルのいずれであるかを判定する。
【0120】
流域の定義によれば、cell2が有効セルであり、cell2の隣接下流セルがcell1であり、かつ、cell1が流域セルである場合、cell2は必ず流域セルである。このことに合致するように、流域抽出プログラム141は、cell2に関するセルクラスCellのメンバ変数Kindの値を更新する(ステップ607〜ステップ610)。
【0121】
cell2に関するセルクラスCellのメンバ変数Kindの値が流域(1)である場合、cell2は既に流域セルとして扱われている。この場合、メンバ変数Kindの値を更新する必要がないため、流域抽出プログラム141は、メンバ変数Kindの値を更新せずに(ステップ607)、ステップ611に進む。
【0122】
メンバ変数Kindの値が流域外(2)である場合、cell2は流域外セルである。このことは、cell2が既に他の流域に属する流域セルであると判定されていることを意味する。この場合、流域抽出プログラム141は、メンバ変数Kindの値を更新せずに(ステップ608)、ステップ611に進む。ただし、流域の定義によれば、ステップ606においてcell2が有効セルであると判定された場合、cell2は必ず流域セルである。このため、上流探索が正常に実行されている限り、ステップ606においてcell2が流域外セルであると判定されることはあり得ない。
【0123】
メンバ変数Kindの値が無効(3)である場合、cell2は無効セルである。この場合、cell2は流域セルになり得ないため、流域抽出プログラム141は、メンバ変数Kindの値を更新せずに(ステップ609)、ステップ611に進む。
【0124】
メンバ変数Kindの値が未定(0)である場合、cell2は未定セルである。上記のように、流域の定義によれば、ステップ606においてcell2が有効セルであると判定された場合、cell2は必ず流域セルである。このため、流域抽出プログラム141は、cell2を流域セルに変更して(ステップ610)、ステップ611に進む。具体的には、流域抽出プログラム141は、cell2に関するセルクラスCellのメンバ変数Kindの値を流域(1)に更新する。さらに、流域抽出プログラム141は、部分領域クラスCellUnitのメンバ変数Targetsにcell2を追加する。これによって、cell2は新たな対象セルとなる。
【0125】
ステップ611では、ステップ604のループに戻る。cell1に隣接する全てのcell2についてステップ604〜611のループが終了するまで、このループが繰り返し実行される。
【0126】
ステップ612では、ステップ601のループに戻る。全ての対象セルについてステップ601〜612のループが終了するまで、このループが繰り返し実行される。
【0127】
次に、図9を用いて下流探索処理(ステップ504)の詳細を説明する。
【0128】
流域抽出プログラム141は、それぞれの流域外セルについて、ステップ901からステップ912までの処理を繰り返す。図9の説明において、このループの処理対象のセルをcell1と記載する。実装では、ステップ503で部分領域クラスCellUnitのメンバ変数Targetsに流域外セルを格納し、Targetsのそれぞれの要素についてこのループを実行する。
【0129】
例えば、ステップ502が終了した時点で図8に示す複数のセル801が流域外セルである場合、これらの全てのセル801がメンバ変数Targetsに格納される。そして、全ての流域外セルについて処理が終了するまで、各流域外セルを対象として図9のループが繰り返される。
【0130】
なお、図9の説明において、「流域セル」とは、開始セル(図3の例ではアイコン302に対応するセル)が属する流域に属するセルを、「他の流域」とは、開始セルが属する流域と異なる流域を、流域外セルとは、他の流域に属するセル(すなわち、開始セルの上流にないセル)を、それぞれ意味する。
【0131】
ステップ902において、流域抽出プログラム141は、cell1を「対象セル」として指定する。
【0132】
ステップ903において、流域抽出プログラム141は、対象セル(cell1)を含む部分領域を読み込む。この動作はステップ603と同じである。
【0133】
ステップ904において、流域抽出プログラム141は、cell1の隣接下流セル(図9の説明においてcell2と記載する)を特定し、その種類を判定する。具体的には、流域抽出プログラム141は、cell2が存在するか否か、及び、存在する場合、cell2に関するセルクラスCellのメンバ変数Kindの値を参照して、cell2が流域セル、流域外セル、無効セルまたは未定セルのいずれであるかを判定する。cell1の隣接下流セルは、最急勾配法(図14参照)によって求められる。実装では、cell1のメンバ変数DownDirに、水が流れる方向を示す値が格納される。
【0134】
ここで、ステップ904の判定結果に基づく処理の概要を説明する。
【0135】
流域の定義によれば、ステップ503で抽出されたセルが流域外セルであれば、その下流の有効セルは、必ず流域外セルである。図9のcell1は、ステップ503で抽出されたセル自体またはその下流のセルであり、cell2はさらにその下流のセルである。したがって、cell1が流域外セルであり、cell1の隣接下流セルがcell2であり、かつ、cell2が有効セルである場合、cell2は必ず流域外セルである。このことに合致するように、流域抽出プログラム141は、cell2に関するセルクラスCellのメンバ変数Kindの値を更新する。
【0136】
このような処理において、cell1が流域外セルであるにもかかわらずcell2が流域セルであると判定されることは、ステップ503で抽出されたセルが実は流域セルであることを示す。これは、直前の上流探索処理によって取得された流域が誤っていたこと、すなわち、上流探索処理のやり直しが必要であることを意味する。この場合、流域抽出プログラム141は、やり直しフラグの値を更新する。
【0137】
やり直しフラグは、上流探索処理のやり直しが必要であるか否かを示す。具体的には、やり直しフラグの値がtrue(真)であることは、上流探索処理のやり直しが必要であることを示す。やり直しフラグは、例えば、初期値false(偽)のブール型のグローバル変数Failedである。
【0138】
次に、上記の処理の詳細を説明する。
【0139】
cell2に関するセルクラスCellのメンバ変数Kindの値が流域(1)である場合、cell2は流域セルである。このことは、cell1が流域外セルであることと矛盾する。すなわち、このことは、既に流域外セルであると判定されているcell1及びその上流の全てのセルが実は流域セルであること、さらに言い換えると、前回の上流探索処理(ステップ502)の結果が誤っていることを意味する。このため、流域抽出プログラム141は、やり直しフラグの値を真に更新し(ステップ905)、ステップ912に進む。
【0140】
メンバ変数Kindの値が流域外(2)である場合、cell2は流域外セルである。このことは、cell1が流域外セルであることと矛盾しない。言い換えると、これによって、cell2及びその上流の全てのセルが流域外セルであることが確認された。このため、流域抽出プログラム141は、やり直しフラグ及びメンバ変数Kindの値を更新せずに(ステップ906)、ステップ912に進む。この場合、cell2のさらに下流を探索する必要がないため、cell2は新たな対象セルとして選択されない。
【0141】
なお、cell2が流域外セルであるか否かは、どのような方法によって判定されてもよい。例えば、過去に実行された別の流域抽出処理によって、cell2が別の流域に属することが確定している場合、cell2に関するメンバ変数Kindの値が流域外(2)であるため、上記のようにcell2が流域外セルであると判定され、処理はステップ906に進む。ユーザがあらかじめ流域外の範囲を指定した場合も同様である。あるいは、メンバ変数Kindの値にかかわらず、cell2の標高が所定の標高(例えば、開始セルの標高)より低いと判定された場合に、cell2が流域外セルであると判定され、処理がステップ906に進んでもよい。あるいは、開始セルが河川上のセルである場合において、cell2が、開始セルが属するものと別の河川上のセルであると判定された場合、cell2が流域外セルであると判定され、処理がステップ906に進んでもよい。各セルがどの河川上にあるかは、地図データ191に基づいて判定することができる。
【0142】
メンバ変数Kindの値が無効(3)である場合、cell2は無効セルである。このことは、cell1が流域外セルであることと矛盾しない。言い換えると、これによって、cell1及びその上流の全てのセルが流域外セルであることが確認された。このため、流域抽出プログラム141は、やり直しフラグ及びメンバ変数Kindの値を更新せずに(ステップ907)、ステップ912に進む。この場合も、cell2のさらに下流を探索する必要がないため、cell2は新たな対象セルとして選択されない。
【0143】
メンバ変数Kindの値が未定(0)である場合、cell2は未定セルである。流域の定義によれば、ステップ904においてcell2が有効セルであると判定された場合、cell2は必ず流域外セルである。このため、流域抽出プログラム141は、cell2を流域外セルに変更して(ステップ908)、ステップ912に進む。具体的には、流域抽出プログラム141は、cell2に関するセルクラスCellのメンバ変数Kindの値を流域外(2)に更新する。さらに、流域抽出プログラム141は、部分領域クラスCellUnitのメンバ変数Targetsにcell2を追加する。これによって、cell2は新たな対象セルとなる。
【0144】
cell1に隣接する全てのセルの標高がcell1の標高以上である場合(すなわち、cell1が図14において説明したケース(c)に該当する場合)、最急勾配法によれば、cell1の下流方向は存在しない(言い換えるとcell1から水が流出しない)。このため、ステップ904において、cell2が存在しないと判定される。この場合、流域抽出プログラム141は、最急勾配法ではなく、cell1の周囲の複数のセルの標高の配置に基づいてcell1の下流方向を決定するための処理を実行する。
【0145】
具体的には、流域抽出プログラム141は、cell1を窪地セルに変更し(ステップ909)、窪地埋め処理を実行する(ステップ910)。ステップ909及びステップ910において実行される処理については後述する(図16及び図17参照)。窪地埋め処理が終了すると、流域抽出プログラム141は、窪地セルを流域外セルに変更して(ステップ911)、ステップ912に進む。
【0146】
全ての流域外セルについてステップ901からステップ912までのループが終了すると、流域抽出プログラム141は、下流探索処理を終了する。
【0147】
次に、図16および図17を用いて窪地埋め処理(ステップ910)の詳細を説明する。
【0148】
図16は、本発明の実施形態の窪地のデータ構造を示す説明図である。
【0149】
表1600に窪地型のデータを示す。実装の際には、これらのデータをメンバ変数として持つ、クラス名Sinkの型とすればよい。
【0150】
Sinkは、Cells、Outlets、WlevおよびFinishedの4つのメンバ変数を持つクラスである。CellsおよびOutletsはセル型を格納する可変長配列である(行1601および1602)。CellsおよびOutletsは、それぞれ、図17で説明する窪地セルおよび流出口セルを格納する。CellsおよびOutletsの初期値はemptyである。図9のステップ909は、cell1をメンバ変数Cellsに追加することによって実行される。Wlevは実数型であり、図17で説明する隣接最小標高を格納する(行1603)。Finishedはブール型であり、終了フラグを格納する(行1604)。Finishedの初期値はfalseである。
【0151】
図17は、本発明の実施形態の窪地埋め処理(ステップ910)の詳細を示すフローチャートである。
【0152】
ステップ1701において、流域抽出プログラム141は、「隣接最小標高」を算出する。隣接最小標高とは、窪地セルに隣接するセルの標高のうち最小の標高である。この窪地埋め処理の開始時点において、窪地セルはステップ909で得られたものだけである。したがってその時点の隣接最小標高はステップ909で得られた各窪地セルに隣接する8セルの標高の最小値であり、その値はステップ909で得られた窪地セルの標高と同じか、またはそれよりも大きい。
【0153】
実装では、ステップ909の終了時点で、窪地型Sinkのメンバ変数Cellsには、ステップ909において取得された窪地セル1つのみが格納されている。さらに、このステップ1701では、メンバ変数Cellsに隣接するセルの標高の最小値がメンバ変数Wlevに格納される。
【0154】
流域抽出プログラム141は、それぞれの窪地セルについてステップ1702からステップ1710までの処理を繰り返す。図17の説明において、このループの処理対象のセルをcell1と記載する。実装では、メンバ変数Cellsのそれぞれの要素についてこのループを実行する。
【0155】
流域抽出プログラム141は、cell1のそれぞれの隣接セルについてステップ1703からステップ1709までの処理を繰り返す。図17の説明において、このループの処理対象のセルをcell2と記載する。
【0156】
ステップ1704において、流域抽出プログラム141は、cell2を含む部分領域を読み込む。この動作はステップ603と同じである。
【0157】
ステップ1705において、流域抽出プログラム141は、隣接最小標高Wlevとcell2の標高とを比較する。Wlevとcell2の標高とが等しい場合ステップ1706に進み、等しくない場合ステップ1707に進む。
【0158】
Wlevとcell2の標高とが等しい場合、cell2は窪地の一部である。このため、ステップ1706において、流域抽出プログラム141は、cell2を窪地セルに変更する。実装では、メンバ変数Cellsにcell2を追加する。ステップ1706が実行された場合、追加されたcell2を処理するためのステップ1702からステップ1710までの処理が後に実行されることになる。
【0159】
ステップ1706が実行された時点で、cell2の標高はメンバ変数Wlevの値に等しく、かつ、その標高の値が窪地セルの中で最も大きい。このため、図17の説明において、メンバ変数Wlevを窪地最大標高とも記載する。
【0160】
ステップ1707において、流域抽出プログラム141は、窪地最大標高Wlevとcell2の標高とを比較する。Wlevがcell2の標高より大きい場合、cell2は窪地の一部ではない。さらにこの場合、cell2は、cell1を含む窪地に流入した水の流出口である。この場合、流域抽出プログラム141はステップ1708に進む。一方、Wlevがcell2の標高より小さい場合、cell2は窪地の一部である可能性があるが、そうでない可能性もある。この場合、流域抽出プログラム141は、ステップ1708を実行せずにステップ1709に進む。実装では、流域抽出プログラム141は、ステップ1708に進む前にcell2をメンバ変数Outletsに追加する。
【0161】
ステップ1708において、流域抽出プログラム141は、終了フラグFinishedを真(true)に更新する。なお、終了フラグの初期値は偽(false)である。つまり、ステップ1708が最初に実行されるまで、終了フラグFinishedは偽である。
【0162】
ステップ1709において、まだ処理されていない隣接セルがある場合、ステップ1703のループに戻る。
【0163】
ステップ1710において、まだ処理されていない窪地セルがある場合、ステップ1702のループに戻る。
【0164】
ステップ1711では、終了フラグFinishedの真偽判定をする。終了フラグが真の場合、窪地に流入した水の流出口が既に特定されている。このことは、窪地の範囲が特定されたことを意味する。すなわち、この時点における窪地セルの範囲が、特定された窪地の範囲である。この場合、処理はステップ1712に進む。一方、終了フラグが偽の場合、窪地に流入した水の流出口がまだ特定されていない。この場合、窪地の範囲がまだ特定されていないため、処理はステップ1701に戻る。
【0165】
ステップ1712において、流域抽出プログラム141は、すべての窪地セルの標高を隣接最小標高Wlevに変更する。なお、このステップで使用する隣接最小標高Wlevは、直前の回のステップ1701で求めた値であり、ステップ1712の時点の窪地セルに基づいて新たに隣接最小標高を算出するわけではない。この処理によって、すべての窪地セルの標高が等しくなる。以下の説明において、上記のように標高が変更された窪地セルを平地セルと言い換える。なお、実装ではメンバ変数Cellsに格納されたすべてのセルの標高をWlevに変更する。
【0166】
ステップ1713において、流域抽出プログラム141は、すべての平地セルの下流方向を決定する。具体的には、流域抽出プログラム141は、平地セルに隣接する、平地セルよりも低い標高を持つセル(図17の例では、ステップ1707でTrueと判定された場合のcell2)を、その平地の流出口セルとする。そして、平地内の流れが流出口セルに向かうように平地内の水が流れる方向(すなわち下流方向)を決定する。
【0167】
まず、流域抽出プログラム141は、平地セルのうち、流出口セルに隣接し、かつ、水が流れる方向が決定していないセルの下流方向を、流出口セルに向かう方向に決定する。1つの平地セルに複数の流出口セルが隣接している場合には、前述した方向優先度に従って下流方向が決定される。続いて、流域抽出プログラム141は、上記のように下流方向を決定したセルを流出口セルと見なし、その新たな流出口セルについて上記の処理を実行する。このように、すべての平地セルの水が流れる方向が決定するまで、同様の処理を繰り返す。実装では、メンバ変数Outletsに格納されたすべてのセルを流出口セルとする。
【0168】
なお、上記のような下流方向の決定方法は一例に過ぎない。窪地に流れ込んだ水が流出口セルから流出するように決定される限り、どのように下流方向が決定されてもよい。このように下流方向を特定することによって、全ての窪地セルがその窪地の流出口セルの上流であること、言い換えると、全ての窪地セルが、その窪地の流出口セルが属するものと同一の流域に属することが特定される。
【0169】
上記のように決定された下流方向は、その後に実行される上流探索処理(ステップ502)において使用される。具体的には、上記のように下流方向が決定されたセルが図6の処理のcell2として選択された場合、その決定された下流方向に基づいてステップ605の判定が実行される。
【0170】
このようにして、本実施形態ではユーザが図3に示した入力画面から情報を入力すると、プログラムが図7,8,10に示した進捗画面を提示して、最終的に図4に示した結果表示画面を提示することができる。
【0171】
本実施形態では部分領域を使用した場合の実施方法について説明した。しかし、部分領域を使用せずに本発明を実施することもできる。この場合、対象部分領域の読み込み処理(ステップ603、ステップ903、ステップ1704)を削除する。そして、ステップ203の直後に、次の処理を追加する。流域抽出プログラム141は、最初に、ユーザに解析対象領域を指定させる。次に、指定された領域の標高データ192および海域データ193を読み込む。次に、海域データ193により海域と判別されたセルを、無効セルに指定する。さらに、ステップ203で無効セルが指定されている場合は、そのセルも無効セルとする。そして、無効セルの標高を負の無限大にする。
【産業上の利用可能性】
【0172】
以上述べたとおり、本発明によれば、流域に関する事前知識を要求しない流域抽出コンピュータプログラムが提供できる。このプログラムを用いることによって、コンピュータが使えるユーザであれば、専門家と同等の品質の流域抽出ができるようになる。
【符号の説明】
【0173】
100 PC
310 地図
302 下流端
401 水が流れる方向を示す線分
402 分水嶺を示す線分
701 上流探索処理における処理対象セルを示す点
702 標高データ192等をメモリに読み込んだ部分領域を示す矩形
1001 下流探索処理における処理対象セルを示す点

【特許請求の範囲】
【請求項1】
コンピュータを制御する流域抽出プログラムであって、
前記コンピュータは、
前記流域抽出プログラムが格納されるメモリと、前記メモリに格納された前記流域抽出プログラムを実行するプロセッサと、を備え、
地図上の複数の領域の標高を示す標高データを保持し、
前記複数の領域は、第1領域を含み、
前記流域抽出プログラムは、
前記第1領域に流れ込む水の流域を、前記標高データに基づいて上流方向に探索する第1手順と、
前記第1手順によって特定された流域が正しいか否かを判定する第2手順と、を前記プロセッサに実行させ、
前記第2手順において、前記特定された流域が正しくないと判定された場合、前記第1手順を再び前記プロセッサに実行させることを特徴とする流域抽出プログラム。
【請求項2】
前記複数の領域は、前記第1手順によって特定された流域に含まれない第2領域をさらに含み、
前記流域抽出プログラムは、さらに、前記標高データに基づいて、前記第2領域の下流の前記領域を特定する第3手順を前記プロセッサに実行させ、
前記第2手順は、前記第3手順によって前記第2領域の下流の領域として特定された領域が、前記第1手順によって特定された流域に含まれる場合、前記第1手順によって特定された流域が正しくないと判定する手順を含むことを特徴とする請求項1に記載の流域抽出プログラム。
【請求項3】
前記第3手順は、
前記第2領域の下流の領域から水が流出しないと判定された場合、前記標高データに基づいて、前記水が流出しないと判定された領域を含む窪地の範囲、及び、前記窪地に流れ込んだ水の流出口を特定する第4手順と、
前記窪地に流れ込んだ水が前記特定された流出口から流出するように、前記特定された窪地に含まれる各領域の下流方向を特定する第5手順と、を含み、
前記第3手順が実行された後に実行される前記第1手順において、前記第1領域に流れ込む水の流域を探索するために、前記第5手順によって特定された下流方向が使用されることを特徴とする請求項2に記載の流域抽出プログラム。
【請求項4】
前記第2領域は、前記第1手順によって特定された流域に含まれない領域のうち、前記第1手順によって特定された流域に隣接する領域であることを特徴とする請求項3に記載の流域抽出プログラム。
【請求項5】
前記流域抽出プログラムは、前記第1手順の前に、前記第1領域の指定を受ける手順を前記プロセッサに実行させ、
前記第1手順は、
前記第1領域を対象領域として選択する手順と、
前記標高データから算出された、前記対象領域に隣接する領域と、前記対象領域に隣接する領域にさらに隣接する領域との間の勾配に基づいて、前記対象領域に隣接する領域の下流方向を特定する手順と、
前記勾配に基づいて特定された下流方向、又は、前記第5手順によって特定された下流方向に基づいて、前記対象領域に隣接する領域が前記対象領域の上流であるか否かを判定する手順と、
前記対象領域に隣接する領域が前記対象領域の上流であると判定された場合、前記対象領域に隣接する領域を前記流域内の領域として特定する手順と、
前記対象領域に隣接する領域が前記対象領域の上流であると判定された場合、前記対象領域に隣接する領域を新たな前記対象領域として選択する手順と、を含むことを特徴とする請求項3に記載の流域抽出プログラム。
【請求項6】
前記第3手順は、さらに、
前記第2領域を対象領域として選択する手順と、
前記標高データに基づいて、前記対象領域と、前記対象領域に隣接する領域との間の勾配を算出する手順と、
前記勾配に基づいて、前記対象領域に隣接する領域が前記対象領域の下流であるか否かを判定する手順と、
前記対象領域に隣接する領域が前記対象領域の下流であると判定された場合、前記対象領域に隣接する領域を、前記第2領域の下流の領域として特定する手順と、
前記対象領域に隣接する領域が前記対象領域の下流であると判定された場合、前記対象領域に隣接する領域を、新たな前記対象領域として特定する手順と、
前記対象領域に隣接する複数の領域の全ての前記標高が、前記対象領域の前記標高より高い場合、前記対象領域から水が流出しないと判定する手順と、を含むことを特徴とする請求項3に記載の流域抽出プログラム。
【請求項7】
前記第3手順は、さらに、前記対象領域に隣接する領域が前記第1領域の上流であるか否かを判定する手順を含み、
前記対象領域に隣接する領域が前記対象領域の下流であると判定され、かつ、前記対象領域に隣接する領域が前記第1領域の上流でないと判定された場合、前記流域抽出プログラムは、前記第3手順に含まれる手順のうち、前記対象領域に隣接する領域を前記第2領域の下流の領域として特定する手順を前記プロセッサに実行させないことを特徴とする請求項6に記載の流域抽出プログラム。
【請求項8】
前記第3手順は、さらに、前記対象領域に隣接する領域が海である場合、前記対象領域に隣接する領域の標高が所定の値より低い場合、及び、前記対象領域に隣接する領域が前記第1領域の上流でないことを示す情報が入力された場合、の少なくとも一つの場合に、前記対象領域に隣接する領域が前記第1領域の上流でないと判定する手順を含むことを特徴とする請求項7に記載の流域抽出プログラム。
【請求項9】
前記第4手順は、
前記水が流出しないと判定された領域を前記窪地内の領域として特定する手順と、
前記窪地に隣接する領域の一つを対象領域として選択する手順と、
前記対象領域の標高が、前記窪地に隣接する全ての領域の標高の最低値と同一である場合、前記対象領域を、新たな前記窪地内の領域として特定する手順と、
前記窪地外の領域のうち、前記新たな窪地内の領域に隣接する領域の標高が、前記新たな窪地内の領域の標高より低い場合、前記新たな窪地内の領域に隣接する領域を前記窪地に流れ込んだ水の流出口として特定する手順と、を含むことを特徴とする請求項3に記載の流域抽出プログラム。
【請求項10】
前記コンピュータには、表示装置が接続され、
前記第1手順は、さらに、前記第1手順が実行されていることを示す情報を前記表示装置に表示させる手順を含み、
前記第3手順は、さらに、前記第3手順が実行されていることを示す情報を前記表示装置に表示させる手順を含むことを特徴とする請求項3に記載の流域抽出プログラム。
【請求項11】
前記流域抽出プログラムは、さらに、前記対象領域が選択された後、前記選択された対象領域を含む複数の領域の標高データを読み込む手順を含むことを特徴とする請求項5、6又は9のいずれか一つに記載の流域抽出プログラム。
【請求項12】
水の流域を抽出する流域抽出装置であって、
前記流域抽出装置は、
メモリと、前記メモリに格納されたプログラムを実行するプロセッサと、を備え、
地図上の複数の領域の標高を示す標高データを保持し、
前記複数の領域は、第1領域を含み、
前記流域抽出装置は、
前記第1領域に流れ込む水の流域を、前記標高データに基づいて上流方向に探索し、
前記上流方向の探索によって特定された流域が正しいか否かを判定し、
前記特定された流域が正しくないと判定された場合、前記上流方向への探索を再び実行することを特徴とする流域抽出装置。
【請求項13】
前記複数の領域は、前記上流方向への探索によって特定された流域に含まれない第2領域をさらに含み、
前記流域抽出装置は、さらに、
前記標高データに基づいて、前記第2領域の下流の前記領域を特定し、
特定された、前記第2領域の下流の領域が、前記上流方向への探索によって特定された流域に含まれる場合、前記上流方向への探索によって特定された流域が正しくないと判定することを特徴とする請求項12に記載の流域抽出装置。
【請求項14】
前記流域抽出装置は、さらに、
前記第2領域の下流の領域から水が流出しないと判定された場合、前記標高データに基づいて、前記水が流出しないと判定された領域を含む窪地の範囲、及び、前記窪地に流れ込んだ水の流出口を特定し、
前記窪地に流れ込んだ水が前記特定された流出口から流出するように、前記特定された窪地に含まれる各領域の下流方向を特定し、
前記窪地に含まれる各領域の下流方向が特定された後に実行される前記上流方向への探索において、前記第1領域に流れ込む水の流域を探索するために、前記特定された下流方向を使用することを特徴とする請求項13に記載の流域抽出装置。

【図1】
image rotate

【図2】
image rotate

【図5】
image rotate

【図6】
image rotate

【図9】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図3】
image rotate

【図4】
image rotate

【図7】
image rotate

【図8】
image rotate

【図10】
image rotate


【公開番号】特開2010−282349(P2010−282349A)
【公開日】平成22年12月16日(2010.12.16)
【国際特許分類】
【出願番号】特願2009−134067(P2009−134067)
【出願日】平成21年6月3日(2009.6.3)
【出願人】(000233044)株式会社日立エンジニアリング・アンド・サービス (276)