地理院さんの空中写真+ワールドファイルをマージする

はじめに

地理院さんが被災地空中写真を出されています。簡易オルソ化したうえ、ワールドファイルも置いてくれているというものです。
これをマージしようとするものです。また、JPEGで配布されていて、JPEGは透過非対応ですので、マージ時に余計な白が出てきたりしますし、また投影変換時に余計な黒が出てきます。これを透過にマージして、さらにタイル化まで持っていくのが今回の作業です。

使用条件は遵守しましょう

地理院さんの出されている使用条件には必ず従って下さい。
分からなかったら地理院さんのウェブサイトを見て、それでも分からない場合は地理院さんに聞いて下さい。悪いようにはしない、と思います。
なし崩し的に条件を守らない、ということが目立つと、今後に響く可能性が十分に考えられます。
あと、使用条件が変更になることが予告されています。条件変更があったらすぐに対応しましょう。
あんまり地理院さんを困らせない方向で。

用意するもの

  • GDAL 1.8 ("-a_nodata none"は1.8以降)
  • Imagemagik (convertという実行ファイルを使っています)
  • GIMP (フォトレタッチ。別にGIMPである必要はありません)

手順

  • jpegを落としてくる。
  • jpegごとに、convert -alpha on (jpeg) (出力png) でpngファイルを作る。alpha onはアルファチャネルを入れるもので、GIMPでもできるけど、こっちでやっといた方が操作が楽。
  • GIMPなりでpngファイルのひとつずつ白いところを「あいまい選択」で選択→カット→保存 (クリック→Ctrl+x→Ctrl+s)
  • ワールドファイルを展開→拡張子がjgwなのをpwwにする(これでそのままpngのワールドファイルになります)。pgwはpngと同じフォルダに置いておく。
  • gdalwarp -dstnodata "255 255 255 0" (pngファイル) (出力tifファイルA) でマージ。データのない部分は RGBA = 255,255,255,0 になり、透明(透過非対応では白)になる。

WGS84正距円筒に投影変換

  • gdalwarp -s_srs epsg:2425 -t_srs epsg:4326 -dstnodata "255 255 255 0" (tifファイルA) (出力tifファイルB) で投影変換。

これで MapServer に持っていったら、とりあえずうまくいきました。

タイル画像生成

  • gdalwarp -s_srs epsg:2425 -t_srs epsg:900913 -dstnodata "255 255 255 0" (tifファイルA) (出力ファイルC) で投影変換。
  • gdal_translate -a_nodata none (tifファイルC) (出力ファイルD) でnodataタグを落としたtif生成。
  • gdal2tiles -z "0-18" -s epsg:900913 -p mercator (tifファイルD) でタイル生成。

nodataについて

gdalwarp で -dstnodata "255 255 255 0" としているのは、投影変換の際に隙間ができるので、これを透明(不透明にすると白)にするためです。これは普通にやります。
この際に出来上がったGeoTIFFファイルには、バンド毎にNoDataタグが埋め込まれます。
これが食わせ物。gdalinfoで見れば分かりますが、255,255,255,255 になっています。このままいくと、白色(不透明)がNoData認定されて、コンクリの建物の一部が透明にされてしまいます。
そこで、タイル画像作成時には、ややこしいですが、いったんNoDataタグを落として、RGBAだけを見てもらうようにしておきます。

注意点

  • QGISで確認しようとした場合、少なくとも QGIS 1.6 ではアルファチャネルを認識しません。透明にしたはずなのに白くなっていても、とりあえず無視。
  • MapServerは、どうもNoDataタグを見てないんじゃないかと思う。だからNoDataタグを落とさずとも、白色(不透明)がNoData認定されません。でもたぶんGDAL使ってるだろうから、なんでかは分かりません…。MAPFILEのOFFSITEがあるからNoData見なくて良いや、という考えかも知れませんが…。