作成 Mar. 17, 2011 修正May 1, 2011

I. 数値地図250mメッシュ標高のGrassへの取り込み Nov. 24, 2010作成
II. レーザーdemのGrassへの取り込み(失敗) Mar. 18, 2011作成 May 1, 2011修正
III レーザーdemのGrassへの取り込み xyz.csvファイルの旧測地系から世界測地系の変換とGrassでの利用 May 1, 2011

 

I. 数値地図250mメッシュ標高のgrassへの取り込み 

Nov. 24, 2010作成  5mと10mの標高データは公開されているが,250mメッシュ標高は公開されていない(北方四島のみ)。接峰面図などを求めるには10mメッシュでは使い物にならない。これをgrassに取り込むまでの流れをここに示す。

 

1. 250mメッシュCDロムの購入

 日本地図センター http://www.jmc.or.jp/data/sem.html から購入できる。ぼくの場合はamazon(送料無料)から購入した。 商品名 : 数値地図250mメッシュ(標高) 価格(税込):7,500円 販売枚数:CD-ROM1枚 整備地域:全国 添付ソフト:あり。ファイル仕様:http://www.jmc.or.jp/data/sem/doc/index.htm。平成9年7月1日発行のcdについては訂正する必要がある http://www.gsi.go.jp/DIFF/index250.htm
 東京で二泊三日して楽しく過ごして帰ってきたらアマゾンから届いていた。国土地理院のサイトでは何度か?訂正版が出たようであるが,アマゾンから届いたのはまさに訂正が必要なH.9(1997)年7月1日発行のもの。これなら,買わずに前述のページからダウンロードすればよかったとは思ったが,第一次メッシュの小笠原諸島と対馬のみ。
 ダウンロードするものは,250m(標高 .SEM),1km(標高 .TEM),1kmav(平均標高 ..AV.TEM)である。それぞれに,3942(小笠原諸島の母島), 4042(小笠原諸島の父島), 4142(小笠原諸島の嫁島など), 5129(対馬の北縁を除いた全部)を冠するファイルが解凍後,保存される。

 表示ソフトでは世界測地系で示されるが,データそのものは旧日本測地系である。地球面上の位置情報は個々の高度毎には記述されていない。1ファイルに1次メッシュ(地勢図一枚)分の高度情報(小数点以下1桁だが必ずそれは0になっている)が入っている。「2次メッシュ(2万5千分の1地形図一枚)を経度方向及び緯度方向に40等分して得られる各区画(1/4細分メッシ ュ、2万5千分1地形図上で約1cm)の中心点の標高値が記録されています。標高点間隔 は、緯度(南北)方向で7.5秒、経度(東西)方向で11.25秒となり、実距離では約 250mとなります。」

 ファイルヘッダコードの構造は次のページ http://www.jmc.or.jp/data/sem/doc/f250m2.htm に。
 ここに旧測地系,世界測地系での図面四隅の情報も掲載されているが,世界測地系の数値は同梱されている表示ソフトのためで,XYZに対応する数値データは日本の旧測地系である。

 

2. まずはsurfer用に変換

 「数値地図と汎用ソフトを利用した図化・解析」 http://gis-okinawa.sakura.ne.jp/report/pdf/rep002.pdf には250mメッシュのフォーマット変換の方法が記されている。当方はsurferとそのプラグインを持っているので,ここで紹介されている手作業は省略する。  SurferはGolden Software http://www.goldensoftware.com/ 製である。このサイトから直接購入すると割安である。潟激Aックスのページ http://www.raax.co.jp/pdt_soft/surfer/surfer.html には日本語での機能などの説明がある。ここで提供している地形図作成用 数値地図コンバーター http://www.raax.co.jp/pdt_soft/surfer/surfer_map.html 作業/地形図作成用%E3%80%80数値地図コンバーター%20Surfer.webarchive が大変便利である。50mメッシュ標高,250mメッシュ標高,1kmメッシュ標高,1kmメッシュ平均標高を最大3×3枚までの地形図を組み合わせることができる。Surferを呼び出してグリッドデータを作成する。

 2.1 数値地図コンバーターを立ち上げて,ファイル|地図を開く,で,CDロムのzumei.csvを選ぶ。そして,この例では5235京都及び大阪を選ぶと,一次メッシュが京都及び大阪,を中心に現れる。今回の分析対象地域はこの範囲内にあるから,改めて,ファイル|単ファイル変換,を選ぶ。  そして,メッシュファイルの参照でDATA\250Mフォルダを選ぶ。併せて,ファイルの種類を,250mメッシュ(*.sem)とする。多くのファイルから5235.semを選ぶ。

 2.2 変換先ファイル,として,参照を選んで,適当な名称を作る。XYZ形式のcsvファイルとなる。このファイル変換のパネルで, Surfer呼び出し,gridデータ変換にチェックを入れる。

 2.3 上図のように,Surfer呼び出し,gridデータ変換にチェックを入れると, ぼくの環境では3〜4分経過後,完了し,変換先で指定したファイル名称にテキストファイル.csv(5235_250.csv)とSurfer用グリッドファイル.grd(5235_250.grd)が作成される。.grdファイルを作らないとsurferで見ることができない。下の図がそれ。

 これは京都及大阪の地勢図と対照すると,対応していることがわかる。南西部の濃い線の部分は大阪湾の海岸線(海面以下は-999.9で埋められているため海岸線付近は等高線が密集する)。ここから北東に伸びる白っぽい領域は淀川と琵琶湖。

 2.4 csv(comma-separated values)をエクセルMac2004で開こうとしたが無理だった。エクセルの最大行数は 65,536だ,と思い出した。このcsvは320×320=102,400行である。Macのテキストエディットを使うと一瞬で開く。さて,ネットで念のために調べるてみると,Windows用2007は最大1,048,576行だという。Mac2008で開いてみたら何と開いた。へえー。

 2.5 csvデータの構造をみる

 数値地図250mメッシュ(標高)の.semファイルの構造:  1ファイルが1次メッシュ(経度方向1度,緯度方向 40分,地勢図)の範囲である。この範囲で,経度・緯度いずれの方向(球面沿い)でも320等分されている。標高点間隔は,経度方向に11.25秒,緯度方向に7.5秒。標高値は 0.1m単位。csvファイル内で,西から東へ,そして北から 南に約250m間隔で並んでいる。

  数値地図コンバーターで得られたこの.csv(5235_250.csv)の構造: 数値地図250mメッシュ(標高)の.semファイルの構造を踏まえて,エクセルで見た3列102,400行の配列を観察する。なお,Surferの.csvはcolumns A, B, and Cそれぞれに,横軸位置座標x,縦軸位置座標y, その(x,y)での高度などの値zである。

 次のカットはcsvファイルの最上部である。y値は固定でx値が増加してゆく。北西隅から東に進む形を示す。

 次のカットは320行目で東端まで移動して,南に隣接する行の西端に移動して,また東に進む。X値は上のカットと同じ増分275.5で増えている。

 次のカットはこのファイルの終わりに近づいているがz値が -999.9は海域で,この付近では海抜0m,-1mが見られる。

 次のカットはこのファイルの終了部分である。y値は最も小さな値になっている。x値は最も大きな88022.3となっている。つまり,南東隅にあたる。

 

 以上から,この「京都及び大阪」の原点は南西隅であり,四隅のメッシュ座標値は次のようになる。

北西隅メッシュ座標値(137.8, 73964.3)    北東隅メッシュ座標値(88022.3, 73964.3)

南西隅メッシュ座標値(137.8,115.8 )     南東隅メッシュ座標値(88022.3, 115.8)

 さて,x軸方向のメッシュ座標値の間隔はすべて275.5である。メッシュの初期値が137.8ということは西端の境界値は0となり,東端は88022.3+275.5/2=88160.05だから,88160として良い。y軸メッシュ座標値については,最終行10400の115.8,最初の行の73964.3である。この差を319で割ると231.5となり,これを2で割ると115.75となりy座標値の初期値に一致する。それゆえ,北端は73964.3+115.75=74080.05となり,74080として良い。南端は0である。それゆえ,全領域は,

          北端座標値  y=74080

 西端座標値 x=0            東端座標値 x=88160

          南端座標値 y=0

 

3. 旧測地系地勢図の南北端,東西端の経緯度値からUTM座標値に変換 

 これまで見てきたように,位置座標(x,y)は,経緯度ではない。単位をmとする距離である。250mメッシュ(標高)データは2万5千分の1地形図上で経緯度方向ともほぼ250m間隔で計測して得られたものである。つまり,すでに球面をUTM図法で平面化されたものである。そして個々の測点の座標値はm単位で表されている。
 個々の地形図は旧日本測地系である。地勢図の矩形領域の経緯度は,旧測地系,世界測地系いずれもcdロムに同梱されているzumei.csvに記述されている。繰り返すが(x,y,z)値そのものは旧測地系のものである。想定される地球形も異なる。(x,y,z)値が分かっているので,この地勢図の矩形領域の南北縁,東西縁として世界測地系を採用してGrassのjgd2000の測地系をもったUTM53-JGD2000のLocationに取り込んでも問題はほぼないだろう。しかし,まあ,真面目にまずはGrassの旧測地系に取り込もう。
 さて,zumei.csvや紙媒体の地勢図から経緯度で矩形領域を次に示す。

           北端緯度  y=35d20'

 西端経度 x=135d00'            東端経度 x=136d00'

           南端緯度 y=34d40'

 Grassで取り込む際に,(Easting, Northing)で表現する必要がある。次のサイトを利用する。
http://homepage3.nifty.com/Nowral/21_UTM/21_UTM.html (Mac・GPS・Perl) 旧測地系での変換である。

 北西隅の経緯度は,(35d20',135d00')  ? UTM座標(X northing, Y easting)= (3909620.867 , 500000)
 南東隅の経緯度は,(34d40', 136d00') ? UTM座標(X northing, Y easting)= (3836152.643 , 591610.889)
 次の図は南東隅の出力である。

 

 この計算結果はOasisPhoto.com http://www.oasisphoto.com/navigation/convert_form.php のCoordinate Converter(DatumはBessel 1841を使用,UTM のzoneは53 S)を使った結果と一致している。Mac・GPS・Perl の世界測地系の計算プログラムには問題があるが,旧日本測地系の計算プログラムは問題がないので日本人が公開する大変重宝なサイトである。この下に北西隅と南東隅の計算出力結果を示す。

 これはOasisPhoto.comでの,北西隅の出力結果である。

 これはOasisPhoto.comでの,南東隅の出力結果である。

 

 比較のために,世界測地系で,計算してみよう。zumei.csvに掲載されている世界測地系での経緯度矩形領域を次に示す。

            北端緯度  y=35d20'11"

 西端経度 x=134d59'50"            東端経度 x=135d59'50"

            南端緯度 y=34d40'12"

   http://w01.tp1.jp/~a540015671/page02.html でこの世界測地系のUTM変換を実施する。
 北西の経緯度は,(35d20'11.0",134d59'50.0")  ? UTM座標(X, Y)= (3910348.353 , 499747.564)
 南東の経緯度は,(34d40'12.0", 135d59'50.0") ? UTM座標(X, Y)= (3836900.623 , 591363.639)
 

 この結果は,前述のOasisPhoto.com Coordinate Converter Latitude, Longitude <=> UTM プログラム(DATUMはWGS84)を使ったものと一致している。http://www.oasisphoto.com/navigation/convert_form.php

 下の図は北西隅の世界測地系の変換結果である。

 

 下の図は南東隅の世界測地系の変換結果である。

 

 

 なお,数値入力の際のページは次のように表示される。この図ではDatumとしてBessel 1841を選んでいる。

 

 

4. Grassへの取り込みのためのcsvファイル作成

 Grassのどのコマンドを使えばいいのだろうか。候補にあるのは,r.in.ascii,か,r.in.xyzである。GrassにはSurferのgrdファイルも取り込むことができる。フラッグ -s を使えば,SURFER (Golden Software) ASCII file will be imported とある。これはSurferのgrd(グリッド)ファイルである。さて前述のように,数値地図コンバーターを使って,250mメッシュデータからSurferを使ってグリッドファイル(5235_250.grd)が得られている。自動的に作られたグリッドをみると,4隅の座標値は元データと同じであるが,これ以外はかなりグリッド数が小さくなっている。250mメッシュデータから接峰面図などを作るには元の250m間隔の高度データが必要である。それゆえ,前述のcsvファイル(5235_250.csv)を取り込む必要がある。5235_250.csvにも,5235_250.grdにも,測地系のデータは全く失われている。経緯度またはUTM座標値ではなく,地勢図矩形領域の320×320の等間隔のメッシュ座標値(前述のように南西隅をゼロとする)と対応高度データだけである。

 さて, 5235_250.csvをエクセル上で,UTM座標系に変換する必要がある。5235_250.csvの(X easting, Y northing)の原点は,前述のように,左下(南西隅)で(0, 0),北東隅が(88160, 74080)となっている。この原点が,UTM座標値で(500000, 3836152.643)となっている。それゆえ,5235_250.csvでA列の値に500000をそれぞれ足し,B列に3836152.643をそれぞれ足せばいい。(ただ,不要なことではあるが,確認を容易にすべく,=round(A1,0)などとして四捨五入して使用している)。null値としての-999.9については-1000になるが,前述のようにzrange=-1, 2000としているから読み込まない。

 5235_250.csvの (x,y)値に(500000,3836152.643)を足した結果を見ると,UTM座標値を北辺部について,3909620.867を越えてしまう。これは世界測地系にしても同様である。この原因は5235_250.csvにあることがわかった。前述のように,メッシュ数は東西南北それぞれ320点あってメッシュ間隔は一定である。それゆえ,5235_250.csvの矩形領域と経緯度から変換した(Easting, Northing)矩形領域を一致させるべく,メッシュ間隔を変更する必要がある。
 南北については,74080k1/(3909620.867 - 3836152.643) =1を満たすk1は,0.99174168である。つまり,Northing値=y値*0.99174168+3836152.643,で得ることができる。東西についても同様に,k2=(591610.889 - 500000)/88160から,k2=1.0391435となる。それゆえ,Easting値=x値*1.0391435+500000となる。
 変換した結果のmaxとminを確認すると,Eastingは,max=591467.8009,min=500143.194,Northingは,max=3909506.122,min= 3836267.487 となって,20万分の1地勢図「京都及大阪」の旧測地系領域に完全に入ったことがわかった。
 なお,ここで注意しなければならないのは,Surferのx,yの使い方と,座標系のx,yの使い方の違いである。座標系ではNorthingつまり緯度がXで北方向,Eastingつまり経度がYで東方向を指す。Surferのxyzデータは,経度X,緯度Y,高度Zと並べる。

 5. grassへの取り込み

 5235_250.csvの座標値をUTMに変換することになる。Grassに取り込むコマンドは,r.in.xyzである。gis.mでは,aggregate ascii xyzに対応する。さて,r.in.xyz input=name output=name fs=, (field separatorで,csvだからカンマ)([x=integer] [y=integer] [z=integer],これは第1列がx値,第2列がy値,第3列がz値,なら不要) [zrange=min,max これは必要。というのは海域の-999.9をnull値とすることができず,min=-2 max=2000程にせざるを得ない] 。結局,試行錯誤の結果,次のようにした。
 gis.mで実施したがコマンドは次のよう。
 r.in.xyz {input=/Users/moto/grassdata/For_FileConvert_folder/5235_ 250UTM.csv} output=5235_250m_mesh type=FCELL fs=, x=1 y=2 z=3 zrange=-2,2000, zscale=1.0 percent=100 --overwrite
 g.regionでリージョンを確認すると,次のようになっている。
g.region -p projection: 1 (UTM) zone: 53 datum: tokyo ellipsoid: bessel north: 5500000 south: 2200000 west: 150000 east: 850000 nsres: 250 ewres: 250 rows: 13200 cols: 2800 cells: 36960000
 何故,rows/colsが上のように大きいのかはわからない。 かけ算をすると,103,488,000,000個。 確かに最初,regionをこの画像を使って設定して,表示された画像は,grassのdisplayの中央に点のように出た。
 取り込まれたdemの座標値の範囲を見るとぴったりと合っている。そこでこの範囲に限定するべく,g.regionで,existingタブで,Save as default regionにチェック。boundsタブで,上記データを入力。resolutionタブのGrid resolution 2D (both north-south and east-west)で250mを設定するとboundsでの指定が変形するので設定しない。
 つまり,g.region -s -p -e -a n=3909620.867 s=3836152.643 e=591610.889 w=500000 res=250 --overwriteとする。その結果,次のようになる。
 projection: 1 (UTM)
zone: 53
datum: tokyo
ellipsoid: bessel
north: 3909620.867
south: 3836152.643
west: 500000
east: 591610.889
nsres: 249.89191837
ewres: 250.30297541
rows: 294
cols: 366
cells: 107604
north-south extent: 73468.224000
east-west extent: 91610.889000 

 これこそ求めるものである。
 Scannerによる(x,y,z)結果を得ているが,この方法でGrassに取り込んで,複数のdemをpatchingすれば結合すると考えられる。

 

6. 表示してみて

 出来上がったaspectの図を見る。地形の概形を見るには接峰面図を作る必要がないことがわかる。次の図はRaster/Colorでaspect表示したものである。地勢図全域が現れている。


 大阪湾は白く抜け居ている。zrange=-2,2000 にした効果が現れている。もともとの250mメッシュデータでは海域は-999.9であるが,zrangeの指定で,voidになっている。 Map Displayでqueryアイコンをクリックして,大阪湾のこの白い部分を クリックすると,Easting値 | Northing値| | * |と表示される。

  北摂山地の部分を拡大したのが次のものである。ソースデータが解像度250mではかなり表現に限界があることがわかるであろうう。

 地形図を見て,北摂山地が川西市や池田市の谷口平野を作っている余野川で区分されると考えるのが通例だと思われるが,この図を見ると,茨木市の安威川の谷の方がより大きな分割境界であることが分かる。有馬高槻構造線が北摂山地の南縁を走るが,芥川の谷口がかなり広く,大きな崩壊を示していることも理解できる。

 後続のページで,

● 20万分の1地勢図の取り込み

 日本全国を揃えているので,これから取り込む。 Grassが推奨する方法はXY座標系のLocationに入れてから,UTMのLocationにgeorectifyの手法を使って移動する方法であるが,これは面倒なので,geotiff画像を直接,この旧測地系のLocationに入れる。geotiffの作成法はこのページの次ぎに示す。

● 接峰面図,接谷面図,そしてr.mapcalcでの演算,もこのページに続くページで記述する予定である。

 

II. レーザーdemのgrassへの取り込み

1. レーザースキャナーのDEMデータ(xyz.csv)の構造

 茨木市の防災関係部署の報告書を閲覧したら,偶然,2m DEMを見つけた。これまで茨木市役所で探し続けてきたものである。平成16年度(2004年)茨木市洪水ハザードマップ作成業務報告書の中に,航空レーザー計測データDVDが入っていた。報告書には生かされていない。作成企業に問い合わせたところ,日本測地系2000(後にこれが誤りであることが判明。旧測地系であった。May 1, 2011記),平面直角座標系6帯で,東京湾中等潮位からの海抜高度 T.P.表示。 メッシュサイズは2mであることがわかった。
 ファイル数と大きさは,73ファイル計408.5MB。ファイル番号は,06OC0935〜939,06OC1035〜1039,...,06OC1235〜1239, 06OC1338, 1339,...,06OC1638,1639,06OD0800〜804,...,06OD1601〜1604。
 各ファイルは,次のような表示になっている: 06OC0935_dem.csv。
 このファイルを開くと,
第1行


-44999

-129999

79.866

 この数値から第1列はeasting,第2列はnorthing,第3列は海抜高度(小数点以下3桁だからmmまで)。
第25万行


-44001

-129001

77.86

 第1列から:西方の999mから東方の001mまで。
 第2列から:南方の999mから北方の001mまで。
 この数値の構造を知るのにエクセルのグラフの散布図を作成したいところであるが, 32,000行までに限定されている。
 2m間隔のdemだから,999 = 1+2nからn=499となり,500行,500列あることがわかるのであって,つまり矩形になっている。
 実際に第1〜500行を見ると,x値は変わらず-44999mであって,yの値は第1行-129999で,第500行-129001になっている。つまり,西端の南北線に対して南端から北端までの値が対応している。
 
 このように,全ファイルは500×500の矩形になっていると推測される。
 grassへの取り込みの際には,とくに矩形領域を設定する必要がない。

1'. レーザースキャナーのDEMデータ(xyz.csv)の構造,の補足

Mar. 1, 2011。以下はgdal_translateをする際に求めたものである。

<左上隅x値 左上隅y値 右下隅x値 右下隅y値を求める>
 このためには,まずは各ファイルのxyz.csvファイルの構造を知る必要がある。すでにぼくのweb siteに記している。
第1列 第2列 第3列
x y z
西東 南北 高度

06OC0935_demを例に。 行の構造を見ると,西端について南から北へ,そして東に2m移動してまた南から北へ。

つまり,
第500行が左上隅の値


左上隅x値

左上隅y値

-44999

-129001

第249501行が右下隅の座標値になる


右下隅x値

右下隅y値

-44001

-129999

これは面倒なので,
第1行のx,y値(これは左下隅の座標値)

第1行x値

第1行y値

-44999

-129999

から,両隅の座標値を求めたい。計算式を次ぎに示す。エクセルファイルを作成して式を入れる。


ファイル名

第1行x

第1行y

左上隅x

左上隅y

右下隅x

右下隅y

 

X1

Y1

X1

Y1+998

X1+998

Y1

すべてのcsvファイルを開いて第1行のxy値をコピーアンドペーストして,左上隅,右下隅の座標値を求めれば良い。

 xyz.csvをGrassに取り込んで作成されたラスターdemファイルをgeotif出力したファイルについて,gdalwarpで旧測地系から世界測地系に座標変換を種々試みたが,できないことがわかった。これはgdalwarpかGrassのxyz.csvファイルの入出力に関するバグの一種であろう。そのため,gdal_translateで矩形領域を設定したが,この結果をGrassが使えないことが明らかとなり,断念した。そのプロセスを一応ここに示す。

May 1, 2011作成

[方針]
4stepsのうち,gdalwarpに代わって,gdal_translateを使う。
強制的に出力ファイルの矩形領域を変更する。
gdal_translate -a_ullr 左上隅x値 左上隅y値 右下隅x値 右下隅y値 入力ファイル 出力ファイル

[左上隅と右下隅の座標値について旧測地系から世界測地系へ]  
http://vldb.gsi.go.jp/sokuchi/tky2jgd/

エクセルのセル(第11行)に次の式を入れている。=CONCATENATE(=CONCATENATE("gdal_translate -a_srs EPSG:2448 -a_ullr ",F11," ",G11," ",H11," ",I11," /Users/moto/grassdata/FileConvert_folder/laser_dem_tokyo/",B11," /Users/moto/grassdata/FileConvert_folder/laser_dem_JGD2000/",C11))
gdal_translateを実行した。
なお,参考のためにexcelのすクリーンショットを次ぎに示す。

Excelファイル

[世界測地系のCS6_JGD2000のLocationに取り込む]

g.region -p
projection: 99 (Transverse Mercator)
zone:       0
datum:      towgs84=0,0,0,0,0,0,0
ellipsoid:  grs80
north:      -117000
south:      -137000
west:       -47000
east:       -35000
nsres:      2
ewres:      2
rows:       10000
cols:       6000
cells:      60000000

が現在のregion。 (必ず設定しておくこと)

r.in.gdal -o input=/Users/moto/grassdata/FileConvert_folder/laser_dem_JGD2000/06OD1000_dem_JGD2000 output=06OD1000_2mDEM --overwrite

 Grassに画像が表示されない。gdal_translateの際に,06OD1000_dem_JGD2000とは別に,06OD1000_dem_JGD2000.aux.xmlが同時に生成される。 この補助(AUX または AUX.XML)ファイルは、ラスタと同一の場所に置かれる付属ファイルである。ラスタ ファイルに含めることのできない補助情報が含まれている。この 補助ファイルには、座標系や投影情報などが含まれており,Grassがこの補助ファイルも一緒に読み込まなければならないが,Grassにはその機能がないらしい。それゆえ,gdal_translateが使えない。

修正すべきこと Apr. 4, 2011 この部分はgdalwarpを使って旧測地系から世界測地系にdemファイルを変換する過程を書いたものであるが,実はこの方法でも解決できなかった。xyz.csvをGrassに取り込んで問題なく表示され,種々の分析もできたが,これをGrassから出力して,gdalwarpで座標変換するということができなかった。xyz.csvファイルのGrassの入出力に問題があるのだろう。May 1, 2011

 茨木市の市史担当者とGrass上で,このDEM上に基盤地図情報を表示していたら,明らかに直線距離で400m余りずれていることがわかった。そのズレは,旧測地系と新測地系のそれぐらいである。作成した航空測量会社の担当者にメールして再度の確認をお願いしたら,何と旧測地系であることがわかった。Grassに取り込んでいるDEMを何とか移動できないかと考えたが無理と結論づけざるを得ない。
 それで,gdal_gridを使えないか試行錯誤したが,これも73ファイルを変換する手間を考えると到底使えないことがわかった。パラメータの設定量が多すぎることと,当該ファイルの行数が多く実行が難しいらしいことであった。
 gdal_translateも無理である。これはraster間の変換で,基本的には画像をgeotiff化するためのコマンドである。
 旧測地系xyz.csvファイルであるのに,当然ながらGrassは検知できないわけで,Grassのr.in.xyzコマンドを実行して世界測地系の平面直角座標系のLocationに入れてしまったためにずれている訳である。次のコマンドを実行してGrass外に出力してみた。
r.out.gdal input=IbarakiSouth_2m_totaldem@PERMANENT format=GTiff output=/Users/moto/grassdata/FileConvert_folder/laser_dem/IbarakiSouth_2m_totaldem_tokyo そして,出力ファイルを次のコマンドで旧測地系から新測地系に変換した。
gdalwarp -s_srs "EPSG:30166" -t_srs "EPSG:2448" -tr 2 2 -r bilinear -dstnodata -9999 "/Users/moto/grassdata/FileConvert_folder/laser_dem/IbarakiSouth_2m_totaldem_tokyo.TIF" "/Users/moto/grassdata/FileConvert_folder/laser_dem/IbarakiSouth_2m_totaldem_JGD2000.TIF" そして,Grassに取り込んだ。
r.in.gdal input=/Users/moto/grassdata/FileConvert_folder/laser_dem/IbarakiSouth_2m_totaldem_JGD2000.TIF output=IbarakiSouth_2m_totaldem_JGD2000 --overwrite 意外でもあり,当然でもあったが,変換してもほとんど変化がなかった。変換後は,ファイルのNSEW領域は,Nは-10m,Sは-16m,Eは-3m,Wは-7mだけずれた。
 この過程を通して,発見したことがあった。これまで新測地系に取り込んでいたIbarakiSouth_2m_totaldem@PERMANENTの解像度が10mになっていた。新たにgdalwarpで変換したIbarakiSouth_2m_totaldem_JGD2000は,-tr 2 2と指定しているから解像度は2mになっている。

 結局,現在取り込んでいるファイルは使えない。新たに実施した過程を次ぎに示す。
旧平面直角座標系のxyz.cscファイルをそれに対応するGrassのLocation(この前にRegionを必ずNSEW境界と解像度2mに設定する)に取り込んで,Grass外にgeotiff出力して,gdalwarpで新平面直角座標系に変換して,Grassので新平面直角座標系(この前にRegionを必ずNSEW境界と解像度2mに設定する)に取り込む。他のベクトルファイルも表示して新たに取り込んだDEMが正しい位置にあるかを確認する。
 まずは一つのファイルで実行する。そのあとで,72ファイル全体の実行過程を示す。

 残念ながら,以下に示した方法も駄目だった。結局,旧測地系から出力したgeotifから取り込んだもの,4ステップを実施したものと,2m解像度の限定オプションをしたもの,この3種のものがすべて,世界測地系Locationで全く同じ位置に表示された。つまり,gdalwarpまたはGrassが座標変換について機能していないということになる。。May 1, 2011記

 まずは一つのファイルだけで実施してみる。
1.1 Grassに,旧測地系の平面直角座標系mのLocationを作成する。
1.2 Grassでリージョンを設定する。つまり,NS方向・EW方向ともに解像度を2mとする。
 作成したばかりのregionを見るために,Config/Region/Display region settingsで確かめると,

g.region -p projection: 99 (Transverse Mercator) zone: 0  datum: tokyo ellipsoid: bessel north: 1 south: 0 west: 0 east: 1 nsres: 1 ewres: 1 rows: 1 cols: 1 cells: 1

 となっている。全く使えない状況である。

EPSG:30166から,Projected Bounds: -107893.2174, -287925.2810, 93010.7461, 33906.0065が見える。この値は,W,S,E,Nの順になっている。この領域がこのLocation全体である。こんなに広い領域は必要無いが一応このようにしておく。そして解像度を2mにする。Config/Region/Change region settings,で次のように設定した。のであるが,余りに大きくて(cells: 16164334032),r.in.xyzがメモリ不足で実行できない。そのため,茨木市域を余裕を持ってカバーできる範囲を設定した。

projection: 99 (Transverse Mercator) zone: 0 datum: tokyo  ellipsoid: bessel  north: -117000  south: -137000 west: -47000 east: -35000 nsres: 2 ewres: 2 rows: 10000 cols: 6000 cells: 60000000

 解像度はNS,EWとも2mとなっている。

1.3 適当な位置のcsvファイルを探す
 前回の入力時のメモが廃棄されてしまったので,ファイル名から位置を知ることは知ることはできない。
ogrinfo -パラメータ /Users/moto/grassdata/FileConvert_folder/laser_dem/06OD0904_dem.csv
では最大値や最小値の情報を得ることができない。それゆえ,エクセルで25万行のcsvファイルを開いてみないと収納座標値の範囲がわからない。(easting, northing)=(-39181, -129776)付近が茨木川と安威川の合流点だからこの付近ならば,他の基盤地図情報との関係からこのdemが正しく位置づけられたか判断できる。
 ほぼ,06OD1100_dem.csvを使おう。

1.4 Grassへの取り込みをする。その方法は,2.Grassへの取り込み,に示している。それゆえ,説明の詳細を省いて,実施したことだけ次ぎに示す。1ファイルだけ(06OD1100_dem.csvを例)で実行して,ここで示そうとする方法が有効かどうか,検証する。

 gdalinfo /Users/moto/grassdata/FileConvert_folder/laser_dem/06OD1100_dem.csv
は残念ながらサポートしていないから,エクセルで25万行のcsvファイルを開いてみないと収納座標値の範囲がわからない。(easting, northing)=(-39181, -129776)付近が茨木川と安威川の合流点だから,河川や

  r.in.xyz input=/Users/moto/grassdata/FileConvert_folder/laser_dem/06OD1100_dem.csv output=laser_06OD1100_dem type=FCELL fs=, x=1 y=2 z=3 zrange=0,800 zscale=1.0 percent=100 --overwrite

 Grassで表示したが問題なく,resolutionも2mとなっている。念のためRaster/Reports and Statistics/Report basic file infomationで見ると,

Total Cells: 60000000 |  Projection: Transverse Mercator |  N: -117000 S: -137000 Res: 2   E: -35000 W: -47000 Res: 2  Range of data: min = 8.410000 max = 17.389999

 となっている。

1.5 r.out.gdalでGrassから外部に出力

 File/Export raster map/multipke format using GDAL/のパネルでoptionsのGIS format to writeをGTiffにする。
r.out.gdal input=laser_06OD1100_dem@PERMANENT format=GTiff output=/Users/moto/grassdata/FileConvert_folder/laser_dem/laser_06OD1100_dem_tokyo.tif

Exporting to GDAL data type: Float32 Checking GDAl data type and nodata value Exporting to GDAL rasterInput raster map contains cells with NULL-value (no-data). The value nan will be used to represent no-data values in the input map. You can specify a nodata value with the nodata option.
ERROR 6: SetColorTable() only supported for Byte or UInt16 bands in TIFF format.

 実行完了。

1.6 gdalwarpで座標変換

 gdalwarp -s_srs "EPSG:30166" -t_srs "EPSG:2448" -tr 2 2 -r bilinear -dstnodata -9999 "/Users/moto/grassdata/FileConvert_folder/laser_dem/laser_06OD1100_dem_tokyo.tif" "/Users/moto/grassdata/FileConvert_folder/laser_dem/laser_06OD1100_dem_JGD2000.tif" 

をCUIで実行。

GRASS 6.4.0 (Plane6_Tokyo_VI):~ > gdalwarp -s_srs "EPSG:30166" -t_srs "EPSG:2448" -tr 2 2 -r bilinear -dstnodata -9999 "/Users/moto/grassdata/FileConvert_folder/laser_dem/laser_06OD1100_dem_tokyo.tif" "/Users/moto/grassdata/FileConvert_folder/laser_dem/laser_06OD1100_dem_JGD.tif"
Creating output file that is 6001P x 10001L.
Processing input file /Users/moto/grassdata/FileConvert_folder/laser_dem/laser_06OD1100_dem_dem_tokyo.tif.
Using internal nodata values (eg. nan) for image /Users/moto/grassdata/FileConvert_folder/laser_dem/laser_06OD1100_dem_tokyo.tif.
0...10...20...30...40...50...60...70...80...90...100 - done.

 完了。

1.7 Grassの世界測地系平面直角座標系への取り込み

 gdalwarpで作成したgeotifファイルをGrassに取り込むのだが,Grassを終了して,新たに世界測地系平面直角座標系のLOCATIONをまずは開く必要がある。

r.in.gdal input=/Users/moto/grassdata/FileConvert_folder/laser_dem/laser_06OD1100_dem_JGR2000.tif output=laser_06OD1100_dem_JGD2000 --overwrite

Projection of input dataset and current location appear to match
r.in.gdal complete. Raster map <laser_06OD1100_dem_JGD2000> created.  

 そこで,GrassのDisplayにこれを表示して,他のベクトルファイルとの対応関係を見れば,問題がないことが分かった。

まとめて実行

-0 前もってGrassに旧測地系の平面直角座標系mのLocationを作成し,GrassでNS方向・EW方向とともに解像度2mとするregionを設定済。
-1 r.in.xyz input=/Users/moto/grassdata/FileConvert_folder/laser_dem/元ファイル名.csv output=laser_元ファイル名 type=FCELL fs=, x=1 y=2 z=3 zrange=0,800 zscale=1.0 percent=100 --overwrite
 一気に73ファイルを実行できないので,excelで前もってコマンド文を作成し,前述のようにregion設定済の旧測地系の平面直角座標系mのLocationを開いて,cuiでコピペして実行してゆく。
r.in.xyzのエクセルファイル

−1' Grassの上記Locationに各ファイルが取り込まれていて正しく表示されるか時々確認すること。
-2 Grassの同Locationで取り込んだdemファイルを外部出力する。出力する最下部のフォルダlaser_dem_tokyoを作成する。
r.out.gdal input=laser_元ファイル名@PERMANENT format=GTiff output=/Users/moto/grassdata/FileConvert_folder/laser_dem_tokyo/laser_元ファイル名_tokyo.tif
excelで前もってコマンド文を作成し,個々にcuiでコピペして実行してゆく。
r.out.gdaのエクセルファイル

-3 前もって出力する最下部のフォルダlaser_dem_JGD2000を作成し,gdalwarpで新平面直角座標系に変換する。

 gdalwarp -s_srs "EPSG:30166" -t_srs "EPSG:2448" -tr 2 2 -r bilinear -dstnodata -9999 "/Users/moto/grassdata/FileConvert_folder/laser_dem_tokyo/laser_元ファイル名_tokyo.tif" "/Users/moto/grassdata/FileConvert_folder/laser_dem_JGD2000/laser_元ファイル名_JGD2000.tif"
excelで前もってコマンド文を作成し,個々にcuiでコピペして実行してゆく。
gdalwarpのエクセルファイル

-4 一旦Grassを終了する。そして,新測地系の平面直角座標系mのLocationを開く。茨木市域を十分にカバーする領域と解像度2mのregionを設定する。
r.in.gdal input=/Users/moto/grassdata/FileConvert_folder/laser_dem_JGD2000/laser_元ファイル名_JGD2000.tif output=laser_元ファイル名_JGD2000 --overwrite
excelで前もってコマンド文を作成し,個々にcuiでコピペして実行してゆく。

r.in.gdalのExcelファイル

−4' Grassの上記Locationに各ファイルが取り込まれていて正しく表示されるか時々確認すること。

以 上

 

2. Grassへの取り込み

 r.in.xyz(aggregate ascii xyz)のコマンドで可能。73ファイルあるので,gis.mでは面倒。コマンドベースで実行する。
 73ファイルについて一々入力が面倒なので,エクセルで文字関数を使ってコマンド行全体を自動作成した。MacとWinの両方で取り込みが可能。Winはpythonのレイヤーマネージャー窓の最下部でコマンド入力が可能。Winでは,共同作業の観点から,USBにgrassdataを入れているので,g:/grassdata/......となる。

inputファイル名 outputファイル名 grassへの入力 r.in.xyz
06OC0935_dem.csv 06OC0935_dem r.in.xyz input=G:\grassdata/FileConvert_folder/laser_dem/06OC0935_dem.csv output=laser_06OC0935_dem type=FCELL fs=, x=1 y=2 z=3 zrange=0,800 zscale=1.0 percent=100 --overwrite

Macでは下記の通り。

06OC0936_dem.csv 06OC0936_dem r.in.xyz input=/Users/moto/grassdata/FileConvert_folder/laser_dem/06OC0936_dem.csv output=laser_06OC0936_dem type=FCELL fs=, x=1 y=2 z=3 zrange=0,800 zscale=1.0 percent=100 --overwrite

 outputファイル名には,次式を入れている。
 =LEFT(A2,12)
 grassへの入力 r.in.xyzには,次式を入れている。
 =CONCATENATE("r.in.xyz input=/Users/moto/grassdata/FileConvert_folder/laser_dem/",A3," output=laser_",B3," type=FCELL fs=, x=1 y=2 z=3 zrange=0,800"," zscale=1.0 percent=100 --overwrite")

r.in.xyzのWindows用Excelファイル

3. Grassで r.patch

 取り込んだ各ファイルを表示すると,個々に段彩図が作成されるので連続したファイルであっても全く別ものに見える。そこで表示の点からもコンターの作成や分析の点からもr.patchで73ファイルを一つのファイルにする必要がある。73は素数だから矩形領域にはならない。このr.patchコマンドは,出力ファイルの領域が矩形になる必要がない。
 r.pathはpatchされるそしてpatchする両域が全く同じであっても実行できる。ピクセルがパッチされるファイルのゼロのピクセルに,パッチするファイルの数値が書き込まれる。その応用編として,隣接する両域のファイルを継ぎ足してゆくことができるパッチ機能があると考えられる。領域が重なろうが隣接しようが離れていようが,パッチできるのである。
 パッチするLocationは当然一致しなければならない。ここでは世界測地系の平面直角座標(日本の第VI系)で,解像度は2mである。次のスクリプトはr.patchのヘルプに掲載されていたものである。
 MAPS=`g.mlist type=rast sep=, pat="map_*"`
 g.region rast=$MAPS
 r.patch in=$MAPS out=mosaic
 このスクリプトをここでの場合に適用すると,
 MAPS=`g.mlist type=rast sep=, pat="*_dem"`
 g.region rast=$MAPS
 r.patch in=$MAPS out=IbarakiSouth_2m_totaldem

 sep=はseparatorであるが,なぜ「,」なのか。
separator=string
One-character output separator, newline, comma, space, or tab
Default: newline
であるが,newlineの可能性がある。実行すればわかるであろう。
 で,実行した。下記のように。
GRASS 6.4.0 (Plane6_JGD2000v3):~ > MAPS=`g.mlist type=rast sep=, pat="*_dem"`
GRASS 6.4.0 (Plane6_JGD2000v3):~ > g.region rast=$MAPS
GRASS 6.4.0 (Plane6_JGD2000v3):~ > r.patch in=$MAPS out=IbarakiSouth_2m_totaldem 100%
Creating support files for raster map <IbarakiSouth_2m_totaldem>

 成功。1 m contoursベクトルマップを作成して,ぼくのcolor.rulesファイルを使って次ぎに表示する。

 

III レーザーdemのGrassへの取り込み xyz.csvファイルの旧測地系から世界測地系の変換とGrassでの利用:r.proj May 1, 2011

 ここで示す内容がわからない場合は,だらだら書いたIIでの失敗例を見て下さい。
 進退窮まって,Grass内での解決を求めて再度探して試みたら成功した。Grassに対する知識不足である。
 r.projは別のLocationから現Locationに移動するコマンド。

r.proj [-ln] [input=name] location=string [mapset=string] [dbase=string] [output=name] [method=string] [memory=integer] [resolution=float] [--overwrite] [--verbose] [--quiet]

 世界測地系の平面直角座標系VIのLocationからcuiで実行した。その実行結果を次ぎに示す。

GRASS 6.4.0 (Plane6_JGD2000v4):~ > r.proj input=laser_06OD1000_dem location=Plane6_Tokyo mapset=PERMANENT output=laser_06OD1000_dem_try method=bilinear resolution=2.0 --overwrite
Input Projection Parameters:  +proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +no_defs +a=6377397.155 +rf=299.1528128 +towgs84=-147.54,507.26,680.47
Input Unit Factor: 1
Output Projection Parameters:  +proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +no_defs +a=6378137 +rf=298.257222101 +towgs84=0,0,0,0,0,0,0
Output Unit Factor: 1

Input:
Cols: 5871 (6000)
Rows: 9829 (10000)
North: -117342.000000 (-117000.000000)
South: -137000.000000 (-137000.000000)
West: -46742.000000 (-47000.000000)
East: -35000.000000 (-35000.000000)
EW-res: 2.000000
NS-res: 2.000000

Output:
Cols: 5869 (6000)
Rows: 9827 (10000)
North: -117000.000000 (-117000.000000)
South: -136654.000000 (-137000.000000)
West: -47000.000000 (-47000.000000)
East: -35262.000000 (-35000.000000)
EW-res: 2.000000
NS-res: 2.000000

Allocating memory and reading input map...
 100%
Projecting...
 100%
r.proj complete.
GRASS 6.4.0 (Plane6_JGD2000v4):~ >

 この結果を示すが,gdalwarpで種々実施して座標変換できなかった画像を次ぎに。そして,r.projで適正に表示できた結果をその次ぎに示す。

 上の図で段彩図はレーザーdem,灰色の面分布は,低位段丘の分布を示している。demが400mほど南東方向にずれている。段丘情報の分布は正しい。

 上の図でグレーの段彩図はレーザーdem,水色の面分布は低位段丘。緑色の面分布は中位段丘。黒い区分線は町丁界。地形分類は1961年撮影の空中写真を使っており,demは2004年のものなので,微妙な不一致らしいものが一部にみられるが,土地改変によるもので,これ以外は完全に一致している。

 73ファイルを旧測地系平面直角座標系から世界測地系平面直角座標系に取り込む必要があるので,cui用のExcelファイルをここに添付する。