タイルサービスの作成

某大阪南港でタイルマップの話をしゃべってきました。
地理情報が付いた画像を gdal2tiles を使ってタイルマップにして、OpenLayers とか Google Maps とかの、ウェブベースのブラウザで表示してみる、というもの。これについては、某サイトに資料は上げてたりします。
さて本題。
gdal2tiles は、先にタイルマップを全て作って静的に配置する、というものですが、どっちかというとタイルキャッシュなものが必要になっています。
つまり、リクエストを受けて、タイルキャッシュにヒットしたらそのまま返して、無ければWMSから引っ張ってきて、その画像をキャッシュとして保存すると同時に返却するというもの。
たとえば GeoWebCache があるのですが、これはJavaアプリケーションサーバが必要で、ときどき Apache HTTPD は生きてて、アプリケーションサーバだけ落ちる、ということがあります。
また mapcache があるのですが、設定がよく分からんという後ろ向きな理由の他に、ラベルのギロチン問題(ていうかどうか知らん)に配慮してくれてなさそうなので、パスしています。
ラベルのギロチン問題(ていうかどうか知らん)は、ある位置(ポイント)を基準(中心とか左上隅とか)としてラベルを作成する際に発生する問題です。
たとえば、あるタイル(下図の1)について、基準位置があるけれども、ラベルとしては隣のタイル(下図の2)にはみ出す場合があります。

タイル1は、自分のタイルに基準点があるから描画しますが、隣のタイル2は、自分のタイルに基準点が無いので、ラベルを描かなければならないなんて考えもしません。
対応策としては、はみ出すラベルは描かない (MapServerはその設定が可能) というものもあります。が、タイルマップでよく使われる 256*256 では、描かないケースが頻繁に表れます。
対応策として、ある程度のマージンをとってWMSにリクエストを投げて、マージン分を切り離して使う、というものです。

こんなかんじ。
これを PHP で作ってやる、と (まだサービス公開できる状態ではない)。
とはいえ、難しくない。mapserver を popen で呼んで画像を貰って、GD でクロップする、という方針で作れますね。
むしろ、複数のリクエスト、特に重複リクエストをどうさばくか、の方が問題。とりあえず、空っぽのファイルを作ってロックして、クロップした画像をテンポラリに保存して、ロックしているファイルに流し込む、という方針でやってて、なんかブサイク。