smellman's Broken Diary

クソみたいなもんです

gdal2tiles.pyでコケるパターンの対処法

gdal2tiles.pyを使っているとたまにこんなエラーでコケることがあります。

ERROR 5: Illegal values for buffer size
ERROR 5: Illegal values for buffer size
Traceback (most recent call last):
  File "/usr/bin/gdal2tiles.py", line 2262, in <module>
    gdal2tiles.process()
  File "/usr/bin/gdal2tiles.py", line 478, in process
    self.generate_base_tiles()
  File "/usr/bin/gdal2tiles.py", line 1264, in generate_base_tiles
    dstile.WriteRaster(wx, wy, wxsize, wysize, data, band_list=list(range(1,self.dataBandsCount+1)))
  File "/usr/lib/python2.7/dist-packages/osgeo/gdal.py", line 796, in WriteRaster
    buf_pixel_space, buf_line_space, buf_band_space )
TypeError: not a string

これが起きるのはどうも元データの解像度が良くないというのがあって、画像のサイズを変更するとうまくいくというなんでそうなったんだみたいなFAQが出てきます。そして本当に画像のサイズを変更するとうまくいくのでなんじゃこりゃっていう感じなんですが、とりあえず対応手順をメモしておきます。

今回利用するのは地球地図のフィリピンの標高データです。というか僕が試してコケたのがこのデータだけなんですが。

地球地図については省略というか、今月末のFOSS4G 2014 Tokyoでセッションをやるので来ていただきたく(宣伝)。

さて、まずダウンロードしたzipファイル(gm-phl-el_1_0.zipという名前のはず)を解凍します。

解凍するとglobalmというディレクトリができます。
この中の globalm/area/raster というところにbilファイルが転がっているので、とりあえずこいつを一つのGeotiffにします。

gdalbuildvrt --config GDAL_CACHEMAX 1024 merged.vrt globalm/area/raster/*.bil
gdal_translate -a_srs EPSG:4326 --config GDAL_CACHEMAX 2048 merged.vrt merged.tif

次にこのファイルの解像度を変更してやるんですが、先に大きさを調べます。

gdalinfo merged.tif

出力でSize is というところをチェックします。

Size is 1800, 3000

次にこのファイルをgdalwarpで変換をかけます。ここでのポイントは2つあります。

  1. -ts オプションで倍の解像度にする(倍じゃなくていいけど)
  2. -srcnodata オプションをつけてno dataとして扱う値をちゃんと指定しておく。(これをしておかないと変なデータになる)
gdalwarp -overwrite -s_srs EPSG:4326 -r near -ts 3600 6000 -of EHdr -srcnodata 9998 merged.tif output.tif

あとはQGISで読み込んでSingleband pseudocolorでがんばって色付けします。

f:id:smellman:20141015003459p:plain

あとはこのレイヤーを画像として保存します。

f:id:smellman:20141015003800p:plain

この時の注意点は二つ。

  1. ExtentのLayer Extentというボタンを押す。
  2. Create OptionsでProfileを選んでおく。

これで変換可能なGeoTiffが出来たので、gdal2tiles.pyで処理します。

gdal2tiles.py -r near -e -v -z 4-6 el_phl_test.tif output_tiles

とりあえず、要点としては以下の二つ。

  1. gdal2tiles.pyでこけたらgdalwarpで解像度を変更する
  2. FOSS4G 2014 Osaka/Tokyoに遊びに来て下さい

なお、FOSS4G 2014 Osaka/Tokyoの固定ページがないのは僕がWebサイト構築をする余裕が無かったからだと思います!!!!!!!