2010年3月26日金曜日

タイルとlat lonの関係

ちゃんとスクリプトそのうち作りたいけど
今やってる方法

1. タイルの位置を知りたい大体の場所を http://osm.org/ で広めに開く。
2. エクポートをクリック
3. 左側に出るカラムにある、別の領域を指定するをクリック
4. 右側の地図上で範囲を選択する
5. 左の枠にlat/lonが表示される
上 maxlat 右maxlon 左minlon 下minlon
6. http://home.provide.net/~bratliff/tilecalc/を開いて、lat/lon/zoomを入力。
ここで入力できるのはbboxではなくて一枚のみです。
osmのサイトで言うと、lat=maxlat(上)、lon=minlon(左) がタイルの左上頂点、
lat=maxlat、lon=minlon がタイルの左上頂点、(wms2tile開始点)
lat=maxlon、lon=minlon がタイルの右下頂点(wms2tile終了点)で二回やる必要があります。
タイルでは、北極点が0の番号の振り方になっています。
タイルとlatlonはmax/minが逆になりますので注意してください。
TMSのzoom17はここでは4と入力
7. calcをクリックして
googleの欄に表示されるタイルのXとY、
こんなURL http://mt0.google.com/vt/lyrs=m@150&x=112882&y=53366&z=17
のxとyがタイルになります。

2010年3月21日日曜日

wms2tile

wms2tileの使い方が全然なくてソース読まないと動きも意味不明だったので書いてみる。
多分にOSMでのオルソキャッシュの情報に偏っています。

wms2tileはwmsで配信されているデータをラスタ、ベクタ関係なく
タイルを作成する物です。
作成したタイルはタイルキャッシュやTMSのサーバで配信して
Openlayersやその他TMSを使えるもので利用可能です。

基本的には
1. config.phpを編集 (config.php.sampleをrename)
2. tile.json を編集 (tile.json.sampleをrename)
3. コマンドラインPHPで動作(php range.php xxxxxxxx -)

で動きます。
2010年3月の時点ではDLしたtile.jsonの設定は
オルソ化空中写真ダウンロードシステムWMSのものになっていて、
変更のは必要ありません。コピーすればそのまま動きます。

config.phpは結果を集計するサーバの設定が必要ですが
わからないときにはとりあえずlocalhostにしておけばキャッシュはできます。

'tracker_domain'=>'localhost',
'tracker_upload'=>'',
'tracker_password'=>'password',
'user_id'=>3,

こんなかんじで。
pngcrushはパスを指定してください。

連続してタイルをダウンロードするのはrange.phpの動作になります。
PHPが上手に設定できていないとconfig.phpの
'tile_local_base'=>
にフルパス指定が必要な場合があります。

また、PHP5以降ではfunction.phpの最後の方にある
check_dir中の

if(!file_exists($config['tile_local_base']."$layerName/$z/$x")){
- @mkdir($config['tile_local_base']."$layerName/$z");
- @chmod($config['tile_local_base']."$layerName/$z",0777);
- @mkdir($config['tile_local_base']."$layerName/$z/$x");
+ @mkdir($config['tile_local_base']."$layerName/$z/$x",0777,true);
@chmod($config['tile_local_base']."$layerName/$z/$x",0777);
}
}

しないとディレクトリの生成に失敗してしまうことがあります。

動作には、wms2tile直下の Tilesのアクセス権を666など全ユーザ書き込み可能な状態にする必要があります。

range.phpの引数は
php range.php レイヤ名 zoom minX minY maxX maxY

オルソ化空中写真ダウンロードシステムWMSではレイヤ名を
MLITJにしているそうです。
zoomは17固定
範囲は割り当て範囲となります。


範囲指定について


基本的にはbboxと同じ考え方でタイルの頂点座標を指定します。
なぜこれが必要かというと、帯域が非常に狭いからで
DLする環境によって4〜16、場合によってはもっと多くのDLを並行した方が
効率よく回収できるためです。

割り当て範囲が(114240,52064) - (115040,52704)
の場合
php range.php MLITJ 17 114240 52064 115040 52704
で全領域となります。

これを複数に分けるにはbbox的に
php range.php MLITJ 17 114240 52064 114450 52704
php range.php MLITJ 17 114450 52064 115040 52704
とすることで分割ができます。
タイル一枚だけキャッシュするには縦横+1の数値指定で行えます。
php range.php MLITJ 17 114240 52064 114241 52065

環境によって効率のいい分割数は大きく異なります。
負荷的にmaxの位置を見極めて、
その8割〜9割程度のDL速度を保てる位置が効率よいようです。
しかし一概には言えませんので
狭い範囲で少し試してから8とか10など
適当な数でやってみるとよいと思います。


わたしははじめはざっくり大きめに実行し、
php range.php MLITJ 17 114240 52064 114460 52704
php range.php MLITJ 17 114250 52064 114470 52704
php range.php MLITJ 17 114260 52064 114480 52704
php range.php MLITJ 17 114270 52064 114490 52704
と10単位で大体作成していくつか実行、
5、2、1単位を状況に応じて追加していっています。

range.phpは数が少ない方から順にDLしていきます。
同じ箇所を追っかけで動作させるとおかしなことになるので
前からくるスクリプトに追い抜かれないよう調整する必要があります。
それか、そういう小細工をしないかどちらかです。


キャッシュファイル


wms2tileはTiles以下に

Tiles/レイヤ名/x/y
という階層を切ってファイルを保存します。
できるファイルはpngですが拡張子はつきません。

そのため、上記のようにx方向での切断の方がフォルダ単位作業的には楽です。
y方向で切断すると確認がとても面倒なことになります。


エラー


いろいろエラーが発生しますが、
取得できているところの再取得はされないので、
エラーが発生したときには全く同じ領域で再度実行すればOKです。
キャッシュできていないところだけ再度取りにいってくれます。

エラーのケース
* WMSからタイル取得失敗
* pngcrushやOSでのファイルオープン失敗
* png変換失敗
* ファイル名変更失敗
再度実行後、
エラー無くdoneの表示がでたらその領域は終了です。

報告するサーバを設定しないとreportエラーは永遠に出続けます(が、キャッシュはできています)