「WMS 1.3.x だと「変」になる」をふたたび

id:yellow_73:20110607 のつづきなんかどうか分からんけど、1件、この問題に突き当たった方がいらっしゃるので、ちょっと付け足して書いてみました。


Mapserver 6.0 でWMSサーバを立てているのですが、平面直角でWMSサーバにリクエストを出したら、おかしな画像が返ってくる、ということでした。

訂正 (8/14昼ごろ)

すみません、Axis Orientation を Axis Order に訂正します。WMS 1.3.0 仕様書 6.7.3.1 (P.16の第2パラグラフ)参照。"Orientation"は右手系か左手系かの話で、この場合は"Order"です。でもだってMapserverのチケットでOrientationが出(見苦しいので略)

Axis Order

地図は北を「上」にしています。位置関係を言うのに「鳥取は岡山の北」と言うべきところを「鳥取は岡山の上」と言うし、またこれが通じる。また右左は東西に対応し「島根は鳥取の右側です」と言うし、またこれが通じる。
つまり、一般的には、南北が地図上の縦と対応し、東西は横と対応します。

ところで、二次元座標上の位置を表現するのに、2つの実数値の組み合わせで表現します。たとえば(a,b)とか。この位置表現では、(横,縦)の順でととらえる場合と(縦,横)の順ととらえる場合がありえます。この順序を axis order と呼ぶようです。

東西,南北の順が普通かどうか

中学校の数学を思い返すと、方眼紙の上の、ある座標(a,b)の位置をポイントする際、原点から横にa、縦にb、それぞれ移動した後の位置に点を打つことと思います。これは、axis order としては (横,縦) のほう。たぶん「常識」。
前述の東西、南北が横、縦に対応するのを考えると、「東西の座標値、南北の座標値の順で表現」する場合と「南北、東西の順で表現」する場合の2つがあるといえます。これまでの「常識」から推し量ると、前者(「東西の座標値、南北の座標値の順で表現」)が適切、と考えることでしょう。

ところが地図の世界ではそうではないらしい。ていうか、北緯○度(南北の座標値)、東経△度(東西の座標値)と表現するので、「東西の座標値、南北の座標値の順で表現」が当てはまらないことは、不思議でもなんでもないです。

ガウス=クリューゲルの数式を見つけて実装しようとして、XとYがこんがらがって切れそうになることは、経験した方も多い…のかどうかは知りませんが、たぶん、こんがらがると思います。

実はどっちもある

地図の世界で「東西、南北の順で表現」する場合と「南北、東西の順で表現」する場合のどちらが正しいか、これまでの流れだと後者だと思われるかも知れませんが、答えは「空間参照系による」です。
空間参照系は、普通はコード番号のみ注意してたりしますが、実際には投影法とか原点位置とかいろいろ記載があります。その中にaxis orderも書き込まれてたりします。
つまり、その空間参照系で「南北、東西の順で表現」すると登録されたら、誰が何と言おうと南北、東西の順です。

WMS 1.1.xと 1.3.x のaxis orderは違う

仕様書によると、WMS 1.1.x は「東西、南北の順で表現」で固定され、1.3.xでは空間参照系による、となっています。
東西、南北の順になっている空間参照系は特に変更とはなりませんが、南北、東西の順になっている空間参照系はモロに影響を受けます。

BBOX=minx,miny,maxx,maxy についてみると、「東西、南北の順で表現」する場合は、BBOX=西,南,東,北 の順になります。「南北、東西の順で表現」する場合は、BBOX=南,西,北,東 の順です。

クライアントとサーバで捕らえ方が違うとダメな画像が返る

Mapserver 6からはWMS 1.3.xの取り扱いについて、「東西、南北の順で表現」で固定されていた(仕様違反)のを、空間参照系による(仕様準拠)、に変更しました。
ところが、クライアントが 1.3.x であっても、BBOX=西,南,東,北で渡してきても、サーバはBBOX=南,西,北,東ととらえます。おかしくな画像が返るのは当然のことです。

そして、WMS 1.3.xであっても「東西、南北の順で表現」で固定(仕様違反)で作っているクライアントがほとんどです。ていうか、落とし穴だよなーと。

南北、東西の順になる空間参照系

南北、東西の順になる空間参照系、いろいろあると思いますが、日本国内でよく使われるものだけ見てみると、Webメルカトル、UTMは「東西、南北の順で表現」しますが、平面直角は「南北、東西の順で表現」します。
WMS 1.3.0サーバで、平面直角のときだけ返されてくる画像が変、ということになったら、axis orderを疑ってみるとよいかもしれません。

回避策

1.1.x でも受け付けるサーバの場合には VERSION=1.1.1を最初のURL指定のときから取り込んでおいて、1.1.xで動かしてしまえば、OKです。

余談: Mapserver 6も一部は「仕様違反」

EPSGコードで言うところ4000番代は、緯度、経度で表現する空間参照系を集めています。そしてこれらの axis orderは、「南北、東西の順で表現」します。北緯○度東経△度の順で言いますからね。

でも、Mapserver 6では、影響が大きすぎるので、4000番台については、仕様違反ではあるものの「東西、南北の順で表現」しています。