先日、とある GIS 研修に講師アシスタントとして参加しました。その研修の目的は ArcGIS API for JavaScript のサンプルを触りながら Web マッピング アプリケーションの開発方法ついて学習することです。演習ではサンプル アプリケーションを少しカスタマイズして、自身で公開している WMS(Web Map Service) サービスをマッシュアップ(※)するということを行いました。
演習時に使用したサンプルは ArcGIS Resource Center にある ArcGIS API for JavaScript のサンプル「WMS Layer – ResourceInfo」です。
※マッシュアップ:複数の Web サービスを重ね合わせてあたかも一つのサービスのように見せること
■まず、はじめに
まず、ArcGIS Resource Center の ArcGIS API for JavaScript の Web ページにアクセスします。この中の Samples ページにはすぐに実行できるサンプル Web マッピング アプリケーションとそのソースコードが数多く提供されています。
そして Layers カテゴリ内にある「WMS Layer – ResourceInfo」ページを開きます。ArcGIS API for JavaScript のバージョン 2.1 からは、WMS サービスをより簡単に取り扱うことができる WMSLayer クラスが提供されています。
ArcGIS API for JavaScript はテキスト エディタさえあれば Web マッピング アプリケーションの開発が行えるので、このページ内の Code セクションをそのままコピーし、メモ帳などのテキスト エディタに貼り付けます。
■ソース コードの書き換え
メモ帳に貼り付けたものを HTML ファイルとして保存し、ダブルクリックしてそのまま実行すると 2 つのマップ サービスが表示されます。一つは ArcGIS Online の道路地図サービスで、背景地図として使用します。もう一つは WMS サービスで、背景地図の上に重ね合わせます。いずれのサービスも Esri 社のサーバ(ArcGIS Server)から提供されています。ここでは道路地図サービスはそのままにして、Esri 社の WMS サービスのほうを、自身で公開している WMS サービスに変更します。
そのためには WMSLayer クラスの第一引数を、自身で公開している WMS サービスの URL に書き換えます。
var wmsLayer = new esri.layers.WMSLayer(“http://www.mapcontext.com/cgi-bin/wms.cgi?“,
※実際の研修では別の WMS サービスの URL を指定しましたが、ここでは便宜上、NOAA の気象サービスを指定しています。
第二引数はオプション設定で、画像フォーマットや、WMS サービスの詳細情報、透過表示、および表示レイヤの指定が行えます。ここで表示レイヤについてですが、1 つの WMS サービスの中には複数のレイヤが含まれている可能性があるので、サンプル コードのように表示(使用)したいレイヤのみを visibleLayers オプションに指定します。
visibleLayers: [“nexrad“,”outline“]
※各 WMS レイヤの名前は WMS サービスに対して GetCapabilities リクエストを実行することによって確認できます。ArcGIS Desktop をお持ちであれば、ArcMap アプリケーションに追加した WMS レイヤのプロパティでも確認できます。
■トラブル発生
その他にも初期表示範囲や座標系などの変更もありますが、それらは置いておき、ひとまずアプリケーションの実行の準備ができました。
変更したソース コードを HTML ファイルに保存し、ダブルクリックして実行すると、
WMS サービスが表示されません!
しばらくここで立ち往生。WMSLayer の URL や WMS レイヤの名前を確認しましたが、間違いはありません。筆者は ArcGIS Server をインストールしていたので、自身の ArcGIS Server から公開できる WMS サービスに変更してみたところ、問題なく表示できました。
さあ、困りました。このままでは演習が先に進みません。
■解決
講師の方と試行錯誤した結果、
WMS サービスのバージョンが指定されていないからでは?
という結論に達しました。なぜこのように考えたのかというと、サンプル アプリケーションの実行時に、左側のパネルに WMS サービスのバージョンが表示されますが、WMS サービスのバージョンが 1.1.1 であっても 1.3.0 と表示されるためです(この値は WMSLayer クラスの version プロパティで取得しています)。
このようにデフォルトの WMS サービスのバージョンは 1.3.0 となりますので、バージョン 1.1.0 や 1.1.1 の WMS サービスを使用する場合はバージョンを明確に指定します。バージョンは WMSLayer クラスの version プロパティ、もしくは WMSLayer コンストラクタの第二引数のオプション、resourceInfo オブジェクトのパラメータで指定できます。
var resourceInfo = {
version:”1.1.1″, //resourceInfo の中でバージョンを指定
extent: new esri.geometry.Extent(-180,-90,180,90,{wkid: 4326}),
layerInfos: [layer1,layer2]
};
var wmsLayer = new esri.layers.WMSLayer(“http://www.mapcontext.com/cgi-bin/wms.cgi?”,
{resourceInfo: resourceInfo,
visibleLayers: [“nexrad”,”outline”]
}
);
wmsLayer.version=”1.1.1″; //もしくは WMSLayer.version でバージョンを指定
再度、Web アプリケーションを実行すると、背景地図の上に WMS サービスが表示されました。
他のことが原因で WMS サービスが表示されないこともあるかもしれませんが、今回はバージョンの指定で解決しました。
その後、演習も進み GIS 研修を無事に終えることができました。
■関連リンク
ArcGIS 10 ヘルプ:
・WMS サービスの追加
・WMS サービス レイヤの使用
・WMS サービス(ArcGIS Server)
ArcGIS API for JavaScript:
・Sample ページ(米 Esri 社)
・チュートリアル(スタートアップ ガイド)