1. 幾何補正対象の紙地図をスキャン。
2. Grass7のデカルト座標系Location/mapsetに取り込み。これで,ソースマップが用意される。
3. 変換したい座標系Location/mapsetで紙地図スキャンマップと対応可能なベクトルまたはラスターマップを用意。これで,ターゲットマップが用意される。 (この例では特にこの手法を示していない。ノースカロライナのデータセットで用意されているからである。自らが変換したい座標系でGCPsを用意しなければならない)
4. 変換したい座標系Location/mapsetを開き,Grass 7のgis.mで,ファイル/幾何補正,を実行。 4.1 Grass 7で,変換したい座標系Location/mapsetを開く。
4.2 ファイル/幾何補正処理,を選び,次々と出るパネルに入力する。
4.3 先にターゲットマップ,次にソースマップで,地上制御点GCPを登録してゆく。エラー値ができる範囲で小さくするよう編集する。
4.4 設定オプションで,一次〜三次で手法を選んで,幾何補正を実施する。Quitボタンで終了。 4.5 Layer managerに,幾何補正された画像を読み込み,Map displayに表示し,必要とあれば,外部に画像出力する。
次のイメージは,幾何補正(3次処理のうちのLanczos法)した結果(ラスター画像)を,作業してきたターゲットLocation内で表示したものである。
ちょっとしたメモ: 確かな座標系などが付与されていない紙地図をスキャンして,希望する座標系に無理矢理載せる手法は,GISを常用する人々だけでなく,広く期待されるところである。この作業は幾何補正 georectification or georeference と呼ばれる。現在,見渡しても,この手法をわかり易く紹介するウェブサイト(本は下記ぐらいか)が見つからないので,ここに示すことにした。使用ソフトは,MacOSX10.10 Yosemite上のGrass GIS 7である。Windows上のOSGeo4Wなどでも同じ過程で実行可能である。
参考文献は,下記の Neteler and Mitasava(2008: pp. 65-70) のものとGrass helpなどであるが,両氏の説明なしにgeorectification機能を使ってきた僕でさえも,極めてわかりにくい。
この幾何補正の手法は多様なのだが,あれもこれもと書いてゆくと混乱するので,いささか断定的に記述する。なお,Grassの使用法がわからない方には以下の記述の理解は難しいかも知れない。本ウェブサイトのトップページからサイト内検索をして頂くと,種々の基礎的方法をみつけて頂けるかも知れないが。
Markus Neteler and Helena Mitasova, 2008. Open Source GIS: A GRASS GIS Approach. Springer Science & Business Media ダウンロード版6482円.
Chapter 4 Grass data models and data exchange
4.1.4 Import and geocoding of a scanned historical map.
スキャンする際の解像度は300dpiとし,モノクロであっても,カラー画像として取り込む。後の手間を考えて,できるだけスキャナー枠と地図枠が一致するようにセットしよう。
次式から,紙地図上で1cmあたり118本の線密度で画像が取得される。
300dpi = 300 lines/2.54cm = 118.11 lines/cm
PhotoshopやGimpなどの画像処理ソフトを使って,スキャンデータを矩形境界がなるべくxy軸と平行になるように回転したり,ゴミなどがあれば掃除し,不要部分は削除したりする。Grassが読み込めるファイル形式のうち,tifかjpegがいいだろうと思う。
スキャンファイルを取り込むには,地球表面の座標系ではなく,デカルト平面座標系のLocationが必要である。すでにgrassdataに作成している場合にはもちろん,それを使えば良い。
Grass-GISのgis.mの立ち上げの際に,
「2. Select Grass Location」の部分で,Newのボタンを選ぶ。
「データベースとロケーション名の設定」で,ぼくの場合は,
GISデータディレクトリ:/Users/moto/grassdata
プロジェクトロケーション:XY
Location Title: XY
とした。
「新しいロケーションの作成方法の選択」では,
Create a generic Cartesian coordinate system (XY)
を選ぶ。
「完了」だが,「デフォルト領域と解像度をセット」,を選択。
デフォルト領域は,
北は,1000000.0
南は,100000.0
西は,100000.0
東は,1000000.0
とし,北ー南,東ー西,の解像度は1.0とする。
セル数は,810,000,000,000 とかなりデカくなる。東西南北それぞれ一桁減らしても問題はない。
ジオコーディングとは,地表の位置を地理座標(eg. 緯経度)に変換する処理,のことである。
IV.1 xy Locationが必要になる(作成法は前述)。
IV.2 このPERMANENT(どのmapsetからもアクセスが可能な共有フォルダーに相当)や新規に作成したmapsetに,紙地図スキャンマップをr.in.gdal -eコマンドで取り込む。
https://grass.osgeo.org/grass64/manuals/r.in.gdal.html
(r.in.gdal -e input=ルートからのパス指定と紙地図のスキャンファイル名 output=Grass内で使用するrasterファイル名の指定, -eはLocationのregion設定が小さくても,ファイルの大きさまで拡大させるオプションである)
これを実行するにはgis.mを使うのが普通で,inputのパス指定は,ファインダ=(ブラウザー)で可能である。gis.mで使う場合,
ファイル/ラスターデータのインポート/Common formats import [r.in.gdal],で,パネルが出るので,inputファイルは「参照」ボタンを押してスキャンファイルまで行き着くことができる。ここの例では,スキャンマップは,raleigh_nc_1951.jpg である(後述)。
IV.3 gis.mのメニューから,File/Georectifyを選んでゆくことになるが,ここでは,Grassウェブサイトに用意されているLocationのサンプルファイル群を使って,分析手法を学ぶことになる。
演習: US Geological Survey 1951の歴史都市Raleigh(ノースカロライナ州都ローリー)の縮尺1:62,500地図をジオコーディングしなさい。
----------------------------
nc_spm Location のファイル群をダウンロードしていない読者は,grassdataフォルダのすぐ下位にnc_spmのサブフォルダーを入れる必要がある。
下記サイトに公開されている。
https://grass.osgeo.org/download/sample-data/
complete NC location:
GRASS 6 full data tar.gz | zip (nc_spm, 135MB)
GRASS 7 full data tar.gz | zip (nc_spm, 145MB)
などが公開されている。
なお,本題から外れるが,世界の経緯度座標系Location(データなし)が掲載されているので,これもダウンロードしておくと便利だろう。
例えば,GRASS 7 full data をダウンロードしても,ここで教材とするraleigh_nc_1951.jpg,は無い。次のサイトにある。
North Carolina Educational Dataset: External data
http://www.grassbook.org/wp-content/uploads/ncexternal/
繰り返すが,Locationそのものは,すぐ上に掲載しているGrass 7 full data tar.gzなどをダウンロードして,grassdataフォルダの下位フォルダーとして,Windowsの場合はブラウザー,Macの場合はファインダ上でコピーしておく必要がある。Grass 7ではGrass 6.4で読み込むことができたファイルが読めないので注意が必要である。この現象はこのノースキャロライナのサンプルファイルについてのことであって,Grass 6で自らが作成してきたファイルが読み込めないということでは無い。
----------------------------
紙地図スキャン済みファイルraleigh_nc_1951.jpgのGrass xy Locationへの取り込み
Netelerの記述から僕の考えを追加したものが次のようである。
まずは取り込むためのregion設定が必要となる。コマンドモードでは,g.region n=232700 s=220400 w=632100 e=648700 res=10 -p
(gis.mでは,Config/Region/ Change region settings/
-pオプションは現在の領域を表示)
raleigh_nc_1951.jpgは,1,437x881ピクセルの画像である。画像は左上が(0,0)で,(x, y)=(1437, 881)だから(y方向は下方向が+),res=10だから,距離としては(x, y)=(14370, 8810)mとなる。まあ単位は無いと思ってもいいのだが。
先のregion設定では,
x軸方向: w-e = 632,100 - 648,700 = 16,600
y軸方向: n-s = 232,700-220,400 = 12,300
であるから,十分の余裕はある。このregion設定の東西南北の数値設定から見て,xy Locationは画像のxy軸ではなくて,原点は南西隅にあり,注意が必要である。
取り込みむ方法である。 XY(Location)/nc_exercise(この作業のために新たに作成したmapset)に取り込んだ直後,Layer Managerでマップレイヤーのタブを選んだ際の表示を次に示す。カラーデータなので,R(1)G(2)B(3)の3ファイルに分かれる。
次の図右手のレイヤー表示では,最下部のredマップが選ばれている。
なお,GrassのMap Displayで見る限り,Resolution = 10 mは全く反映されていない。この画像の左上は(0,881),右下は(1437, 0),左下は(0,0),となっている。それゆえ,通常のデカルト座標系で,単位は1で,画像のピクセル値に対応している。
xy座標系であっても,東西南北でRegion設定するのだが,まあ,何の意味もない。デカルトの平面直角座標系に過ぎない。使用上,問題は無いのだけども。
----------------------------
IV.4 幾何補正ツールへの誘い
まずは,GEORECTIFY TOOL (gis.m)
https://grass.osgeo.org/grass64/manuals/gm_georect.html
これを使って,よりわかりやすく,ノースキャロライナのサンプルを使って示したいと思う。
項番号はここでは,アルファベットを使う。
a. xy座標系(nc_xy)での紙地図スキャンファイルを確認:
前述のようにすでに,xy座標系にraleigh_nc_1951ファイルが XY Locationに入っている。
Grass 7を立ち上げて,XY Locationに入って,File/Manage maps/リスト,を選んで,必須タブで,raster fileとvector fileにチェックを入れると,下記の3ファイルが生成されている。カラーファイルがrgbに分解されているのである。
raleigh_nc_1951.3 b
raleigh_nc_1951.2 g
raleigh_nc_1951.1 r
この図面に関しては,塗りの部分の濃度の点で,raleigh_nc_1951.1 (red) が最も薄く,見やすくなっている。
b. GEORECTIFY TOOL (gis.m)/Using the Georectify Tool/Setupの説明:
Grassのロケーションが XY のままの場合,Grassを終了して,nc_spm_08_grass7のロケーションに入り直す。紙地図スキャンファイルを取り込んだmapsetを開く。
標準座標ファイルとして,streets-wake(vector)とlakes(raster)ファイルを表示する。lakesファイル青色に塗られている。1ファイルでも問題はない。
c. Select Georectify from the File menu.
ファイル/幾何補正処理(g.gui.gcp)を選ぶ。
Grass Georectifier(マップタイプとロケーション/マップセットの選択)パネル,が表示される。
幾何補正するマップタイプは,この場合は,ラスター。
元のロケーションの選択:XY
元のマップセットの選択:nc_exercise
となる。
次に,幾何補正を行う画像/マップグループの選択,パネルが現れる。すでに自動入力されている。
ここでのグループ選択:raleigh_nc_1951
無い場合はグループを作成:
マップ出力の拡張子:_georect19361
この拡張子は記録した方がよい。分析毎に,新たな拡張子が追加されるためである。
次に,測量基準点(GCP)作成の為に表示するマップを選択,パネルが現れる。コロンの右のファイル入力には参照機能がある。
表示するソースマップを選択:raleigh_nc_1951.1@nc_exercise
Select target raster map to display:
Select target vector map to display:
と出ている。redが最も見やすいので,「表示するソースマップ」(紙地図スキャンマップ)はこのままにするが,このLocationは XY である。ターゲットマップ(標準座標ファイル)は前述のように設定する。
表示するソースマップを選択:raleigh_nc_1951.1@nc_exercise
Select target raster map to display: lakes@PERMANENT
Select target vector map to display: streets_wake@PERMANENT
次に,GCP(地上基準点)管理パネルが現れる。ソースは,XYロケーションの紙地図スキャンファイル,ターゲットは,nc_spm_08_grass7ロケーションの標準座標ファイルである。
GCP (ground control point) manager windowも現れるが,ここでは,xy座標系,投影したい地理座標系,そしてRMS (root mean square)エラーも表示される。
このエラー値は,紙地図スキャンファイルと標準座標ファイルそれぞれの,対応control pointの距離を意味する。
GCP管理マネージャーの全貌を次に。
d. GCP manager 地上基準点管理
ここでは,通常のmap display同様,ズーム,パンなどの機能がある。使用法については,このパネル1段目の浮き袋アイコンをクリックすると,次のGrass helpファイルにアクセスが可能である。
GRASS GIS Manual/ wxGUI GCP Manager.webarchive
プラグラム内のヘルプファイル
file:///Applications/GRASS-7.0.app/Contents/MacOS/docs/html/wxGUI.gcp.html
d1. GCP managerのパネル構成
3パネルからなり,配置を換えることも可能である。
トップパネルのGCPリストの上位にはツールバーが配置されている。このGCP manager の外に置くこともできるし,地図パネルの上に配置することも可能である。
地図パネルが下部に配置されている。
<ツールバー上段>
1_Display map(目のアイコン),2_Re-render map: 下の表示パネルの更新であるが,1は情報が変更された際に表が更新される,2は変更されなくても更新される。
3_Erase(赤い消しゴム) display: 表示が消える。
4_Define GCP(Ground Control Points): マウスの左クリック上で,選んだGCPの座標が定義される。つまり,上段のパネルのリストに座標値が表示される。入力の際に,リストの第1行から下方にGCP入力の際に,それぞれの行を選ぶ必要がある。
5_Pan(四つ目家紋): 画像のクリックした場所を掴んで移動できる。
6_Zoom in, 7_Zoom out: 矩形を作るか,そのままクリックするだけで拡大,縮小。
これは便利 →
8_Adjust display zoom: GCPを入力している側の画面に応じて,他の画面表示域を同じにすることができる。
選択機能の表示の日本語訳が誤まっている。
「ソースからターゲットへの表示を調整する」の本当の意味は,
「ソース表示を,ターゲット表示に合わせる」,となり,他の選択肢にも同様の誤りがある。
9_ターゲット or ソース: 両画面のうち,いずれがアクティブ画面かを知ることができるし,ここでの操作でアクティブ画面を選択できる。
10_Return to previous zoom: 誤ってズームしたりすることがあり,元の拡大率に戻ることができる。10段階まで。
11_Zoom to extent of currently displayed map: 下部の2画面について,それぞれ,枠一杯に画像を表示する。
――――――――――――――――
12_Settings(黄色の歯車アイコン):
シンボロジーの設定:
Highlight - 最も高いエラー値のみをハイライト表示
(この選択肢は設定ボタンにある,作業過程で使うとわかるが,このディフォールトオプションのままにしておくと便利である。作業過程では,大きなエラーのものを修正するか,修正だきないのであれば削除するという選択肢しか無いのであるから)
Factor for RMS error threshold = M + SC*factor - 平均プラス1標準偏差より大のGCPは異なる色で表示される。平均プラス2標準偏差より大きいGCPは誤っている可能性が大きい。なお,Highlightオプションをオフにしないと色の違いで表されない。
Color - 上記の異なる色,を指定できる。
Color for high RMS error - 高いRMSの色を指定できる。
など。
幾何補正の手法の選択:
――――――――――――――――
13_Show Help(浮き袋): GCP managerのヘルプ表示。
14_Quit(電源アイコン): GCP managerの終了。
<ツールバー下段>
15_Add new GCP(プラス付き): 新しいGCPを既存リストに追加,および既存のGCPを編集する。
16_Delete selected GCP(×付き): リストで選択中のGCPを削除。
17_Clear selected GCP(マイナス付き): リストで(複数の)選択中のGCPデータをクリア。
18_Recalculate RMS error(Σ付き): リストで選んでいるGPSを使って,RMS errorを計算する。
19_Georectify(井形): i.rectifyを使って,ソースimagery groupのすべてのファイルを幾何補正する。ここでは,rgbすべての画像が対象になるということ。
幾何補正手法の選択は,選択ツールを使う。
20_Save GCPs to POINTS file: 作業中のLocation XYのimagery groupのフォルダーにPOINTSファイルを保存する。
21_Reload GCPs from POINTS file: 作業中のLocation XYのimagery groupのフォルダーにPOINTSファイルを再読み込みする。
d2.画面操作手順
左画面がソース画面,右画面がターゲット画面で,まずは,右画面からGCPの設定を行う。2画面の情報にあるGCPリストでは,画面配置同様,左手がソース座標値,ターゲット座標値になっているので,勘違いやすいから注意が必要である。
d3. GCP管理パネル最下部のステータスバー
このGCP管理パネル最下部には,現作業プロセスが見える。使ってみて,わかるだろう。
GCP No.へ進む:ステータスバー左端に,既存GCPの番号を指定可能。この操作によって,そのGCPを中心に画面表示できる。
RMSエラー:前進と後進が0.0でまずは表示されるが,GCPが増えてゆくと,全体のRMSエラー値が表示される。
投影法: 定義された投影法を使用,にチェックを入れる。
などなど。
コントロールポイント数は次のようになる。変換対象がベクトルデータの場合は,一次のアフィン変換のみが可能だが,ラスターファイルの場合,次のような段階がある。
最低3カ所: これで一次のアフィン変換が可能なのだが,これは水平移動と回転のみなので,元々の紙地図が地球座標系を持っており,その情報が得られない場合であろう。
最低6カ所: これで二次(多項式)変換が可能で,水平移動と回転に簡単なワーピング。
最低10カ所: これで三次の多項式変換が可能で,複雑なワーピングが実行される。
GCP値は,GCP manager windowに直接入力するなどの編集が可能である。通常は情報が限られているので,手作業での編集作業を想定するのは難しいだろう。
このウィンドウの各行について採用するかどうかは,エラー値を見て判断することがあるだろう。左端のUseボタンを選択すれば採用,選択を外せば不採用とすることができる。Useボックスを外した状態で,GCP manager windowの最上段のアイコンの左から二番目のeraseボタンを押すとその列を削除することができる。
総エラーの計算(最上段の左から三番目のRMSアイコン)は,Useボックスが選択されているものについて可能のである。行データの修正のたびに,このアイコンで計算することができる。
紙地図スキャンファイル上のGCPsデータは,イメージグループとともに,POINTSファイルとして保存することができる。POINTSファイルがある場合,georectificationのセッションをする際に自動的に読み込まれて,GCP manager windowに表示される。
幾何補正処理後には,GCPsのPOINTSファイルを21_reloadしても,一切,画面に現れなくなる。20_Save GCPsは確実に実施して,そののち,Grassを終了,立ち上げて,ファイル/幾何補正処理,を選ぶと,GCPsが現れる。
幾何補正の手法には種々のものがある。ここでは,nearest, linear, linear-f, cubic, cubic-f, ランチョシュlanczos, lanczos-fがある。-fはfactorizationの略。
幾何補正に関する解説として参考になるのは次のサイトなどである。
Geometric Image Transformations
http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html
以 上
以 上