[GIS] 被災地空中写真WMSはGIS用ですのでTMSを使います

http://d.hatena.ne.jp/end0tknr/20110513 に猛然とチェックを入れさせてもらいます。
まず、被災地空中写真WMSはタイル化地図では使うべきではありません。

WMSはデスクトップGIS専用です.Google MapsOpenLayers等でタイル化地図としてご使用になるのはご遠慮ください.代わりに,TMSをご使用ください.

http://www.finds.jp/independent/tohoku/photo201103wms.html#WMS

TMSとは

http://wiki.osgeo.org/wiki/Tile_Map_Service_Specification 参照。タイル化された地図画像のURL生成規則と考えていただければ良いでしょう。これがまた Google Maps とは違う (Google Mapsは左手系でTMSは右手系) ので注意します。

被災地空中写真TMS

投影法は"EPSG:900913", 画像サイズは 256 * 256, 拡張子は"png" となっています。
なお、EPSG900913 は EPSGの正式なコードではありませんが、なし崩し的に使われています…というと聞こえも悪いですが、要は Google Maps が強かったということです。

EPSG:900913

Google Maps で使われている投影法です。半径6378137m球体のメルカトルです。
EPSG:54004 (本当は ESRI:54004) は、WGS84のメルカトルです。WGS84は回転楕円体で、北極と南極から地球をちょっと挟んでひしゃげさせています。たぶん、投影した座標系の値は ESRI:54004 と EPSG:900913 とは合わないと思います。

EPSG:900913 を Proj.4 で使えるようにする。

Proj.4の設定ファイル群にある epsg というファイルに次の1行を追加します。

<900913> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs <>

このエントリは epsg ファイルと同じところにインストールされている esri.extra にあるので epsg にコピペする、と覚えてもよいかも知れません。

mapfileの編集

"wms_srs" に "EPSG:900913" を追加します。MapServerは Proj.4 を使っているので、Proj.4 で使用可能にしていれば、これ以上の変更はありません。

JavaScriptファイル

次のような感じになります。

var map;
var mapBounds = new OpenLayers.Bounds(15696048, 4621892, 15751707, 4650301);
var mapMinZoom = 0;
var mapMaxZoom = 18;


// OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
OpenLayers.Util.onImageLoadErrorColor = "transparent";

function init(){
  var options = {
	  controls: [],
	  projection: new OpenLayers.Projection("EPSG:900913"),
	  units: "m",
	  maxResolution: 156543.0339,
	  maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508.34),
	  numZoomLevels: mapMaxZoom-mapMinZoom+1
	};
  map = new OpenLayers.Map('map', options);

  var kiban = new OpenLayers.Layer.WMS(
	  "基盤地図情報",
	  "http://www.finds.jp/ws/kiban25000gwc.cgi?",
	  {
	    layers: 'kiban25000:AllT',
	    format: 'image/png'
	  },
	  {
	    attribution: '基盤地図情報 (平20業使、第449号)',
	    isBaseLayer: true
	  }
	);

  var tms =  new OpenLayers.Layer.TMS(
	  "石巻",
	  "http://www.finds.jp/independent/tohoku/tms/",
	  {
	      serviceVersion: '1.0.0',
	      layername: 'ishinomaki',
	      type: 'png',
	      alpha: true,
	      isBaseLayer: false,
	      attribution: "国土地理院提供"
	  }
	);

  map.addLayers([kiban,tms]);

  map.addControl(new OpenLayers.Control.LayerSwitcher());
  map.addControl(new OpenLayers.Control.PanZoomBar());
  map.addControl(new OpenLayers.Control.MousePosition());
  map.addControl(new OpenLayers.Control.Navigation());
  map.addControl(new OpenLayers.Control.KeyboardDefaults());
  map.addControl(new OpenLayers.Control.Attribution());
  map.zoomToExtent( mapBounds );
}

window.onload = init;

ベースレイヤに基盤地図情報WMS配信サービスのキャッシュ機構を使っています。