オープンデータの航空写真(オルソ画像)をタイル化して配信できるようにする

自治体がオープンデータとして公開しているオルソ化航空写真を他のインターネット地図との重ね合わせやOpenStreetMapの編集ツールで背景に設定できるようにタイル化します。
以前ブログに書いた記事のリライトです。vrt形式を覚えたので中間ファイル分の容量を節約できるようになりました。
例として[静岡市](http://dataset.city.shizuoka.jp/dataset/h27oruso)と[鹿児島市](http://www.city.kagoshima.lg.jp/jousys/opendata.html)のデータを使用しますが、他も概ね同じ手順でできるのではないかと思います。

## 作業の流れ
作業の流れは以下の２ステップです。
1. 分割されている写真をつなぎあわせて1つの仮想ファイルにする(マージ)
2. マージでできた仮想全体ファイルをタイルに分割する

## 動作環境
Ubuntu 14.04 LTSを使っています。作業に使用する GDAL はクロスプラットフォームなのでMacやWindowsでも同様の手順でできると思います。
元データと出力ファイルを置くためにそれなりのストレージが必要です。

### データ量の例

|                     |元データ|出力ファイル<br>(zoom 12-19)|
|---------------------|-------:|-----------:|
|静岡市固定資産税課 H28 |    21GB (tif)|        18GB (png)|
|掛川市 H26 |    1.7GB (jpg)|        13GB (png)|
|鹿児島市 H27.1        |   9.6BG (jpg)|      33GB (png)|
|鹿児島市桜島 H21.1    |   561MB (jpg)|       2.1GB (png)|
|御前崎市 H28.11 | 1.4GB(jpg) | 3.8GB(png)|

今回はお名前.com VPSの2GBプラン(ストレージ200GB)の無料お試しを使いました。

### ディレクトリ構成
例として以下のような構成で説明します。適宜読み替えてください。

```
/home/kudarisenmon/
├── bin
│   └── gdal2tiles.py
├── photo
│   ├── 02OC584.jgw
│   ├── 02OC584.jpg 
|  ～～～（省略）
|   └── merged.vrt
└── tile
    ├── 12
    │   ├── 3531
    │   │   ├── 2423.png
    ～～～（省略）
    └── 19
        ├── 452004
        │   ├── 310147.png
    ～～～（省略）
```


## 前準備
GDALのパッケージをインストールします。

```
$ sudo apt-get install python-gdal gdal-bin
```

しかし、このパッケージに含まれている gdal2tile.py はタイル作成で以下のエラーになります。

> ERROR 6: EPSG PCS/GCS code 900913 not found in EPSG support files.  Is this a valid EPSG coordinate system?
> ERROR 6: No translation for an empty SRS to PROJ.4 format is known.

詳しくはわからなかったのですが、900913は正式なEPSGではないみたいで、タイルに使われるのはEPSG:3857とのこと。
プログラムを読みましたが外部から指定できる方法はなさそうなので書き替えて対応します。
オリジナルはそのままにして、ホームディレクトリに改造版を置いて使います。

```
$ mkdir ~/bin
$ cp /usr/bin/gdal2tiles.py ~/bin
$ curl https://gist.githubusercontent.com/kudarisenmon/26edffd8b6a058ed3fbb58bbb2d3fb63/raw/c9362f9f128cb456b2dbefc53920dfe6b2a2cf96/gdal2tiles.patch
$ patch ~/bin/gdal2tiles.py < gdal2tiles.patch
```

### 環境変数 GDAL_CACHEMAX のセット
GDALのユーティリティ群で使われるキャッシュメモリのサイズを指定します。
省略すると50MB〜100MB程度のメモリしか使われないので今回のような巨大なファイルを加工するときにとても時間が掛かります。
今回のVPSはメモリが2GBなので GDAL_CACHEMAX は1536(1.5GB)を指定しました。
メモリが潤沢ならばもっと大きな値を指定したほうが早くなると思われます。

```
$ export GDAL_CACHEMAX=1536
```

## ステップ１：分割されている写真をつなぎあわせて1つの仮想ファイルにする(マージ)
自治体から手に入れた画像ファイルを全部１つのディレクトリに入れます。
あわせて配布されている[ワールドファイル](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)(拡張子がjgwまたはtfwのファイル)も画像を同じディレクトリに入れます。
ワールドファイルが複数種配布されている場合は「世界測地系」のものを使います。

~/photo にjpg形式の画像を置いた場合は以下のコマンドでマージを実行します。

```
$ gdalbuildvrt ~/photo/merged.vrt ~/photo/*.jpg
```

## ステップ２：マージでできた仮想全体ファイルをタイルに分割する
今回はズームレベル12〜19のタイルを作ってみます。
改造したホームディレクトリにある dal2tiles.py を使います。
コマンド引数に指定する EPSG は場所によって違うことに注意してください。
[平面直角座標系とEPSG](http://qiita.com/kudarisenmon/items/2003b982247448affcf6)にまとめました。
この処理はとても時間が掛かるので screen で実行することと、環境変数 GDAL_CACHEMAX の値を確認することをお勧めします。

```
$ screen -a
$ env | grep GDAL_
GDAL_CACHEMAX=1536
```

(静岡市の場合)

```
$ ~/bin/gdal2tiles.py -z 12-19 --s_srs EPSG:2450 -a "0,0,0" ~/photo/merged.vrt ~/tile
```

(鹿児島市の場合)

``` 
$ ~/bin/gdal2tiles.py -z 12-19 --s_srs EPSG:2444 -a "0,0,0" ~/photo/merged.vrt ~/tile
```

進捗が表示されるので気長に待ちましょう。
ベースタイル（この場合はズーム19）が作られるとそれ以降（18〜12）はベースタイルを元に作られるようでスピードが上がります。
途中で止めた場合は --resume オプションを付けると続きから始められます。
何かの事情で一部のタイルだけを作りなおしたい場合は対象のタイルを削除して --resume 付きで実行することで更新できます。
~/tile に出力されたディレクトリ一式をWebサーバに配置すればタイル配信サーバの完成です。

## タイルの使い方の例
タイルの使い方は「[静岡市オルソ化航空写真 Tile Map Service の使い方](http://qiita.com/kudarisenmon/items/4d98894da058d34330bc)」を参考にしてください。

## 最後に
自治体の航空写真がオープンデータになり始めたことを歓迎しています。
容量が大きいので配布方法に苦労もされているようですが、全国で公開の機運が高まってほしいと思います。
あなたのお住まいの自治体にも問い合わせてみてください。