地形解析 ― C++言語による地理情報処理の事例(その1)

小方 登


ここでは,格子型デジタル標高モデル(DEM)の形で保持される地形データから,斜面の性質などを示す値を算出する例を示します。データは mapRaster2 形式で保持されているものとし,プログラミングの簡便性を考慮してコンソール・アプリケーションとして実装・実行します。

ここで提示するのはソースコードおよび使用法など最小限の情報であり,原理や応用の説明は授業・ゼミ等で行っています。以下に掲げるソースコードのファイル拡張子は,ブラウザで見やすいよう".txt"になっていますが,C++処理系に適するよう".cpp"などに改め,コンソール・アプリケーションとして作成してください。


mapRaster2 データの処理

(1) maprRaster2 データの処理

C++ソースコード‥‥mrproc.txt

上記のソースコードをテンプレートとして,実行したい処理を記述してください。この例では,3×3のカーネルを用いた空間演算を行う場合,縁の部分でも処理ができるように,対象領域の四辺に沿ってデータを外挿しています。このソースコードの例では,ラプラシアン演算を行っています。

使い方‥‥Windowsのコマンドプロンプトから以下のようにキー入力してください("yoshida.mr2"は処理対象の mapRaster2 ファイル)。

C:\>mrproc yoshida.mr2

結果は画面に表示されます。mapRaster2 で視覚化するためには,以下のように結果をファイルにリダイレクトしてください。

C:\>mrproc yoshida.mr2 > yoshida_01.mr2

(2) 斜面性質(斜面方位・傾斜)の算出

C++ソースコード‥‥slope.txt

このプログラムでは,標高を表す mapRaster2 形式のラスターデータ(デジタル標高モデル:DEM)から,斜面性質(斜面方位・傾斜)を計算しています。ソースコードは,上の(1)に加筆する形になっており,3次元ベクトルを表す構造体"vect3d"と,3点を通る平面の法線ベクトルを求める関数"normv( )"を定義しています。計算は,注目する標高点と隣接4点がつくる4つの三角形の各法線ベクトルを平均して注目点上の法線ベクトルとし,そのX, Y, Z成分から斜面方位や傾斜を求めます。斜面方位か傾斜かは,コマンドラインの第1パラメータに '-a' もしくは '-g' を選んで指定してください。ここで用いられた計算方法は,mapRaster2 に実装したのと同等のものですが,教育用資料としてここに掲載しました。

使い方‥‥斜面方位を算出する場合は,Windowsのコマンドプロンプトから以下のようにキー入力してください。

C:\>slope -a yoshida.mr2 > yoshida_asp.mr2

傾斜を算出する場合は,以下のようにキー入力してください。

C:\>slope -g yoshida.mr2 > yoshida_grd.mr2

適用結果はこちらをご覧ください。

(3) Zevenbergen and Thorne (1987) の方法に基づく斜面性質の算出

C++ソースコード‥‥quad.txt

注目標高点とそれを取り囲む8点の合計9点を通る2次曲面について,その多項式の係数から,傾斜・斜面方位・断面曲率・平面曲率を求めます。傾斜・斜面方位を求める場合,結果は上記 (2) のように角度の単位で出力されるわけではありません。平面曲率を求めるときは,以下のようにキー入力してください。

C:\>quad -pl yoshida.mr2 > yoshida_pl.mr2

適用結果はこちらをご覧ください。

(4) 稜線・水系線の抽出

バーロー著,安仁屋・佐藤訳『地理情報システムの原理』(古今書院:訳書は1990年刊)64〜65ページには,稜線および水系線の簡単な抽出方法が述べられています。上の(1)を加工する形で,これらの手順をプログラムに実装しました。

稜線抽出のためのプログラムのC++ソースコード‥‥ridge.txt

水系線抽出のためのプログラムのC++ソースコード‥‥drain.txt

適用結果はこちらをご覧ください。

(5) 水文学的モデリング

上記(3)で行う水系線抽出は,単に地形面の「下に凸」の部分を取り出すやり方で行われますが,ここでは地形モデル(DEM)上の各地点に落ちた雨水が,仮想的な地形面上を流下する道筋をシミュレートすることに基づいて,水系線の抽出を試みています。具体的には,雨水が落ちたあるセルに隣接する8つのセルのうち,どれが最大下降傾斜を示すかを特定することを繰り返して,流路をシミュレートします。この手順をすべてのセルに行い,各セルが流路となった回数を積算して,水系データとします。

格子DEMの宿命として,現実には存在する流路がモデル上では塞がれることが頻繁に生じ,また平坦な谷底や平野に到達すると最大下降傾斜方向を一意に特定できないことになりますので,シミュレートされた流路は途中で途切れます。最大下降傾斜方向のみに基づく,単純なアプリケーションを以下に示します。

水文学的モデリングのためのプログラムのC++ソースコード‥‥stream.txt

平坦な領域に到達しても,流路を探索できるように改良したアプリケーションを以下に示します。ただし,流路方向の特定にあたり,客観的な根拠があるわけではないので,現実に即しない誤った流路となる可能性(たとえば支流をさかのぼる)も残されています。実際に地形モデルに適用した結果を見ると,上の例に比べて流路のつながりはかなり改善されていることが分かります。

水文学的モデリングのためのプログラム(その2)のC++ソースコード‥‥stream2.txt

適用結果はこちらをご覧ください。水文学的モデリングのプログラム作成に当たっては,以下の書籍を参考としました。