2. Mapserverを用いたWMSサーバの設定

2.1 必要なソフトウェアのインストール

WMSリクエストは"mapserv" CGIプログラムによって処理される。すべてのバージョンのmapservがWMSサポートを含んでいるわけではない(PROJライブラリとともにコンパイルしているならばデフォルトで含まれている)。最初の1歩はmapservプログラムがWMSサポートを含んでいるかどうかを確認することである。このための方法のひとつがコマンドラインから"-v"を用いて"SUPPORTS=WMS_SERVER"が含まれるかどうかを見ることである。

例1. Unix上で:

$ ./mapserv -v MapServer version 4.6.1 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=PDF OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE DEBUG=MSDEBUG

例2. Windows上で:

C:apachecgi-bin> mapserv -v MapServer version 4.6.1 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=PDF OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE DEBUG=MSDEBUG

2.2 WMSのためのマップファイルの設定

セットアップしようとしているそれぞれのWMSサーバはそれぞれ独自のマップファイルを持つ必要がある。それは通常のmapserverでのマップファイルにいくつかのパラメータとメタデータの記述を必須としたものにすぎない。メタデータの多くは妥当なGetCapabilites出力のために必要なものである。

ここでは通常はMapserverにおいてオプションであるが、WMS設定においては必須となる(もしくは強く推奨される)パラメータとメタデータと取り上げる:

マップレベルでは:

  • Map NAME
  • Map PROJECTION
  • Map Metadata (WEBオブジェクト内):
    • wms_title
    • wms_onlineresource
    • wms_srs (PROJECTIONオブジェクトが定義されていないのであれば、"init=epsg:…"を用いて)

それぞれのレイヤでは:

  • Layer NAME
  • Layer PROJECTION
  • Layer METADATA
    • wms_title
    • wms_srs (レイヤでは地図のSRS値を継承するためオプションである)
  • Layer STATUS
    • レイヤのSTATUSはDEFAULTに設定すると、無条件でクライアントに配信する。
    • レイヤのSTATUSはON或いはOFFに設定する場合は、クライアントからのリクエストできます。
  • Layer TEMPLATE (GetFeatureInfoリクエストで必要です。)
  • Layer DUMP TRUE (GetFeatureInfo GMLリクエストで必要です。)

これらのパラメータについてより詳細に見ていこう:

Map Nameとwms_title:
WMSとして機能するには各レイヤごとにNameとTitleタグが必要となる。 MapのNAMEパラメータとwms_titleメタデータはGetCapabiliteisのXML出力においてルートレイヤのNameとTitleとして使用される。 WMSのコンテキストにおいてルートレイヤはマップファイル名と一致する。

Layer Nameとwms_title metadata:
独立したレイヤはそれぞれ独自の名前とタイトルを持つ必要がある。レイヤの名前は、地図出力とクエリに含まれるレイヤを参照するGetMapとGetFeatureInfoリクエストで用いられる。 WMSサーバとして設定されたのであればレイヤの名前は文字ではじめなければならない(レイヤの名前が数字で始まったり、間にスペースを含んではならない)。

MapでのPROJECTIONとwms_srs metadata:
WMSサーバはEPSGの投影法コード(EPSGコードについてのより詳しくはhttp://www.epsg.org を参照のこと)を用いてデータを提供する投影法について告知しなければならない。最近のバージョンのPROJ4はコードで初期化されたEPSGのテーブルを持っており、ユーザは投影法を次のように定義できる:

PROJECTION
   "init=epsg:4269"
END

(PROJ4の'init'を用いる場合、"epsg"は小文字でなければならないことに注意)

もしMAP PROJECTIONブロックが"init=epsg:xxxx"の形式で設定されていれば、MapserverはWMS Capabilities文書の最上位レイヤの<BoundingBox>タグをこの情報を用いて生成する。 BoundingBoxはWMS capabilitiesのオプションとしての要素であるが、Mapserverが可能な限りこれを含むようにしていることはよい習慣である。

上記は、Mapserverがcapabilities出力(wms_srsメタデータはこの場合必要ない)においてEPSGコードを認識しこれをSRSタグに含むのには十分である。しかしながら、データの投影法から一致するEPSGコードをみつけることが不可能なことがしばしばある。この場合、データが提供できる1つ以上のEPSGコードのリストからなる"wms_srs"メタデータが用いられる。そしてPROJECTIONオブジェクトがPROJ4の定義がデータ自体の投影法となる。

これはLambert Conformal Conic 投影法(これはEPSGコードが存在しない)なデータを持つサーバの例である。このcapabilities出力はEPSG:4296およびEPSG:4326投影法として告知されるが、PROJECTIONオブジェクトはデータが存在する正しい投影法が設定されている:

NAME DEMO
...
 
WEB
  ...
  METADATA
    "wms_title"           "WMS Demo Server"
    "wms_onlineresource"  "http://my.host.com/cgi-bin/mapserv?map=wms.map&"
    "wms_srs"             "EPSG:4269 EPSG:4326"
  END
END
 
PROJECTION
  "init=epsg:42304"
END
...
END

EPSG:xxxxでの投影法に加え、WMSサーバはAUTO:xxxx名前空間を利用した投影法の告知を行うことができる。 AUTO投影法は42001から42005までがMapserverで内部でサポートされている。しかし、クライアントが投影法パラメータをサーバへのWMSリクエストにおいて定めることが必要とされるため、AUTO投影法はスマートWMSクライアントでのみ有用である。これ以上の情報についてはWMS 1.1.1仕様の追記Eとセクション6.5.5.2を参照のこと。またこの文書の最後にあるAUTO投影法についてのFAQを参照のこと。

LayerでのPROJECTIONとwms_srsメタデータ:
デフォルトではレイヤは親レイヤ(MapserverではMapオブジェクトのPROJECTION)のSRSを引き継ぐ。このため、全てのレイヤでPROJECTIONとwms_srsを提供する必要はない(ただし、設定することが強く推奨される)。もしレイヤのPROJECTIONが存在しなければ、トップレベルにある地図の投影法が仮定される。

LayerのPROJECTIONとwms_srsメタデータはMapのPROJECTIONとwms_srsとまったく同じ方法で定義される

ベクタレイヤでは、もしPROJECTIONブロックが"init=epsg:xxxx"の形式で設定されていれば、MapserverはWMS Capabilities文書のこのレイヤの<BoundingBox>タグをこの情報を用いて生成する。 BoundingBoxはWMS capabilitiesのオプションとしての要素であるが、Mapserverが可能な限りこれを含むようにしていることはよい習慣である。

"wms_onlineresource" メタデータ:
wms_onlineresourceメタデータは地図のWebオブジェクトメタデータで設定し、そのサーバへのアクセスすべきURLを指定する。これはGetCapabilities出力で必要とされるものである。もしwms_onlineresourceが提供されなければ、Mapserverはデフォルトのものとしてホスト名とスクリプト名を用いようと試みるが、あまりこの仕組みを当てにしてはいけない。 wms_onlineresourceメタデータを設定することが強く推奨される。

オンラインリソースURLについてはWMS 1.1.1仕様のセクション6.2.2を参照のこと。基本的には、必要なものはhttp://プレフィクス、ホスト名、スクリプト名、場合によっては"map="パラメータと"?"や"&"で終わるものを含んでいるHTTPのURLである。

ここに妥当なオンラインリソースURLを挙げる:

http://my.host.com/cgi-bin/mapserv?map=mywms.map&

サーバ上のラッパースクリプトを生成することにより、"map="パラメータをURLから隠すことが可能であり、その場合、サーバのオンラインリソースURLは以下のようになる:

http://my.host.com/cgi-bin/mywms?

これについては下記の"より詳細なオンラインリソースURLについて"で述べる。

GetFeatureInfoリクエストのための設定:
GetFeatureInfoリクエストでレイヤを検索可能にするのが、レイヤのTEMPLATEプロパティを設定しなければなりません。タイプ「テキスト/html」のリクエストのために、レイヤのHEADERとFOOTERプロパティも設定する必要がある。

GetFeatureInfoでGMLのリクエストはレイヤのDUMPプロパティはTRUEに設定する必要がある。MapServer 4.6現在、gml_*メタデータも設定しなければなりません。

2.3 WMSサーバのテスト

2.3.1 Capabilities メタデータの検証

マップファイルの用意ができたので、サーバが返すXML capabilitiesに間違いが無いかどうかを確認しよう。

webブラウザを用いて、"SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities"のようなパラメータをお尻に付加したサーバ上のオンラインリソースURLへアクセスしてみよう。

http://my.host.com/cgi-bin/mapserv?map=mywms.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities

ここに動作中のGetCapabilitiesリクエストの例がある:
http://www2.dmsolutions.ca/cgi-bin/mswms_gmap?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities

これはapplication/vnd.ogc.wms_xmlのMIMEタイプを持つ文書を返すはずであり、ブラウザはファイル保存のための画面を用意するだろう。これを保存して、テキストエディタで開いてみよう。

もしXML出力の中にエラーメッセージを受け取っていたら、なんらかの行動が必要である。よくある問題と解決策がこの文書の最後にあるFAQに挙げられている。

もし全てがうまくいったのであれば、完全なXML capabilitiesドキュメントを手にしているはずである。 "WARNING"の単語を探してみよう…。もしマップファイル中のパラメータやメタデータを見付けられなかった場合、MapserverはXML出力中に"<!—WARNING: "で始まるコメントを挿入する。もしXML出力中になんらかの警告があったのであれば、サーバをWMSクライアントに登録する前にそれらを全て修正しなければならない。さもなければ物事はうまくすすまないであろう。

2.3.2 GetMapリクエストのテスト

続いて、我々のサーバが妥当なXML GetCapabilities?応答を生成しているかどうか確認するために、GetMap?リクエストをテストしなければならない。 Mapserverは要求されるGetMap?パラメータのうちのいくつかをチェックするだけであり、最小限のMapserverのパラメータと妥当なGetMap?リクエストに必要なものを以下に説明する。

以下がWMSの仕様に基づいてGetMapリクエストで要求されるものである:

  • VERSION=version : リクエストのバージョン
  • REQUEST=GetMap : リクエスト名
  • LAYERS=layer_list : カンマで区切られた1つもしくはそれ以上のレイヤ名。SLDパラメータが存在する場合はオプションとなる。
  • STYLES=style_list : カンマで区切られたリクエストされたレイヤごとへのレンダリングスタイルのリスト。SLDパラメータが存在する場合はオプションとなる。 Mapserverは名前つきスタイルをサポートしないので、ほとんどの場合、"STYLES="に空の値をしていすることになるだろう。 MapserverはSLDを用いたSTYLEをサポートしている。
  • SRS=namespace:identifier : 空間参照系
  • BBOX=minx,miny,maxx,maxy : SRSの単位でのバウンディングボックスの角の位置
  • WIDTH=output_width : 地図画像のピクセルでの幅
  • HEIGHT=output_height : 地図が像のピクセルでの高さ
  • FORMAT=output_format : 地図画像の出力フォーマット

注意
WMSサーバはgd/gdalライブラリの一部のサポートしているフォーマットのみを配信できる。
妥当な例はこのようになる:

http://my.host.com/cgi-bin/mapserv?map=mywms.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=prov_bound&STYLES=&SRS=EPSG:4326&BBOX=-173.537,35.8775,-11.9603,83.8009&WIDTH=400&HEIGHT=300&FORMAT=image/png

これは動作している妥当なリクエストである: valid request

2.3.3 実際のクライアントによるテスト

WMSクライアントに触れたことがあるのであれば、新しいサーバのオンラインリソースを登録して実行してみよう。

もしWMSクライアントをインストールしていないのであれば、ここにいくつかのポインタを示す:

  • MapServer自身がWMSクライアントとして使用できる。WMSクライアントHOWTOを参照のこと。
  • DeegreeはWMSクライアントを提供している。
  • MapLabのMapBrowserはウェブベースのWMSクライアントである。
  • OpenJUMPはWMSクライアントサポートを含んだデスクトップGISパッケージである。
  • owsview Viewer Client Generatorはオンラインアプリケーションであり、WMSおよびWFSのレイヤを妥当なWMSおよびWFSのCapabilities XMLにより追加することができる。
  • uDig デスクトップパッケージである、WMS レイヤを追加できる。

このリストは完全なものではない。いくつかのWMSサポートを謳い、あなたのMapserver上のWMSサーバとやり取りできるオープンソースもしくはプロプライエタリなパッケージが存在する。

2.4 オンラインリソースURLについてのより詳細な説明

上記のマップファイルのセットアップ/wms_onlineresourceメタデータ"セクションで述べたように、以下のオンラインリソースURLは、WMS 1.1.1の仕様におけるセクション6.2.2に基づいて完全に妥当なものである:

http://my.host.com/cgi-bin/mapserv?map=mywms.map&

しかしながら、上記のURLはベンダ独自な必須パラメータを含んでおり、不適切なものであると主張する人もいるだろう。最初に、このケースで"map=…"はベンダ独自のパラメータとはみなされないことを指摘しておく。これはこの部分が、"?"または"&"で終了する不明瞭な文字列として定義されているものであり、オンラインリソースURLの一部であるからである (WMS 1.1.1のセクション6.2.2を参照のこと)。

しかしとにかく、それが妥当であったとしても、上記のURLはきれいではない。あなたはWMSのオンラインリソースURLによりよいURLを求めるかもしれない。ここでいくつかの提案をする:

  • 1. Unixのサーバ上では、環境変数MS_MAPFILEを設定してmapservに処理を渡すラッパーシェルスクリプトを用意することができる。これでより簡潔なオンラインリソースURLが実現できる:

#! /bin/sh
MS_MAPFILE=/path/to/demo.map
export MS_MAPFILE
/path/to/mapserv

  • 2. 別の手段としてApacheの"setenvif"機能がある: 全て同じmapservバイナリを示すシンボリックリンクを用いる。そしてそれぞれのシンボリックリンクについてURLをチェックして適切なMAP環境を設定する。WindowsとApacheのユーザは、手順が次のようになる(これはApache1.3以上が必要である):
    • mapserv.exeを"mywms.exe"のようなあなたのWMSにあわせた新しい名前でコピーする。
    • httpd.confに追加する:

SetEnvIf? Request_URI "/cgi-bin/mywms" MS_MAPFILE=/path/to/mymap.map

  • 3. IISサーバ上では、以下のASPスクリプトが使用できる: 以下のスクリプトは機能はするが、ASPを用いてMapserverのリクエストをフィルタする例として示しているものである。実際のWMSサーバとしてASPを使用するのであれば、とりわけエラー処理とタイムアウト設定について、ASPの追加が必要である。
<%
   Server.ScriptTimeout? = 360

   Select Case Request.ServerVariables?("REQUEST_METHOD")
     Case "GET"  strRequest = Request.QueryString?
     Case "POST" strRequest = Request.Form
   End Select

   strURL = "http://myserver/cgi-bin/mapserv.exe?map=C:\Inetpub\wwwroot\workshop\itasca.map&" & strRequest

   Dim objHTTP
   Set objHTTP = Server.CreateObject?("MSXML2.ServerXMLHTTP")
   objHTTP.open "GET", strURL, false
   objHTTP.send ""

   Response.ContentType? = objHTTP.getResponseHeader("content-type")
   Response.BinaryWrite objHTTP.responseBody

   Set objHTTP = Nothing
 %>

2.5 GetLegendGraphic リクエスト

このリクエストは指定レイヤの凡例アイコンを返す。このリクエストはレイヤに定義されたクラス毎に凡例アイコンとラベルを描画する。

2.5.1 条件

以下は、WMSサーバーマップファイルでこのリクエストを可能にすることを要求されます:

  • LEGENDオブジェクト
  • すべてのレイヤにCLASSオブジェクト
  • CLASSオブジェクト内にNAMEプロパティ
  • レイヤのSTATUSはONにしなければならない。

2.5.2 パラメータ

  • LAYER - (必須)凡例取得するWMSレイヤの名前である。GetCapabilitiesで取得したレイヤの<Name>プロパティと同じもの。
  • FORMAT - (必須)凡例イメージのフォーマット。(例: "image/png").
  • WIDTH - (オプション) 凡例イメージの幅である。注:Ruleプロパティを使用された場合のみ使用される。
  • HEIGHT - (オプション) 凡例イメージの高である。注:Ruleプロパティを使用された場合のみ使用される。
  • SLD - (オプション) SLDのURLである。 SLDをレイヤに適用してから凡例を描画する。
  • SLD_BODY- (オプション) SLD(URLを指定することの代わりに)の中身である。
  • SCALE - (オプション) 凡例出力の縮尺を指定する。
  • RULE - (オプション) 凡例を出力するクラスの名前を指定する

リクエストサンプル:

http://127.0.0.1/cgi-bin/mapserv.exe?SERVICE=WMS&VERSION=1.1.1&layer=park&
REQUEST=getlegendgraphic&FORMAT=image/png
Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License