ka-Map?の動作チェック †
ka-Map?のセットアップ後,最初に行う簡単な動作チェックを説明します。
初期動作チェック †
init.phpの実行 †
ウエブブラウザに直接URLを入力してjavascriptのコードが返ってくるかどうかを確認します。
http://xxx.xxx.xxx/xxx/init.php
これで,以下のようにjavascriptによるレイヤ情報が表示された場合には,config.phpの構文に関しては問題ありません。
/*init*/aszScales=new
Array('100000000' ... 以下中略 ...
'tile.php';this.selectMap('SRTMv2Shaded1');
エラーが表示されたり何も表示されない場合には,config.phpの内容や構文ミス等がある可能性があります。
tile.phpの実行 †
前節のinit.phpの確認と同様に,ウエブブラウザから直接tile.phpを呼び出します。
http://xxx.xxx.xxx/xxx/tile.php
これで,地図の画像データが表示されます。
エラーが表示された場合には,config.phpの内容や構文ミス等がある可能性があります。その他config.phpやmapfile内のパス設定,各ディレクトリのパーミッションの確認等も行ってください。
config.phpのパスやファイル名を変更した場合 †
config.phpファイルはka-Mapの色々なファイル内でinclude_onceされています。
grep * -r -e 'config.php'
等により,必要となるファイル全てのconfig.phpの記述を探し出し,変更後のパスや名称に書き換える必要があります。
既存のka-Mapディレクトリをコピーして別のマップを作成する場合,config.phpの名称を変えて新たに作成する場合がありますが,この場合include_onceの記述を全て書き換えないと,変更前の地図(旧config.phpの設定)が表示される等の問題が発生します。
precache_wget.phpの削除 †
ka-Mapのドキュメントツリートップにあるprecache_wget.phpはブラウザ経由でキャッシュ画像を生成するプログラムです。運用時には以下のような対応を行い,任意のユーザーが実行することを避ける必要があります。
- precache_wget.phpを削除する
- precache_wget.phpのパーミッションを変更しウエブユーザーがアクセスできないようにする
- precache_wget.phpの拡張子を変更する
キャッシュ画像ディレクトリのパーミッション †
キャッシュ画像を作成するときは,キャッシュ画像ディレクトリにはウエブユーザの書き込み権限を与える必要がありますが,全てのキャッシュ画像が生成済みであり,かつユーザー側からのリクエストによるキャッシュ画像の生成を行わない場合は,キャッシュ画像ディレクトリの書き込みを禁止にすることを検討してください。これで,意図しないリクエストパラメータの送信による画像の再作成を防ぐことが可能です。
キャッシュディレクトリは以下の階層構造になっています。
マップ名/スケール/グループ名
/グループ名
/...
スケール/グループ名
/グループ名
/...
...
"マップ名"のディレクトリは,config.php内で
$aszMapFiles = array( 'マップ名' => $val);
として割り当てられた名称で作成されます。
"スケール"のディレクトリはconfig.php内で
$val = array (
'title' => 'マップタイトル',
'path' => 'mapfile.map',
'scales' => array(2000000,
1000000,
500000),
'format' =>'PNG24'
);
として$val['scales']に設定されたスケールがそのままディレクトリ名となります。
"グループ名"ディレクトリは上記の$val['path']で設定されたmapfile内のGROUPタグの名称がディレクトリ名となります。
LAYER
NAME "sample_layer"
GROUP "sample_group" # この名称がディレクトリ名となる
STATUS OFF
TYPE RASTER
DATA "XXXX.tif"
...
END
precache.php関連 †
ポイント †
precache.phpはきちんとmapfileやconfig.phpのパラメータを整合をとってくれるわけではないようです。
precache.phpを使用して意図しない画像が作成される場合には,ウエブサーバのログに書き出されるリクエストをチェックし,tile.phpに渡されているパラメータが正しいかどうかを確認することが解決への早道となります。
precache.php実行時とブラウザ上で表示した場合のtile.phpへのパラメータが一致しているかどうかを確認してください。
キャッシュ画像枚数の確認 †
precache.php等で画像を生成する場合には途中でエラーとなることがあります。同一スケールディレクトリ以下の各グループディレクトリ内の画像枚数は,全て同数となるため画像の枚数を確認することが簡単なチェックとなります。
設定時には何度もキャッシュ画像生成をやり直すこともあるため,以下のようなスクリプトあらかじめ作成しておくと,画像枚数が多い場合には楽になります。
find グループ名ディレクトリ/ -name *.png -print | wc -l
precache.phpでは実行時に1グループレイヤあたりの作成する画像枚数を標準出力しますが,この枚数と上記のfindコマンドの結果が一致していない場合には,正常に画像が作成されていない可能性があります。
precache.phpのエラーを詳細に出力する †
precache.php内のfile_get_contents()関数を呼び出している箇所を修正します。
// 変更前
if(!@file_get_contents($theURL)) {
// 変更後
if(!file_get_contents($theURL)) {
PHPでは関数名の直前に@マークをつけることで,その関数のエラー出力を抑制することが出来ます。@をはずすことでfile_get_contents(この関数でtile.phpへのリクエストが送られています)で発生したエラーを見ることが出来ます。
レイヤグループ毎に異なる画像形式(メタタグimageformat)を設定している場合 †
次節参照
precache.php作成した画像フォーマットとブラウザ経由で作成した画像フォーマットが異なる †
config.phpとmapfileのメタタグ"imageformat"で画像形式が異なる場合,precache.phpでキャッシュ画像を生成すると以下のような症状が出ます。
- 全てのキャッシュ画像をprecache.phpで生成したはずなのに,ブラウザからアクセスすると再度キャッシュ画像を生成する
- precache.phpて生成した画像とウエブブラウザ経由で生成される画像の形式が異なる
config.phpにおける画像形式とmapfile内の画像形式(LAYERディレクティブ内のメタタグ"imageformat"で指定)が異なっている場合に発生します。一部のレイヤグループの画像形式を変えている場合も問題になります。
precache.php(正確にはパラメータで渡すtile.php)ではメタデータの画像形式は反映されずconfig.php内の設定のみを見るようです。
tile.php内ではi=XXXパラメータがセットされている場合には,個別に画像形式を変更しますが,precache.phpを経由する場合には簡単なコードの修正ではうまくいきそうもありません。
現状での対応方法ですが,レイヤーグループ毎に画像形式が異なる場合には,config.phpのformatを手動で書き換えて,レイヤグループ毎にprecache.phpを実行するしかなさそうです。
画像フォーマットとしてAGGAを指定している場合に,prechache.phpで作成すると透明部分の情報が失われる。 †
ka-MapでのAGGAの使用はこちらのページの手順で設定することで可能になりますが,precache.php経由では画像の透明化部分が失われる(真っ黒になる等)症状が出ます。
この場合はtile.phpにi=AGGAパラメータを明示的に与える必要があります。precache.phpの $theURL変数に値をセットしている箇所にパラメータを追加して実行してください。
// 変更前 $theURL = $tileURL...中略...urlencode($groupName) . $forceOpt; // 変更後 $theURL = $tileURL...中略...urlencode($groupName) . '&i=AGGA' . $forceOpt;
AGGA以外のレイヤーを作成する場合には削除することを忘れないでください。
mapfileにメタタグ"version"を設定している場合 †
precache.phpでキャッシュ画像を作成する場合にはversion情報をセットしないので,mapfileでversionを指定している場合には,ブラウザからのアクセス時にキャッシュ画像を使用せずに再作成してしまいます。
全てのキャッシュ画像が生成されない †
データ容量が大きい場合や処理時間が長い場合に途中で処理が中断している可能性があります。PHPやApacheの設定を確認してください。
php.ini内のチェック箇所は以下のとおりです。
default_socket_timeout 変更の可否:PHP_INI_ALL デフォルト値:60等 ソケットベースのストリームの有効時間(単位は秒)を設定。
memory_limit(スクリプトの最大使用メモリ容量) 変更の可否:PHP_INI_ALL デフォルト値:8M, 16M, 128M等 スクリプトが確保できる最大メモリをバイト数で指定します。 -1を指定すると制限無し。 正しく書かれていないスクリプトがサーバーのメモリを食いつぶすことを防止する ための設定です。
max_execution_time(スクリプトの最大実行時間) 変更の可否:PHP_INI_ALL デフォルト値:30, 300等 スクリプトに許される最大実行時間(単位は秒)。 サーバの負荷上昇を抑えるための設定です。
max_input_time(スクリプトの最大パース時間) 変更の可否:PHP_INI_PERDIR デフォルト値:-1,60等 これは関係無いかもしれませんが念のため... スクリプトが POST、GET、ファイルアップロードなどの入力をパースする最大時間 (単位は秒)
また上記のmax-execution-timeに関連してapacheの設定も確認する必要があります。
httpd.conf(環境によってはapache2.conf)内のチェック箇所は以下のとおりです。
TimeOut リクエスを失敗とするまでにサーバが待つ時間
参考資料 †
lost transparency using precache.php with agg-support - solution
Last-modified: Fri, 07 Nov 2008 17:23:39 JST (664d)
