ArcGIS Web Mapping Tips:WMSサービスの表示(ESRIジャパンスタッフ体験記)


先日、とある GIS 研修に講師アシスタントとして参加しました。その研修の目的は ArcGIS API for JavaScript のサンプルを触りながら Web マッピング アプリケーションの開発方法ついて学習することです。演習ではサンプル アプリケーションを少しカスタマイズして、自身で公開している WMS(Web Map Service) サービスをマッシュアップ(※)するということを行いました。

演習時に使用したサンプルは ArcGIS Resource Center にある ArcGIS API for JavaScript のサンプル「WMS Layer – ResourceInfo」です。


Wms01_2

※マッシュアップ:複数の 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 セクションをそのままコピーし、メモ帳などのテキスト エディタに貼り付けます。

Wms02_2

■ソース コードの書き換え

メモ帳に貼り付けたものを 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 プロパティで取得しています)。

Wms03_2

このようにデフォルトの 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 サービスが表示されました。

Wms04_2

他のことが原因で WMS サービスが表示されないこともあるかもしれませんが、今回はバージョンの指定で解決しました。

その後、演習も進み GIS 研修を無事に終えることができました。

■関連リンク
ArcGIS 10 ヘルプ:
WMS サービスの追加
WMS サービス レイヤの使用
WMS サービス(ArcGIS Server)

ArcGIS API for JavaScript:
Sample ページ(米 Esri 社)
チュートリアル(スタートアップ ガイド)