国土地理院正射(オルソ)空中写真の利用

Feb. 25, 2017 作成開始        Mar. 6 追加修正 

I. オルソ写真の購入

  オルソ写真の商品には,
「国土地理院刊行の正射写真」,
GEOSPACE航空写真2500高解像度,GEOSPACE航空写真2500,GEOSPACE航空写真5000 (25cm),GEOSPACE航空写真5000 (50cm),
DET航空写真データ,がある。
  明日香村周辺では,
「国土地理院刊行の正射写真」とGEOSPACE航空写真2500,だけが提供されている。
  先に当方の感想を。 国土地理院のオープンリソースの空中写真とDEMを材料にGrassの i.ortho.photoなどでオルソ化作業をするよりも,「国土地理院刊行の正射写真」を購入した方が絶対と言って良いほど廉価で人生を無駄にしない。というわけで日本の空中写真のオルソ化をする意味が見つからない。ただし,空中写真の撮影年次に拘る場合は自分で実行することになる。
  Geospaceは高精度ではあるけれど,当方には入手する意味がわからない。

1. 国土地理院刊行の正射写真

  国土地理院製オルソ写真は, 日本地図センターから購入することになる。下記の同センターサイトで,撮影範囲と写真番号を知ることができる。
http://maps.jmc.or.jp/#t=digital_data_aerial_det&ll=34.477778,135.822330&z=15&mt=gsimaps
左のペーンで,写真種を選ぶと,提供されている場合には,インデックスが地図上に表示される。

前者の場合,明日香村の当方が必要な範囲のコード番号は,
48894000 12411000
48894000 12408000
が必要となる。

図 Asuka_Orthophoto

http://www.gsi.go.jp/MAP/kounyu.html

でみると,正射画像データ 30秒×30秒区画(地上画素寸法20cmまたは40cm) 3,086円
刊行国土地理院フォーマットTIFF形式価格3,086円(税込)注記本製品のダウンロードでの提供はございません。DVD等でのご提供となります。

  下記のGEOSPACE航空写真の精度は高いが,この国土地理院のものも地表精度は20cmという細かいものである。次の図のように,計画年次で区別されている。明日香村は2011年10月撮影,この北隣の桜井市などでは2008年と古い。ただ,精度はやはり20cmである。

図 Asuka_Orthophoto2

   飛鳥の谷をすべてカバーするには,48894000-12408000, -12411000, -12414000, -12417000 の4メッシュが必要となる。

   購入は,
トップページ > 地図・空中写真を買う > 空中写真-国土地理院> 国土地理院刊行の正射写真
http://www.jmc.or.jp/photo/gsiortho.html

にあるように,用意されているPDFに記述して,メール,郵送,ファックスで実施する。

  ご注意ください
今回刊行された正射画像データ及び正射出力印画は、地上の構造物まで正射変換されていませんので、ビルディングや高塔などの地上構造物は倒れた状態で写っていることがあります。また、当センターでは、地上構造物まで正射変換した(ツゥルーオルソ)画像データや出力印画を作成・提供することはできません。

正射画像データは正規化データであり、1区画の画素数(ピクセル数)はどこの場所も同じです。
(画像をそのまま印刷出力すると、北海道も東京も沖縄も同じ大きさとなります。)

  仕様は,明日香村についてはこの表の左手になる。Grassではカラー画像を取り込むとrgb3ファイルから構成される。

 

  次の画像がその注文書例である。

 

2. NTT空間情報の正射写真

  GEOSPACE航空写真2500の場合,06PD652と,この南隣の06PD654が必要となる。

図 Asuka_OrthoGeospace2500

 「国土地理院刊行の正射写真」に比べると, こちらの方が求める領域を余裕を持ってカバーしている。
 Geospace関係は,NTT空間情報から購入することになる。
http://www.ntt-geospace.co.jp/geospace/koukuu.html
解像度25cm 地図情報レベル1/2500
※フォーマット:TIFF ※1メッシュは2.0km×1.5km(3km2:国土基本図単位)シングルライセンスです。
※ご提供は基本4メッシュからの販売となります。追加は1メッシュ単位で承ります。(1メッシュからの販売についてはお問い合わせ下さい)
1メッシュ25,000円で,最低限4メッシュだから最低10万円以上

II. オルソ写真のGrassGISへの取り込み

1. 届いた正射空中写真

    送付されたファイルは4メッシュ分で,それぞれ3ファイルからなる。
48894000-12408000-photo-20111009-20111009-ckk20114-20-500-c8-a.dem
48894000-12408000-photo-20111009-20111009-ckk20114-20-500-c8-a.tfw
48894000-12408000-photo-20111009-20111009-ckk20114-20-500-c8-a.tif

48894000-12411000-photo-20111009-20111009-ckk20114-20-500-c8-a.dem
48894000-12411000-photo-20111009-20111009-ckk20114-20-500-c8-a.tfw
48894000-12411000-photo-20111009-20111009-ckk20114-20-500-c8-a.tif

48894000-12414000-photo-20111008-20111008-ckk20114-20-500-c8-a.dem
48894000-12414000-photo-20111008-20111008-ckk20114-20-500-c8-a.tfw
48894000-12414000-photo-20111008-20111008-ckk20114-20-500-c8-a.tif

48894000-12417000-photo-20111008-20111008-ckk20114-20-500-c8-a.dem
48894000-12417000-photo-20111008-20111008-ckk20114-20-500-c8-a.tfw
48894000-12417000-photo-20111008-20111008-ckk20114-20-500-c8-a.tif

     各メッシュに対して,demと.tfwとtifの計3ファイルである。tifファイルはGeotifではないので,CS6座標系で用意されたとは言っても,そのままでは全く使えない。なぜ,Geotifで供給してくれないのであろうか。すごく疑問に思う。

 

2. ワールドファイルの中味の確認

    .tfw ワールドファイル付きのtifイメージファイルからGeotiffファイルを作成する流れにはなるが, GrassGISにはその機能はない。
    例えば,
飛鳥の谷四枚の最南端のtiff画像のワールドファイル
48894000-12408000-photo-20111009-20111009-ckk20114-20-500-c8-a.tfw
をエディターで開くと,次の6行の数値からなる。

0.0000022222
0.0000000000
0.0000000000
-0.0000017921
135.8166677778
34.4749991039

    国土地理院の説明では,CS6(meters)であったはずだが,やっぱり国土地理院のデータだから,eastingの代わりに東経,northingの代わりに北緯で位置決めがなされている。GISの(x,y)の軸名称の取り決めが,ワールドファイルでは異なる。通常のデカルト座標系 (Cartesian coordinate system) の(x,y)座標軸が使われる。一般の画像のように,位置決めの原点は左上隅で,右方向がX軸方向,下方向がY軸方向になる。

次のリモートセンシング講座から一部をコピペする。http://rs.aoyaman.com/seminar/about7.html

X座標は東方向(右方向),Y座標は北方向(上方向)にあたり,アフィン変換式は次のように表す。
 X=a・x+b・y+c
 Y=d・x+e・y+f
例えば,ワールドファイルに次のテキストが示されている場合,
 2.5
 0.0
 0.0
 -2.5
 357907.598664
 3994193.441964

 1行目は、アフィン変換式の係数a … Xスケール(1ピクセルのX方向の長さ)
 2行目は、アフィン変換式の係数d … X方向の回転角度(一般的には0°)
 3行目は、アフィン変換式の係数b … Y方向の回転角度(一般的には0°)
 4行目は、アフィン変換式の係数e … マイナスYスケール(1ピクセルのY方向の長さ)
 5行目は、アフィン変換式の係数c … ラスターデータの左上中心位置のX座標(又は東経)
 6行目は、アフィン変換式の係数f … ラスターデータの左上中心位置のY座標(又は北緯)
である。a, d, b, e, c, fの順である。
(モートセンシング講座,ここまで)

    48894000-12408000-photo-20111009-20111009-ckk20114-20-500-c8-a.tifファイルをAdobe Photoshopの画像解像度でみると,
画像サイズ: 49.9MB
寸法: 3750 px × 4650 pxと縦長になっている。
ちなみに,
幅: 1322.92 mm
高さ: 1640.42 mm
解像度: 72 pixel/inch
である。

    飛鳥の谷4枚の最南端のtiff画像のワールドファイルを再掲する。

① 0.0000022222… Xスケール(1ピクセルのX方向の長さ)
② 0.0000000000… X方向の回転角度(一般的には0°)
③ 0.0000000000 … Y方向の回転角度(一般的には0°)
④ -0.0000017921… マイナスYスケール(1ピクセルのY方向の長さ)
⑤ 135.8166677778… ラスターデータの左上中心位置のX座標(又は東経)
⑥ 34.4749991039 … ラスターデータの左上中心位置のY座標(又は北緯)

    国土地理院の正射画像データは,経度差,緯度差ともに,30秒である。これを度にすると,
30/60/60 = 0.008333333となる。さて,

① 0.0000022222… Xスケール(1ピクセルのX方向の長さ)
 ((135.8166677778+0.008333333) - 135.8166677778) / 3750
= 0.008333333/3750
= 0.0000022222º
となり,一致する。
④ -0.0000017921… マイナスYスケール(1ピクセルのY方向の長さ)
 (34.4749991039 - (34.4749991039 - 0.008333333)) / 4650
= 0.008333333/ 4650
= 0.0000017921º
であるが,このワールドファイルで-0.0000017921とマイナス値となっているのは,画像原点である左上隅からすると下方は+値であるが,地球座標系ではマイナス方向だから,ベクトル表現されているのである。

    この国土地理院のワールドファイルは,経緯度座標系で統一されていることがわかる。

 

3. gdal_translate コマンドで平面直角座標系地図画像をGeotiff画像へ変換

    さて,gdalを使って,gdal_translate input.tif ouput.tif を実行するのであるが,国土地理院から供給されたtif画像は,CS6座標系でのイメージデータになっているのに,ワードファイルに示された画像情報は経緯度座標系で表示されているのである。悩ましいところである。なんでこんなヘンテコが続いているのか,わからない。なお,「CS6座標系でのイメージデータ」というのは,CS6座標系でのDEM,つまり高度情報を使って,中心投影の空中写真を,正射化=オルソ化されたものであり,先のリモートセンシングの式のように,縦横の拡大収縮と回転されたものではない。正射化された空中写真をGISに取り込む際に,この種のシンプルなアフィン変換をするコマンドが,gdal_translateである。
    マックの場合は,X-Windowsで,Windowsの場合は,fwtoolsをダウンロードして利用すればよい。
FWTools on Windows
http://fwtools.maptools.org/windows-main.html

    ここでは,GDALのコマンド gdal_translate のhelpを参照する。
http://www.gdal.org/gdal_translate.html

    使う面からの親切な説明はつぎのものである。s
http://www7b.biglobe.ne.jp/~oyama/GDAL/gdal.html

参考 スタート ————————————————————————————————
◆ 画像に座標を与えて幾何補正する -gdal_translate- -gdalwarp-  

・まず、gdal_translateのオプション[-gcp]を使って緯度経度情報を追加した中間ファイル(intermediate file)を作る  
# gdal_translate -gcp [column plxel] [row plxel] [longitude] [latitude]
                    [input file name] [intermediate file name]
 [columu pixel]は横軸のピクセル、[row pixel]は縦軸のピクセル、緯度経度は10進数で与える
 -gcpはいくつでも増やすことができ、多いほど幾何補正の精度が高くなる

・次に、中間ファイルを幾何変換する
 gdalwarpのオプション[-s_srs]を使って元データの座標系を与え、オプション[-r]を使って内挿法(resampling method)を指定する
 
# gdalwarp -s_srs EPSG:[source EPGS code] -r [resampling method]
                    [intermediate file name] [output file name]
 内挿法にはnear(最近傍法)やcubic(三次たたみ込み内挿法)などがある
 デフォルトはnearだが、精度が悪いのでcubicを使った方がよい

【使用例】
 縦のピクセル数が200、横のピクセル数が300, wgs84測地系、緯度経度座標系の画像ファイルtest.tifがあったとする
 この画像の四隅の緯度経度が北:35.0 南:40.0 東:141 西:138 だったとすると4点のGCPがとれるので
 
# gdal_translate -gcp 0 0 138 35 -gcp 300 0 141 35 -gcp 0 200 138 40
                    -gcp 300 200 141 40 test.tif intermediate.tif
 wgs84測地系、緯度経度座標系のEPSGコードは4326なので、内挿法をcubicにすると  
# gdalwarp -s_srs EPSG:4326 -r cubic intermediate.tif output.tif

参考 エンド ————————————————————————————————

   とはいえ,  このような作業をしてしまうと,国土地理院の正射空中写真を歪めてしまう。それゆえ,本フレームセットの左のペーンの
「 ☆ 空中写真のオルソ化」のコンテンツの見出しのすぐ上にある「geotiffの作成」に示した方法がよい。

    gdal_translate -of "GTiff" -a_srs EPSG:???? -a_ullr 左上X座標 左上Y座標 右下X座標 右下Y座標 input.tif output.tif

という構造を使うのである。
48894000-12408000-photo-20111009-20111009-ckk20114-20-500-c8-a.tfw
に示されたtif画像の四隅の経緯度表現を,まずは,CS6に変換することになる。
エクセルの表に整理した。これまで述べてきた最南端のメッシュを除く他の3メッシュのワールドファイルを次にh示す。

48894000-12411000-photo-20111009-20111009-ckk20114-20-500-c8-a.tfw
0.0000022222
0.0000000000
0.0000000000
-0.0000017921
135.8166677778
34.4833324373

48894000-12414000-photo-20111008-20111008-ckk20114-20-500-c8-a.tfw
0.0000022222
0.0000000000
0.0000000000
-0.0000017921
135.8166677778
34.4916657706

48894000-12417000-photo-20111008-20111008-ckk20114-20-500-c8-a.tfw
0.0000022222
0.0000000000
0.0000000000
-0.0000017921
135.8166677778
34.4999991039

    作業をする上で,ファイル名が長すぎるので次のように簡略化する。

12408000.dem  12408000.tfw  12408000.tif
12411000.dem  12411000.tfw  12411000.tif
12414000.dem  12414000.tfw  12414000.tif
12417000.dem  12417000.tfw  12417000.tif

    そして, 当方のマックでは,次の4 tiffファイルその下のパスに格納する。
12408000.tif  12411000.tif  12414000.tif  12417000.tif
    moto/grassdata/FileConvert_folder/Orthophoto_Asuka/Orthophoto_Asuka

gdal_translate -of "GTiff" -a_srs EPSG:2448 -a_ullr 左上X座標 左上Y座標 右下X座標 右下Y座標 input.tif output.tif

    4ファイルについてコマンド行を作成するのであるが,入出力ファイルについてはパス指定が必要となる。私の場合は,/Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/をファイル名の前に冠することになる。4ファイルについてのコマンド行を次に示す。

gdal_translate -of "GTiff" -a_srs EPSG:2448 -a_ullr -16840.5788 -169158.9821 -16076.6903 -170084.6702 /Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/12408000.tif /Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/Orthophoto_Asuka12408000.tif

gdal_translate -of "GTiff" -a_srs EPSG:2448 -a_ullr -16838.9045 -168234.6473 -16075.0925 -169160.3371 /Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/12411000.tif /Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/Orthophoto_Asuka12411000.tif

gdal_translate -of "GTiff" -a_srs EPSG:2448 -a_ullr -16837.2298 -167310.3108 -16073.4942 -168236.0021 /Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/12414000.tif /Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/Orthophoto_Asuka12414000.tif

gdal_translate -of "GTiff" -a_srs EPSG:2448 -a_ullr -16835.5547 -166385.9738 -16071.8956 -167311.6661 /Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/12417000.tif /Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/Orthophoto_Asuka12417000.tif

これで,問題なく,  tiff画像はGeotiff画像に変換できた。

 

4. gdalコマンドでGrassGISのCS6のロケーションに取り込む

次のコマンドを実行すると,

r.in.gdal -o -e input=/Users/moto/grassdata/FileConvert_folder/Orthophoto_Asuka/Orthophoto_Asuka12408000.tif output=Orthophoto_Asuka12408000 --overwrite

Input raster map is flipped or rotated - cannot import. You may use 'gdalwarp' to transform the map to North-up.

というエラーメッセージ。

https://grass.osgeo.org/grass64/manuals/r.in.gdal.html
ここでは,
"ERROR: Input map is rotated - cannot import."
In this case the image must be first externally rotated, applying the rotation info stored in the metadata field of the raster image file. For example, the gdalwarp software can be used to transform the map to North-up (note, there are several gdalwarp parameters to select the resampling algorithm):
gdalwarp rotated.tif northup.tif

  こういう説明ではあるが, 結局,右下の座標値の計算を誤った。これを回避するために,次のように,まとめた。

————————————————
座標系の関係を,次のように整理した。

   デカルトxy直交座標系
  x軸 y軸
経緯度XY座標系 X東経度 Y北緯度
平面XY直角座標系 Y座標値 X座標値

    そこで,-a_ullr 左上X座標 左上Y座標 右下X座標 右下Y座標
は勘違いしやすい。X軸とY軸の使い方が画像と座標系では逆になるので,
-a_ullr W端座標 N端座標 E端座標 S端座標
と考えた方が良いだろう。

12408000正射空中写真の左上隅の場合,

   デカルトxy直交座標系
  x軸 y軸
経緯度XY座標系 135.816667778 34.474999104
平面XY直角座標系 西端: -16840.5788 北端: -169158.9821

12408000正射空中写真の右下隅の場合,

   デカルトxy直交座標系
  x軸 y軸
経緯度XY座標系 135.825001111 34.466665771
平面XY直角座標系 東端:-16076.6903 南端:  -170084.6702

    4メッシュの計算結果を次に示す。

併せて,このエクセルファイルを添付する。

    なお,上の表の, 経緯度座標系から平面直角座標系への変換は,国土地理院の計算サイトで実施した。
経緯度から平面直角座標系への変換
http://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2xyf.html
このページで,経緯度XY座標値を入力すると,平面直角座標系のX座標値とY座標値が出力され,地図上にも位置が示されるが,上の表のようにX値とY値が入れ替わるか。

 

5. フルカラー画像のGrassGIS上での合成

    以上述べた経過で, 個々のgeotifファイルをr.in.gdalでGrassに取り込むと,24ビットのフルカラー画像は自動的にrgb三成分に分割されて,個々のgeotifファイル,例えばOrthophoto_Asuka12408000.tifに対して,

Orthophoto_Asuka12408000.red
Orthophoto_Asuka12408000.green
Orthophoto_Asuka12408000.blue

が作成される。

    個々のrgbファイルは,たとえばつぎのようにグレイ表示になっている。オルソ画像の上にベクトルマップを載せている。次の二枚の画像のうち,上は,メッシュ分を表示している。下のものは飛鳥寺付近の拡大図である。いずれもblueマップだけを表示している。

 

    前述のように,rgbそれぞれにグレースケールのラスターマップが作成される。このために,フルカラー表示のためには,再合成する必要がある。
1. 合成のためには余計な領域を含めないようにしなければならない。そこで,g.region(tcl/tk guiの場合,Config/Region/Change region settings)で,3原色マップのいずれかを使ってマップ領域を限定する。
g.region rast=Orthophoto_Asuka12408000.blue@Asuka rows=4650 cols=3750 --overwrite

2. 3原色マップの合成には,r.compositeを使う。tcl/tk guyでは,raster/Manege map colors/Create rub,で,普通は2^8だから,levels=256とする。
r.composite red=Orthophoto_Asuka12408000.red@Asuka green=Orthophoto_Asuka12408000.green@Asuka blue=Orthophoto_Asuka12408000.blue@Asuka lev_red=256 lev_green=256 lev_blue=256 output=Orthophoto_Asuka12408000_composite --overwrite
結果はつぎのよう。X-windowsで実行してうまく行った。

GRASS 6.4.4 (Plane6_JGD2000):~ > r.composite red=Orthophoto_Asuka12408000.red@Asuka green=Orthophoto_Asuka12408000.green@Asuka blue=Orthophoto_Asuka12408000.blue@Asuka lev_red=256 lev_green=256 lev_blue=256 output=Orthophoto_Asuka12408000_composite --overwrite
Creating color table for output raster map...
100%
Writing raster map <Orthophoto_Asuka12408000_composite>...
100%
r.composite complete. Raster map <Orthophoto_Asuka12408000_composite>
created.

g.region rast=Orthophoto_Asuka12411000.blue@Asuka rows=4650 cols=3750 --overwrite

r.composite red=Orthophoto_Asuka12411000.red@Asuka green=Orthophoto_Asuka12411000.green@Asuka blue=Orthophoto_Asuka12411000.blue@Asuka lev_red=256 lev_green=256 lev_blue=256 output=Orthophoto_Asuka12411000_composite --overwrite

g.region rast=Orthophoto_Asuka12414000.blue@Asuka rows=4650 cols=3750 --overwrite

r.composite red=Orthophoto_Asuka12414000.red@Asuka green=Orthophoto_Asuka12414000.green@Asuka blue=Orthophoto_Asuka12414000.blue@Asuka lev_red=256 lev_green=256 lev_blue=256 output=Orthophoto_Asuka12414000_composite --overwrite

g.region rast=Orthophoto_Asuka12417000.blue@Asuka rows=4650 cols=3750 --overwrite

r.composite red=Orthophoto_Asuka12417000.red@Asuka green=Orthophoto_Asuka12417000.green@Asuka blue=Orthophoto_Asuka12417000.blue@Asuka lev_red=256 lev_green=256 lev_blue=256 output=Orthophoto_Asuka12417000_composite --overwrite

    下の二枚の図は,全域と拡大図である。全域図で最も北のメッシュは, red=256 lev_green=256 lev_blue=256の配分を誤った結果である。もちろん,この後で修正したが,取り込んだ4図をまとめて表示することで誤りがわかる場合がある。

次の図は, 部分拡大しています。ベクトルマップを上に載せている。このページに表示の際に,多少歪めてしまった。お許し頂きたい。
ベクトルマップとオルソ写真がほぼ完全一致している。もちろん,ベクトルマップは作成者の努力にきせられるので多少の不一致は,むしろ,オルソ写真の方が正しいと考えるべきであろう。


以 上