巨大TIFFファイルをMapserverが食ってくれなかったが食えるように体質改善を施した

Blu-Rayドライブ持ってないぞ…と思ってたら、ボス(正確に言うとそうではない)が共用パソコンにセット済みだったので、これを借りて事なきを得る。
Mapserverに食わせるのにあっという間に成功したと思ったら、実は他のサーバに読みに行ってたという失態。今回頂いたデータを食わせたら、Mapserverさんはエラーを吐きやがった。
"cannot access (ファイル名)" とかいうメッセージ。File Not Found っぽいので、パーミッションを変えたりパスを変えたりしてみたけれども、全く事態は好転せず。ワールドファイルが読めないのかと思ってデータを送ってきてくれた方に「ワールドファイル送れ」と言おうと思ったけれども、その前に自分でワールドファイルを作成できないかと検討してみる。とりあえず、listgeoで座標範囲を得ようとしたところ "This is a BigTIFF file. BigTIFF is not supported by this version of libtiff." とか言われて挫折。
しかしこれが直後に生きてくるのだから人生は不思議なもの。
話を戻しましょう。
考えを変え、とりあえずMapserverのソースを見ようとしました。File Not Foundの場合は "cannot open" というメッセージを出すらしいことが分かる。ほう "cannot access"の場合は、ファイルが発見できないのではなく、別の理由があるんだな。
小さいTIFFファイルだったらセーフだったのを踏まえると、大きなファイルだから失敗したのだろう、というところまで考え付く。
ここで、さきほどlistgeoを使った際に「*このバージョン*のlibtiffではサポートしてないよ」と怒られたことを思い出す。逆に言うと、新しいバージョンではOKなのかも知れない。
ということで最新版を入れてみる。
libtiffのページに行くと、最新版は3.9.1だそう。とりあえず落として、ビルドして、インストールするも、事態は好転しませんでした。
しばらく複数のウェブサイトをさまよっていたところ、libtiff4はBigTIFFをサポートするとかなんとか。
ということで、libtiff 4.0.0b4 を入れる。これにあわせて、geotiffもgdalも再ビルド。この時点で再び listgeo を使うと、おお巨大TIFFファイルを食ってくれたじゃないか。
最後に UMN Mapserverをビルドしようとしたところ、コンパイルエラー。
libtiff4ではTIFFDirEntryという構造体がヘッダファイルに入っていない。libtiff添付のドキュメントを見ると、どうもこの構造体はlibtiff3以前で使われていたものであって、もう使わないものらしい。
一瞬、Mapserverのソース改変もよぎったけれども、そんな時間もないし…こういうブログで要点だけ書かずに余計な部分を書いている人間が何を言うか、とセルフでチェック入れておきました。
その前に、「libtiffを使用せずにビルドしてやれば、Mapserverがgdalを使ってくれて、gdalがどうにかしてくれるのでは」と勝手に考えて、libtiffを使わないようビルドしたら、その勝手に考えた通りに動作してくれました。これでOK。ほっとした。
まとめると、

  • libtiff3はBigTIFFに対応していないのでBigTIFFを扱う場合はlibtiff4にする
  • MapserverオリジナルのTIFF読み込みを使わずにgdalを使う