簡単な地形解析例:

 接峰面図,接谷面図,起伏量図,比較的規模の大きな地形変換線の抽出

Nov. 15, 2010作成開始 Jan. 6, 2011更新

はじめに

 grass-gisのr.mapcalcコマンドを主として使う。基礎資料は,

 升本眞二, 1999, 2002. GRASS GIS入門. http://www.sci.osaka-cu.ac.jp/~masumoto/vuniv99/ http://www.sci.osaka-cu.ac.jp/~masumoto/vuniv2000/gex07.html 
 Marji Larson, Michael Shapiro, and Scott Tweddale, 1991. Performing Map Calculations on GRASS Data: r.mapcalc Program Tutorial
 Marji Larson, Michael Shapiro, and Scott Tweddale, 1991. Performing Map Calculations on GRASS Data: r.mapcalc Program Tutorial. http://grass.osgeo.org/gdp/raster/mapcalc.pdf
 FlorianWobbe, 2007. Geomorphological parameter extraction in GRASS GIS Isobase map calculation. http://www.rsg.tu-freiberg.de/twiki/bin/view/Main/GeomorphologyGrassGIS.
 Markus Neteler and Helena Mitasova, 2007. Open Source GIS: A GRASS GIS Approach [ver. 3, Paperback]. $87 http://www.amazon.com/Open-Source-GIS-GRASS-Approach/dp/1441942068/ref=ntt_at_ep_dpt_1 なお,この翻訳が出ている。植村哲士さんによるもの。翻訳がこなれていないし単純ミスもかなり多いが,日本語はやっぱり読みやすいし,4600円と安い。featureを地理実体と表現。地物という言葉が地図学などで定着してきたのに気になる。後ろの索引には,地理実体(地物)とされているので承知されているのではあるが。

 コマンドの使用法は組み込まれたヘルプか,http://grass.osgeo.org/gdp/html_grass64/gis.m.html を使用すること。

 ここでは,北摂山地を例に実施する。使用したdemは国土情報基盤標高10mメッシュから今回作成したものである。

 マトリックスオペレータと分析地域の限定 

 一種のマトリックスオペレータの最も簡単なものは評価点の周囲8セル値を使うもので周囲の8セルを8近傍といい,3x3の窓を構成するが,5x5の窓(8+16近傍)も可能である(下の図参照,升本,2002. p.37-,の3x3の図に追加)
 かなり対象地域が広く解像度が10mなのでメモリが多くないと環境によっては計算が困難になると想定したが現在のPC環境では一瞬で計算が可能になった。。5x5のマトリックスオペレータを次ぎに示す。青色の部分は8近傍,橙色の部分は評価したいセルである。近傍のセルはa [南方向j, 東方向i]のように,評価したい中央のセルからの距離で表す。aは処理対象のdemファイルを指している。

 matrix

図 matrix_operator.jpg

 ラスタデータの分析範囲の限定 を参照して,計算領域を限定するために,茨木市域が完全に入るようregionを設定しなければならないと考えていたが,北摂山地全域の10mメッシュの計算も容易になった。
 一応,茨木市域が完全に入るregionを示ておく。

 g.region -p
projection: 1 (UTM) zone: 53 datum: towgs84=0,0,0,0,0,0,0 ellipsoid: grs80 
north: 3866335 south: 3847675 west: 544550 east: 556160
nsres: 10 ewres: 10 rows: 1866 cols: 1161 cells: 2166426

 

I 地形の平滑化: 接峰面図

 Grassの上記demを持つ日本測地系2000のUTM座標系のLocationであるUTM53-JGD2000の1ユーザーマップセットを開く。そして,gis.mのtcl/tkメーンメニューのRaster/map calculator,を選ぶ。 これで,r.mapcalculatorのコマンドに入ることができる。下記の情報から,現在使用中のGrass 6.4では下記の情報のように問題がある。

http://osgeo-org.1803224.n2.nabble.com/r-mapcalc-in-ssh-session-td1886474.html 中のコメント: The above syntax is valid for the r.mapcalculator script which is used by gis.m, but not for r.mapcalc itself. You need to use either: GRASS_OVERWRITE=1 r.mapcalc 'test = pnm*pbl4' or: r.mapcalculator amap=pnm bmap=pbl4 formula=A*B outfile=test --overwrite In 6.4, r.mapcalc doesn't use the standard command-line parser, which is part of the reason why r.mapcalculator exists and is used by gis.m. In 7.0, r.mapcalc uses the command-line parser. This means that it supports --help, --overwrite, --ui etc, but it also means that you either have to specify the option name explicitly.

 さてRaster/map calculatorで,optionsタブのみを持つパネルが表示される。ここでExpert mode, Do not overwrite existing mapという二つのオプションいずれにもチェックを入れる。demファイル名を選ぶ必要がある。A:の欄で,aroundHokiTakatsukiUTM10mを選ぶ。

 

I.1 10mメッシュ

 demの各セルの周囲8セル近傍の標高値の最高点を求めることになる。その関数はmaxである。計算式は次のようになる。
 Name for output raster map:欄に,summitplane25(近傍点と評価点の個数が25だから自分の記憶のために 3x3ならば9とする)を入力する。Formulaの欄には次のよう。
 25点のうちで最も高い値を選ぶ場合: 近傍点や評価点の順序は任意である。対象マップはamapなのだが,式中ではAとする必要がある。  max(A[-2,-2],A[-2,-1],A[-2,0],A[-2,1],A[-2,2],A[-1,-2],A[-1,-1],A[-1,0],A[-1,1],A[-1,2],A[0,-2],A[0,-1],A[0,0],A[0,1],A[0,2],A[1,-2],A[1,-1],A[1,0],A[1,1],A[1,2],A[2,-2],A[2,-1],A[2,0],A[2,1],A[2,2])  
 MacOSX Grass 6.4.0での失敗例: Output- GIS.mのウィンドウには式(r.mapcalculator -e -o amap=aroundHokiTakatsukiUTM10m@PERMANENT {formula=max(A[-2,-2],……,A[2,2])} outfile=summitplane25 help=-)が現れてその後,数分なにも現れないかった。計算過程がMap Displayの下段に出ていた。いわば計算過程が脈拍のように見えた。ハードディスクがぶんぶんと音を立てていたが18時間余り待って計算を諦めた。結局,MacOSXのGrass 6.4.0では,r.mapcalculatroができないことがわかった。別記しているが,winGrass 6.4.0では問題なく実行できた。

 3x3式は次のよう: max(A[-1,-1],A[-1,0],A[-1,1],A[0,-1],A[0,0],A[0,1],A[1,-1],A[1,0],A[1,1])

 この接峰面図からソースdemを差し引くといわば侵食量が出ることになるが,この侵食量が何を意味するのか難しい。計算は,amapをこの接峰面図,bmapをソースdemとすると,計算式は,A-B,で求めることができる。接峰面図は地殻変動による地形,ソースdemは侵食後の現在の地形とされる。ソースdemの解像度が10mであるから,5 x 5の窓でフィルタリングしたので,50m x 50m領域について最高値が選択されている。50m四方の領域が接峰面として適当かどうかわからない。ただ多くのgisソフトの既定値となっている。  とはいえ,A-Bの値の分布は50m四方の枠に対応した斜面の低下を反映するので,このオーダーでの物質量の減少量の違いを反映することになるであろう。このソースdemのうち,北摂山地には比較的大規模に開発された1000戸規模の住宅団地やゴルフ場や墓地が分布している。こういった所では平坦化されているのでA-Bの値はゼロに近い値を示すことになるであろう。

 さて,次の図に東西37km余り南北12km弱の矩形領域での原図と,3x3マトリックスオペレータで作った接峰面図の小部分を示す。

この下の左の図は,10mメッシュdem画像。

原図

この下の図は,3x3 接峰面図。


両図は,かすかに異なる。3x3接峰面図の峰がわずかに太っている。

 これは当然のものであった。通常,谷埋めの接峰面図を作るのに2万5千分の1地形図では1cmもしくはより大きい谷口を埋める。つまり,250mである。メッシュ法なら,地形図に250mのメッシュを張り巡らして,メッシュ内の最高点をそのメッシュの高度とする。3x3は余りに小さい。
 そこで,r.region res=250 -dp,で解像度を250mにして3x3の計算の計算を実施した。1メッシュを250mにしたつもりである。

Region/Set region

g.regionの

(Wed Nov 17 17:06:04 2010)
g.region -p -e -m region=Hokusetsu_all@PERMANENT res=250
projection: 1 (UTM)
zone: 53
datum: towgs84=0,0,0,0,0,0,0
ellipsoid: grs80
north: 3865430
south: 3847950
west: 535545060
east: 535555710
nsres: 249.71428571
ewres: 247.6744186
rows: 70
cols: 43
cells: 3010
north-south extent: 17480.000000
east-west extent: 10650.000000
(Wed Nov 17 17:06:05 2010) Command finished (0 sec)

 結果を言うと,うまく行かなかった。実施した結果を次の図(750m四方のつもり)に示す。

250m

この図は3x3(30m四方)と同様である。表示が250mメッシュであって,計算は10mメッシュのままであった。当然ではあるが,こういうコメントはどこにも無いので,g.region res=??? の意味が理解できる。さて,250mメッシュDEMを手に入れる必要がある。

 次ぎに示すが,解像度の変更を上のようにしてうまくいった。

I.2 接峰面図 250mメッシュ

I.2.1  g.regionを使って10mメッシュの解像度を250mに変更
 
次はg.regionのヘルプ
http://grass.fbk.eu/grass62/manuals/html62_user/g.region.html

I.2.2 現リージョンの確認
 gis.mでは,config/region/Display region settings
g.region -p
projection: 99 (Transverse Mercator)
zone: 0 datum: towgs84=0,0,0,0,0,0,0 ellipsoid: grs80
north: -101336.12370154 south: -138836.12370154 west: -57361.46681946 east: -22521.46681946
nsres: 10 ewres: 10 rows: 3750 cols: 3484 cells: 13065000

I.2.3 解像度を250mに変更
 gis.mでは,config/region/Change region settings,のパネルで,resolutionパネルを開いて,PrintパネルでPrint the current regionにチェック,Grid resolution 2Dを250に。OptionパネルでAllow overwriteを選択。

g.region -p res=250 --overwrite

projection: 99 (Transverse Mercator) zone: 0 datum: towgs84=0,0,0,0,0,0,0 ellipsoid: grs80
north: -101336.12370154 south: -138836.12370154 west: -57361.46681946 east: -22521.46681946
nsres: 250 ewres: 250.64748201 rows: 150 cols: 139 cells: 20850

 領域の変更はない。
 そして,保存すること。EffectsタブのSave current region settings in named region fileにeg. 250mresと入力して実行すること。 

g.region -p res=250 --overwrite

I.2.4 接峰面図の作成
 マック版ではmapcalcコマンドが使えないので,Windows版Grass6.4.0withMSYS を使用。
ここでは平面直角座標系のPERMANENTを選ぶ。

 r.mapcalc(Raster/Raster map calculator)
参考
http://grass.osgeo.org/gdp/raster/mapcalc-algebra.pdf 
http://grass.osgeo.org/gdp/raster/mapcalc.pdf
http://www.ing.unitn.it/~grass/docs/tutorial_64_en/htdocs/comandi/r.mapcalc.htm チュートリアル

コマンドベースでは下記のようにすればいいが,当方のMac版,Windows版では,r.mapcalculatorが動かない。

r.mapcalculator -eo amap=aroundHokiTakatsukiPlane6_10m@PERMANENT formula=max(A[-2,-2],A[-2,-1],A[-2,0],A[-2,1],A[-2,2],A[-1,-2],A[-1,-1],A[-1,0],A[-1,1],A[-1,2],A[0,-2],A[0,-1],A[0,0],A[0,1],A[0,2],A[1,-2],A[1,-1],A[1,0],A[1,1],A[1,2],A[2,-2],A[2,-1],A[2,0],A[2,1],A[2,2]) outfile=summitplane25cells --overwrite

 Windows版Grass6.4.0withMSYSのgis.mにしか対応しないので,Raster/Raster map calculator/で開くパネルのName for new raster map to createにsummitplane25cells,Insert existing raster mapにaroundHokiTakatsukiPlane6_10m@PERMANENT,そしてExpressionに以下の式を入れる。この式で前述のようにmax(A[-2,-2],A[-2,-1],A[-2,0],A[-2,1]などと略号が使えればいいのだが。なお,この式中に一切スペースは入れてはならない。
 max(aroundHokiTakatsukiPlane6_10m@PERMANENT[-2,-2],aroundHokiTakatsukiPlane6_10m@PERMANENT[-2,-1],aroundHokiTakatsukiPlane6_10m@PERMANENT[-2,0],aroundHokiTakatsukiPlane6_10m@PERMANENT[-2,1],aroundHokiTakatsukiPlane6_10m@PERMANENT[-2,2],aroundHokiTakatsukiPlane6_10m@PERMANENT[-1,-2],aroundHokiTakatsukiPlane6_10m@PERMANENT[-1,-1],aroundHokiTakatsukiPlane6_10m@PERMANENT[-1,0],aroundHokiTakatsukiPlane6_10m@PERMANENT[-1,1],aroundHokiTakatsukiPlane6_10m@PERMANENT[-1,2],aroundHokiTakatsukiPlane6_10m@PERMANENT[0,-2],aroundHokiTakatsukiPlane6_10m@PERMANENT[0,-1],aroundHokiTakatsukiPlane6_10m@PERMANENT[0,0],aroundHokiTakatsukiPlane6_10m@PERMANENT[0,1],aroundHokiTakatsukiPlane6_10m@PERMANENT[0,2],aroundHokiTakatsukiPlane6_10m@PERMANENT[1,-2],aroundHokiTakatsukiPlane6_10m@PERMANENT[1,-1],aroundHokiTakatsukiPlane6_10m@PERMANENT[1,0],aroundHokiTakatsukiPlane6_10m@PERMANENT[1,1],aroundHokiTakatsukiPlane6_10m@PERMANENT[1,2],aroundHokiTakatsukiPlane6_10m@PERMANENT[2,-2],aroundHokiTakatsukiPlane6_10m@PERMANENT[2,-1],aroundHokiTakatsukiPlane6_10m@PERMANENT[2,0],aroundHokiTakatsukiPlane6_10m@PERMANENT[2,1],aroundHokiTakatsukiPlane6_10m@PERMANENT[2,2])

I.2.5 出力結果の検討

 上記の結果を次ぎに示す。

 1ピクセルが250mで近傍2周分だから,中心セルを含めて縦横共,5セル分で1250mのうちの最大値の分布が示されている。等高線は参考のために10mメッシュから作成した5m間隔のものである。等高線からみえる谷筋が完全に無くなっている。北摂山地域の地殻変動を考える上では大変参考になるものである。接谷面図も併せて作って差し引くことで大規模の削剥傾向を捉えることができるであろう。
 通常,接峰面図は起伏量図はより小規模のものである。2万5千分の一地形図で作業する場合,250mの谷埋めを実施する。この発想でゆくと,リージョンの解像度を50mとして近傍2周を実施すると得ることができる。これを次ぎに実施する。
 

I.2.5  リージョンの解像度を50mとして近傍2周で接峰面図の作成

 さて,上記の方法に倣って実施して欲しい。その結果を次ぎに示す。

次の図は解像度10mの原図に地形断面である。

次の図は解像度50mで2周セルの最大値の接峰面図に対する地形断面図である。

 上の両図の平面図も断面図も比較すると,小さな谷が埋められていること,大きな谷が浅くなっていることがわかる。マトリックス数は同じとして,解像度の違いによる埋谷の違いは,地史的に何を意味するのだろうか。この問いかけに対する回答の模索は過去いくつか試みられてきたのであるが,正しく成功と呼べるものは無いだろう。まあ,解像度250mの縦横1250mの枠については,その起伏の形成(接峰面図マイナス接谷面図)は内因に求められ,解像度50mの縦横250mの枠については,その起伏の形成(接峰面図マイナス接谷面図)は外因に求めてもいいのではと感じられるのである。というわけで,接谷面図は必須のものとなる。

 

II 地形の平滑化: 接谷面図

 25点のうちで最も低い値を選ぶと接谷面図が得られる。上式のmaxの代わりにminを使う。出力ファイル名はbottomplane25(解像度250mならばbottomplane_250m_25cells)とする。  min(A[-2,-2],A[-2,-1],A[-2,0],A[-2,1],A[-2,2],A[-1,-2],A[-1,-1],A[-1,0],A[-1,1],A[-1,2],A[0,-2],A[0,-1],A[0,0],A[0,1],A[0,2],A[1,-2],A[1,-1],A[1,0],A[1,1],A[1,2],A[2,-2],A[2,-1],A[2,0],A[2,1],A[2,2])  

 接谷面図の意味は接峰面図以上に難しい。 河床縦断面図は河系間または河系内の傾斜分布を線上で知ることができるが,面的に分布を捉えることはほとんどできない。それに対して,接谷面図は河谷底の高度分布を知ることができ,傾斜変換線や傾斜の穏やかな平面を知ることができる,筈である。

 次の図は解像度250mの25cells接谷面図

 もう一つのこの図は解像度50mの25cells接谷面図

 

III 地形の平滑化: 起伏量図  

 地形の凹凸を示すものである。ここの例では,接峰面図から接谷面図を差し引くことで得ることができる。  
 r.mapcalculator -e -o amap=summitplane@PERMANENT bmap=bottomplane@PERMANENT {formula=A-B}  もちろん,gis.mで実施する。
 起伏量図は値が大きいほど凸凹量が大きい。小さい値が続く場合は平坦性を示す。海抜高度が高くて平坦性がある場合は,これから開析される。海抜高度が低くて平坦性がある場合は,侵食の点から言えば平衡に達している可能性が高い。起伏量が異なる広がりを持った二つの領域の境界は一般に大きな地形境界と言える。

 次の図は解像度250mの25cells起伏量図

 次の図は解像度50mの25cells起伏量図

 

IV 地形の鮮鋭化: 地形境界の検出  

 ラプラシアン Laplace operator or Laplacian を使って,画像の濃度の急激な変化を検出(エッジ検出という)することができる(升本,1999)。

画像の特徴抽出フィルタ
http://www.clg.niigata-u.ac.jp/~tsai/home-page/lecture/2007-Processing_3.pdf

Visual C++ 2005 Express Edition を用いた易しい画像処理(5)
http://homepage3.nifty.com/ishidate/vcpp05_g5/vcpp05_g5.htm

IV.1 二次元離散ラプラシアン

IV.1.1 5点差分または4近傍,9点差分または8近傍
 dem高度の場合,地殻変動や侵食による急崖を求めることができる。評価点の隣接濃度値を使って計算するので解像度50mの場合,東西南北150m範囲でのエッジが検出されることになる。
 まずは離散近似式を使ってr.mapcalcでラプラシアンを求める。ソースdemをamapとすると,  (A[1,0]+A[-1,0]+A[0,1]+A[0,-1])-4*A[0,0]  である。この値の絶対値の大きいところがエッジなので,この絶対値を取る必要があり,abs((A[1,0]+A[-1,0]+A[0,1]+A[0,-1])-4*A[0,0]) となる。ファイル名はLap4sharp_50resなどとする。これは東西・南北方向の比較で,斜め方向がない。
 東西・南北そして対角線方向を考える場合,A[-1,-1]+A[0,-1]+A[1,-1]+A[-1,0]+A[1,0]+A[-1,1]+A[0,1]+A[1,1])-8*A[0,0] となる。絶対値では,abs(A[-1,-1]+A[0,-1]+A[1,-1]+A[-1,0]+A[1,0]+A[-1,1]+A[0,1]+A[1,1]-8*A[0,0])となる。 ファイル名はLap8sharp_50resなどとする。
 さて,次の例図を参照してほしい。

http://www.clg.niigata-u.ac.jp/~tsai/home-page/lecture/2007-Processing_3.pdf の一コマ(もともとの画像が歪んでいる)。
 上の図では左端の原画像内の黒枠内の9セルと右上のラプラシアンフィルターのそれぞれの対応点の積和が評価点になる。計算法を次ぎに示している。

http://homepage3.nifty.com/ishidate/vcpp05_g5/vcpp05_g5.htm

 評価点とその8近傍でどの程度の差をつけるのかは難しい。この例で示されている評価点を9として周辺を-1とすることで,エッジが強調されている。この方法では絶対値を使わない。
 先に示した A[-1,-1]+A[0,-1]+A[1,-1]+A[-1,0]+A[1,0]+A[-1,1]+A[0,1]+A[1,1])-8*A[0,0] では,評価点の8近傍の濃度値の和から評価点の8倍の濃度値を差し引いている。この演算は,評価点が近傍の平均値と同じならばゼロになる。計算式の絶対値が大きいほどエッジの程度が高いという形である。
 これに対し,例図の場合は,近傍値に-1を掛けて,評価点を8ではなく,+9としている。

abs(A[-1,-1]+A[0,-1]+A[1,-1]+A[-1,0]+A[1,0]+A[-1,1]+A[0,1]+A[1,1]-8*A[0,0])の作業結果を次ぎに解像度を変えて示す。

 さて,まず解像度250mにして8近傍で

 次ぎに,解像度50mにして8近傍で

 最後に,もともとの解像度10mにして8近傍で

 以上から見ると,線状構造をみるのは,解像度が高い方が妥当に見える。とはいえ,線状のエッジ表現が不明瞭である。下記のように評価点を2倍にして絶対値記号を外して実施してみる。

 16*A[0,0]-(A[-1,-1]+A[0,-1]+A[1,-1]+A[-1,0]+A[1,0]+A[-1,1]+A[0,1]+A[1,1])
  実際はここではAの代わりに具体的なマップ名が入る。
16*aroundHokiTakatsukiPlane6_10m@PERMANENT[0,0]-1*(aroundHokiTakatsukiPlane6_10m@PERMANENT[-1,-1]+aroundHokiTakatsukiPlane6_10m@PERMANENT[0,-1]+aroundHokiTakatsukiPlane6_10m@PERMANENT[1,-1]+aroundHokiTakatsukiPlane6_10m@PERMANENT[-1,0]+aroundHokiTakatsukiPlane6_10m@PERMANENT[1,0]+aroundHokiTakatsukiPlane6_10m@PERMANENT[-1,1]+aroundHokiTakatsukiPlane6_10m@PERMANENT[0,1]+aroundHokiTakatsukiPlane6_10m@PERMANENT[1,1])

 しかしながら,どうしてもこの計算した結果のマップが作成されない。実行時のエラーは発生しない。種々試行錯誤したが。


IV.1.2 地形境界の鮮鋭化 
 demの解像度に当然依存するが,地形面を表現したい場合には,ソース画像からラプラシアンを引く方法が用いられる。それゆえ,9点差分または8近傍の場合は,aroundHokiTakatsukiPlane6_10m@PERMANENT-Lap8sharp_10mres などという演算式になる。地形境界の鮮鋭化された画像のファイル名をLap8SharpSurface_10resなどとする。

 次の図Lap8SharpSurface_10resが結果。

 次の図は原図。

   10mメッシュの解像度ではこのように山地部の谷線が明瞭になっている。

  Lap8SharpSurface_10resからLap8SharpSurface_10res_contours5mを作成した。その結果を次ぎに示す。エッジがより強調される。

以 上