Oct. 26, 2018 作成 Nov. 10更新
紙地図スキャン画像の等値線をAdobe Illustratorでトレースして, プラグインPlugX-shapeを使って,等値線をベクトル出力し, GrassGISに取り込んで,DEMを作成する過程をここに示す。紙地図は海上保安庁製の海底地形図五万分の一「沖永良部島」(第6505号)である。 なお, この手法に達するまでには, 画像ベースで実施しようとして失敗した経緯がある。
この作業を実施したIllustrator+PlugX-shape用のフォルダー(zip)と, GrassGISのLocationの演習用ファイルフォルダー(zip)をここに用意した。なお,前者のファイルでは,このページ作成で作業した等値線の多くを削除している。なお, 演習室CでPlugX-shapeが使用可能なパソコンにはラベルを貼っている。他にラップトップパソコンも用意している。
地球座標系ではなくて,デカルト座標系でのGIS作業を考えていたが,PlugX-shapeを使う方針を採用したために,CS-I座標系に配置せざるをえなかった。結果としてよかった。
というのは,国土数値情報の10mメッシュDEMで描いた海岸線や10m主曲線を生かすことができたし,この画像とスキャンした海底地形図との対応関係を取るにも,功を奏した。 PlugX-shape 4.5から任意の3点の座標マーカーレイヤーを設定できる。
3点の座標マーカー位置を設定する必要がある。一つは,住吉港,もう一つは陸の大津勘集落を通る比較的大きな道の海岸端の西よりの道路端,そして,最後の一つは海上の緯線と200m等深線の交点とした。その位置は海底地形図画像では (x, y)はそれぞれ, (225,98), (1311,82), (992,1092)であった。GrassGISで読み取ると,陸域の2点の(easting, northing)は,
(-96338.1126789, -624711.109557), (-95065.3797521, -626763.268074)であった。海洋中の第3点はもちろん,読めないが,おおよその位置を見ると, (-97338, -627430)であった。
海底地形図と10mメッシュDEMのそれぞれが作る三角形は当然, 相似であり,
10mメッシュDEM上の第3点は,海底地形図の陸域2点から海洋方向に伸びる腕でそれぞれ円を作成し, その二つの交点の一つが第3点ということになる。この詳細はリンクしたエクセルファイルを参照してほしい。この計算の結果,得られた第3点の座標値が次のようであった。もちろん,イラストレーター上での作業のための3点は,海底地形図を使ってポイントできる。
easting | northing |
-97355.836 | -627310.39 |
PlugX-shapeの文法から, 次のように配置する。
住吉港 | -624711.109557&-96338.1126789 |
大津勘幅道 | -626763.268074&-95065.3797521 |
海洋上 | -627310.39&-97355.836 |
図1
上の図のように, 50m間隔の計曲線は緑色の等値線, 10m間隔の主曲線, 0m (depth datum), 海岸線(MSLに対応, 1.08m above datum)は黒色の等値線, 5mの補助曲線は赤色の等値線で描いた。この図では主にトレースの対象となった海底地形図は10mメッシュDEMの図で下に隠れている。
MSL 1.08m above LLWLは海底地形図とほぼ対応している。海岸線の図は海図よりもDEMの方がすぐれていると判断されるので,書き直した。海底地形図の上辺の範囲を超えているが,一応20mの等高線までトレースした。
PlugX-shapeでそれぞれに等値線に属性情報を入れることができる。上の図の,PlugX-shapeのウィンドウを参照願う。 文字コードはGrassのヘルプを参照すると,utf-8であることがわかる。GRASS variables and environment variables https://grass.osgeo.org/grass77/manuals/variables.html のページには,
GRASS_DB_ENCODING [various modules, wxGUI] encoding for vector attribute data (utf-8, ascii, iso8859-1, koi8-r)
とある。それゆえ,utf-8で属性情報を入力する必要がある。utf-8はascii形式にさらに追加したものである。PlugX-shapeには,encodingの選択肢がある。フィールド名は10bytes以内,属性値はフィールド定義したケタ数である。
plugX-shapeのアイコンをクリックすると,選択範囲の属性のタブが出て,新規属性ボタンをクリックから,category,levelを作成することができる。
Grassでは自動的にcatが付加されるので このPlugXでの作業では,categoryの名称をcat_としている。Grassでの処理過程で必要かもしれないと考えて,陸域,海域,計曲線,主曲線,補助曲線というグループでの指定が簡単なように, 次のようなナンバーリングをした。
depth datumから陸域へ,
datum 1, MSL 2, +10m 3, +20m 4
計曲線は沖合へ,
-50m 5, -100m 6, -150m 7
主曲線も沖合へ,
-10m 8, -20m 9, -30m 10, -40m 11, -60m 12, -70m 13, -80m 14, -90m 15, -110m 16, -120m 17, -130m 18, -140m 19, -5m 20, -15m 21, -25m 22, -35m 23,
-45m 24, -55m 25, -65m 26, -75m 27, -85m 28, -95m 29,
以上 。
同深度で2本ある場合も,深度だけではなく,cat_を共通にしたが, PlugXもGrassも問題なかった。
PlugX-shapeの「書き出し設定パネル」での選択内容を次に。
書き出し対象:現在のレイヤー
ContoursPlugx_Okinoerabu
データタイプ:ポリライン
エンコーディング:UTF-8
オプション:
レイヤー名を属性に付加, しない。
付加しても, なぜか図gimp3_grass_plugxとなってしまうので,不要。
保存時に,ファイル名を入力すること。レイヤー名は生かされない。
ベジェ曲線パスを折れ線補間する 精度は精密9を選んでいる。
グループと複合パスは内部の要素を個別に書き出す,オプションであるが,これにチェックを入れると複合パスの内部の個々のパスが独立したフィーチャーとして掻き出される。折れ線やベジェ曲線はこれらに該当しないので,このオプションは意味がない。 例えば, https://www.abhachi.com/?p=553
座標マーカーを使用,を選ぶ。
世界測地系
平面直角座標(XY) 1系
ファイルに書き込む座標値,については,「変換しない」。
出力すると(新たなフォルダーを作ること), . shp, .shx, .dbfの3ファイルが出力される。
等値線ベクトルからDEM作成 http://motochan.sakura.ne.jp/public_html/GISContents/5.htm
に, この章での操作法を示しているので,参照願いたい。
まずは, grassdata/FileConvert_folder/Okinoerabu_jimaフォルダに,3ファイルをまとめたOkinoerabu_vectors_plugXフォルダを入れる。
そして,Grassで実行した。
v.import input=/Users/moto/grassdata/FileConvert_folder/Okinoerabu_jima/Okinoerabu_vectors_plugX/Okinoerabu_plugx.shp layer=Okinoerabu_plugx output=Okinoerabu_plugx -o(Fri Oct 26 14:06:05 2018)
メッセージを次に。
Over-riding projection check
Check if OGR layer <Okinoerabu_plugx> contains polygons...
Importing 33 features (OGR layer <Okinoerabu_plugx>)...
-----------------------------------------------------
ベクトルマップ <Okinoerabu_plugx@Okinoerabu-jima> にトポロジーを作成しています...
プリミティブを登録しています...
プリミティブは登録されました
頂点は登録されました
Building areas...
作成された領域
アイルは作成されました
Attaching islands...
Attaching centroids...
ノードの数: 66
プリミティブの数: 33
ポイントの数: 0
ラインの数: 33
境界の数: 0
セントロイドの数: 0
領域の数: 0
アイルの数: 0
Input </Users/moto/grassdata/FileConvert_folde
取り込まれたベクトルファイルを次に示す。属性フィールドは, Grassが自動で付与したcat, ぼくが付与したcat_, そしてlevel。
各等高線にlevel値が表示されている。
図2
計算する範囲を等値線ベクトルに限定し, 解像度タブで10(m)を指定した。もし, 解像度1mのラスターファイルそしてDEMが必要なら, 解像度1mとすれば良い。
下の図に,ラスター化のちの,等値線を示す。ラスター/ベクトルマップの検索,アイコンをクリックして, -150mの等高線の一つのセルをクリックした際の,Query resultsを示している。
図3
下の図には,作成されたDEMの上に,等値線ベクトルを載せている。この沖永良部島のDEM作成に36秒を要した。
等値線が矩形全域をカバーしなくても何の支障もないことがわかった。
図4
直近の上の図には,作成されたDEM上に,等値線ベクトルを載せている。
ファイル/ラスターマップのエクスポート/ Ascii xyz形式でエクスポート (r.out.xyz), したファイルをここにリンクする。 このテキストファイルの情報を見ると, 行数は123,927, 文字数は5,528,324である。テキスト設定は,Unicode (UTF-8), 改行コードはLF。このファイルの配列は,(easting, northing, level) である。
Nov. 3, 2018記: 想定していなかった急崖が形成された。次のようである。古池さんの指摘である。
古池さんからの等値線図:
図5
この部分は, 「II.5 DEMからascii出力」 で示したイラレの等値線作成作業図(海底地形図)で見られるように, 等深線が突如として原図でも欠落している部分である。下のGrass表示でも同様の現象が見られる。
Grass表示で急崖が掲載された部分(-150m〜-100m計曲線間の4本の主曲線が突然無くなることで生じている):
図6
このゴミをなくすためには,この4本の等深主曲線を削除する必要があると考えた。古池さんによれば, 削除すると問題が無いところにまで影響が及ぶとのことで, 図7では-120m等深線が-150mと-100mの計曲線間のほぼ中央を走ることから,これを左端まで延長した。そして,-110mと-130mの主曲線を適当なところで間引いた。その結果を図8に示す。
図7
図8
Nov. 6, 2018記: 芹沢さんと古池さんが作成した海岸シミュレーションアプリは,分析対象の海岸線の法線方向を真上にする必要がある。当初,イラレ上でそれを達成しようとしたが,かなり徒労に近い作業であった。Grass内でのベクトルマップの回転ができないか調べてみたら,あった。まあ,当然ではあった。v.transformというコマンドである。以下, イラレでの作業を含めて, ここに記す。
当初,等値線と海底地形図画像を回転しようとしたが,考えてみると,DEM画像を回転した方がオブジェクトを壊すリスクを回避できると判断した。アートボードがそのまま使えるのもいいと考えた。 前回使用したPlugX用の3点座標は使えないと考えて消していたが,陸域の2点は転用できそうなので,前回のaiファイルから再出発した。 まずは,DEM画像のみロックを外して,回転して,3点座標のうちの陸域2点に合わせることとした。もちろん,数値はスワップする必要がある。第三点は適当な道路の交差点を選んだ。それが,次の場所。
-624429.925442&-94249.3389756。 easting値もnorthing値も左右,上下が逆になっている。見える位置関係からするとあり得ない形。これにPlugX-shapeが対応できるかどうか,やってみるしかない。 そもそも,もう地球表面の位置関係と関係なくなっているので,何も拘らなくて良い筈ではある。 さて,PlugX-shapeでシェープ出力したが位置関係と座標値が対応せず,全く駄目だった。 次の図8は,シェープ出力する前のイラレの表示である。
図9
それでIllustratorで全レイヤーをグループ化せずに,180度回転し,3座標を回転から戻した。そしてPlugX-shapeでシェープ出力。次の図10はイラレの表示である。
図10
うまく行ったが, Grassで表示すると海岸線の法線方向は真上から50度ほど右に振っている。古池さんに連絡して駄目だし。見かけ上, イラレで表現しても, 3座標は地球上の座標系なので, その点を考慮する必要がある。イラレで作業するのは限界がある。そこで,Grass上でrotationができないかと考えた。
ベクトル/ベクトルマップの作成/ベクトルマップの再配置(r.transform) で回転が可能である。
https://grass.osgeo.org/grass64/manuals/v.transform.html
当初, 結果が見えず,実行ができていないと考えた。しかし,メタデータを見ると,回転前と同様のベクトルが作成されている。
回転前のmodified_virtualのメタデータ:
| Number of points: 0 Number of centroids: 0 |
| Number of lines: 33 Number of boundaries: 0 |
| Number of areas: 0 Number of islands: 0 |
| Projection: Transverse Mercator |
| N: -623292.99169355 S: -627414.50770499 |
| E: -93892.28680469 W: -96930.43553124 |
回転後のmodified_virtual_40のメタデータ:
| Number of points: 0 Number of centroids: 0 |
| Number of lines: 33 Number of boundaries: 0 |
| Number of areas: 0 Number of islands: 0 |
| Projection: Transverse Mercator |
| N: -538480.14900502 S: -541799.34332567 |
| E: 330868.23052813 W: 327183.44924564 |
両者を比較すると,それぞれの末尾のベクトルマップの領域が大きくずれているのがわかる。
図11
上の図の左下隅に見えるのが,沖永良部島で回転前のベクトルマップが位置している。回転後のファイルはかなり離れた位置に配置されている。
この図の上段にボタンツールが並んでいる。左から7番目の虫眼鏡とその左上に+,右下に+を付した <Zoom to computational region extent>がある。まずはレイヤーで対象ベクトルマップを選んで,このボタンを押すと, 対象ベクトルの範囲に跳ぶことができる。古池さんの要望に応えるのは,58.2度(図12)ではないか。レーベルに赤色または緑色にすることでベクトルマップの位置を知ることができる。緑のレーベルが58.2度のものである。なお,等深線もMSL対応にすべく, -30mまでについては,chart datumを-1.08mに変更したことに伴い, 誤差回避の理由から,等深線のlevel (海岸線付近を重視するために-30mまでの等深線を対象)には,-1.08mをプラスしている。
図12
この図の左下は58度回転,右上は58.2度回転。
ascii出力して古池さんに送付したが,古池さんから次のような指摘があった。-150m等深線よりも上方,つまり,データが無いはずなのに, -140台の深度域が見られる, そして,n-sとe-wのセルサイズが10mから外れている。
DEMを表示し,1m等値線を作成して,表示し, 例えば-147m等深線をQueryした表示結果が次のものである。最上縁の黄色の曲線が-147等深線であるが,
右端で屈曲して,-150m等深線を超えた領域にはみ出している。領域設定に関わるゴミが生じていると考えられる。
図13
図14
-150m等深線付近を拡大し,Queryすると,なんと, -150m等深線が繋がっていない。e-w方向以外が描かれていない。
この問題を,いわば正面突破するのは,徒労に終わるように感じた。
海浜流シミュレーションのための基礎データを作成する一連の作業を実施する過程で,何となく不安に思っていたことがある。10mメッシュのセルが元画像の縦横長にかかわらず,出来てしまうのは何故なのか,不思議だ,Grassが何らかの処理をしてくれているのだろうと,考えていた。
この基本的な懸念を確認する必要があった。そこで作成されたDEMのメタ情報を確認したのが次のものである。
____________________
(Fri Nov 9 20:27:33 2018)
g.region -p
projection: 99 (Transverse Mercator)
zone: 0
datum: towgs84=0,0,0,0,0,0,0
ellipsoid: grs80
north: -358437.2867002
south: -360904.08281633
west: 518604.14836277
east: 522198.10875541
nsres: 9.98702881
ewres: 10.01103173
rows: 247
cols: 359
cells: 88673
(Fri Nov 9 20:27:34 2018) コマンド終了 (0 秒)
____________________
古池さんから連絡があったように, nsres: 9.98702881, ewres: 10.01103173となっている。矩形領域のサイズが10mの倍数になっていないのに,Grassが10mに近い値で10mメッシュを作成しているということである。そこで,矩形領域を10mの倍数にするべく,等値線ベクトルから作成した等値線ラスターの周辺を切り取ることにした。
10mメッシュのdemを作成するには,northing, eastingいずれも10m単位の長さにすべく,作業する。
領域設定にはできるだけ情報が切れないのがいいので,反時計回り58.2度を採用。領域を反時計回り58.2度実施後のファイルを使用した。
(Fri Nov 9 23:17:22 2018)
g.region --verbose vector=contours_modified_virtual_58_02@Okinoerabu-jima res=10.0000
(Fri Nov 9 23:17:22 2018) コマンド終了 (0 秒)
で,この 領域を確認すると,
g.region -p
projection: 99 (Transverse Mercator)
zone: 0
datum: towgs84=0,0,0,0,0,0,0
ellipsoid: grs80
north: -409099.68227247
south: -411527.29845146
west: 479700.56954502
east: 483096.32378703
nsres: 9.99019004
ewres: 9.98751248
rows: 243
cols: 340
cells: 82620
(Fri Nov 9 23:18:31 2018) コマンド終了 (0 秒)
まずはここで,res:10mにするために領域を触ると,ベクトルが変に,壊れるのではないか,と想像したので,まずは,ラスター化したあとで,領域を限定しよう。
図15 ラスター化した等値線
この領域を次のように確認した。
____________________
(Fri Nov 9 23:28:40 2018)
r.info map=contours_modified_virtual_58_02_raster@Okinoerabu-jima
|----------------------------------------------------------------------------|
| |
| Type of Map: raster Number of Categories: 20 |
| Data Type: DCELL |
| Rows: 243 |
| Columns: 340 |
| Total Cells: 82620 |
| Projection: Transverse Mercator |
| N: -409099.68227247 S: -411527.29845146 Res: 9.99019004 |
| E: 483096.32378703 W: 479700.56954502 Res: 9.98751248
| Range of data: min = -150 max = 20 |
| |
| Data Source: |
| Vector Map: contours_modified_virtual_58_02@Okinoerabu-jima |
| Original scale from vector map: 1:1
____________________
上の解像度値をn-sとe-wの領域設定から確認すると, 次のように一致している。
=(-409099.68227247-(-411527.29845146))/243=9.990190037
=(=483096.32378703-479700.56954502)/340=9.987512477
で,
| N: -409099.68227247 S: -411527.29845146
| E: 483096.32378703 W: 479700.56954502
の範囲内の最大の10の倍数の範囲は,
N: -409100 S:-411520
W: 479710 E: 483090
このように領域設定をg.regionで実行し,g.region -pで次のように表示した。
____________________
(Sat Nov 10 10:50:36 2018)
g.region -p
projection: 99 (Transverse Mercator)
zone: 0
datum: towgs84=0,0,0,0,0,0,0
ellipsoid: grs80
north: -409100
south: -411520
west: 479710
east: 483090
nsres: 10
ewres: 10
rows: 242
cols: 338
cells: 81796
(Sat Nov 10 10:50:36 2018) コマンド終了 (0 秒)
____________________
見事に,10mメッシュとなっている。
r.surf.contourを実行。Raster>Interpolate surfaces>Raster contours ラスター/曲面補間/ラスターコンターから作成
図16 作成されたDEM
DEMが表示された。どうも,できたらしい。そして,1m等高線作成し,カラーrule.fileをつぎのようにした。
-200 red
-150 violet
-100 purple
-50 aqua
-1 yellow
0 white
20 orange
nv white
図17 上のルールでcolor設定したDEMとこれから作成した1m等値線
上のDEMファイルには全く赤色が無い。つまり,-200≦数値<-150が無い。
このDEMのプロパティを確認したのが次の表示。
____________________
(Sat Nov 10 11:39:29 2018)
r.info map=contours_modified_virtual_58_02_DEM@Okinoerabu-jima
+----------------------------------------------------------------------------+
| Map: contours_modified_virtual_58_ Date: Sat Nov 10 10:52:23 2018 |
| Mapset: Okinoerabu-jima Login of Creator: moto |
| Location: Plane_1_JGD2000 |
| DataBase: /Users/moto/grassdata |
| Title: |
| Timestamp: none |
|----------------------------------------------------------------------------|
| |
| Type of Map: raster Number of Categories: 0 |
| Data Type: DCELL |
| Rows: 242 |
| Columns: 338 |
| Total Cells: 81796 |
| Projection: Transverse Mercator |
| N: -409100 S: -411520 Res: 10 |
| E: 483090 W: 479710 Res: 10 |
| Range of data: min = -150 max = 20 |
| |
| Data Description: |
| generated by r.surf.contour |
| |
| Comments: |
| r.surf.contour --quiet input="contours_modified_virtual_58_02_raster\ |
| @Okinoerabu-jima" output="contours_modified_virtual_58_02_DEM@Okinoerabu-jima" |
(Sat Nov 10 11:39:29 2018) コマンド終了 (0 秒)
____________________
できている。では, ascii 出力。ファイル/ラスターマップのエクスポート/ Ascii xyz形式でエクスポート (r.out.xyz)
____________________
(Sat Nov 10 11:49:15 2018)
r.out.xyz --quiet input=contours_modified_virtual_58_02_DEM@Okinoerabu-jima output=/Users/moto/Desktop/Nov09/Okinoerabu_asciixyz_Nov10.txt separator=comma
(Sat Nov 10 11:49:16 2018) コマンド終了 (0 秒)
____________________
出力されたテキストファイル
エクセルでeasting, northing値の最小値で差し引くことで左下を(0,0)にしたエクセルファイル
これをcsv出力したファイル
以 上