MapServer 6.0.1 でPostGIS 2.0.0 aplha のGEOGRAPHYをレンダリングする方法

MapServer 6.0.1 で GEOGRAPHY型 をレンダリングしてくれるかテスト。
とりあえず EPSG:4612 POLYGON である the_geom があるとして、GEOGRAPHYカラムを作って、そこに叩き込む。

ALTER TABLE g_table ADD geog GEOGRAPHY(POLYGON,4326);
CREATE INDEX ix_g_table_geog ON g_table USING GiST(geog);

UPDATE g_table SET geog=ST_SetSRID(the_geom,4326)::GEOGRAPHY;

注意すべきは、GEOGRAPHYが4326(WGS84緯度経度)しか対応していないこと。4612(JGD2000緯度経度)のポリゴンなので、直ではGEOGRAPHYになれません。ST_SetSRID で、SRID=4612のタグがついたポリゴンを強制的にSRID=4326のタグに付け替えてます。

で、MapServer でレンダリングを試みると、

st_force_2d(geography) does not exist

とかなんとか。

ちなみに MapServer が投げてるクエリは、次の通り。

encode(ST_AsBinary(ST_Force_2D("geog"),'NDR'),'hex') as geom

引用符でくくられてるので、geog::geometry で回避できない。
ST_AsBinary(geography)はあるので、無理やり関数を作るとクリアできるかもしれない、けれども、投影変換どうすんねん、とも。

ST_Force_2Dをでっちあげる

CREATE OR REPLACE FUNCTION ST_Force_2D(GEOGRAPHY)
RETURNS GEOGRAPHY
AS 'SELECT ST_Force_2D($1::geometry)::GEOGRAPHY'
LANGUAGE 'SQL' IMMUTABLE STRICT;

を追加。GEOGRAPHYをGEOMETRYにしてST_Force2D(GEOMETRY)を実行して、返ってきたGEOGRAPHYをGEOMETRYに戻しています。無理やり感一杯ですね。

これでたぶんクリアできるはず、といことで、MapServerを動かしてみました。

msPostGISLayerWhichShapes(): Query error. Error (ERROR: find_srid() - couldnt find the corresponding SRID - is the geometry registered in the GEOMETRY_COLUMNS table? Is there an uppercase/lowercase missmatch?

GEOMETRY_COLUMNS 読みに行っとるorz

GEOMETRY_COLUMNS を読みに行かせないようにしてやる

ちょっとダメっぽいなと思ったけれども、ふとPostGISマニュアルに、MapServer関連のワザが書かれてたのを思い出した。
でみると、
http://www.finds.jp/docs/pgisman/1.5.1/ch05.html#id286825633 にもろ記載されてました。

"using srid=43426"節をDATAステートメントに入れて下さい.他の部分はジオメトリの場合と同じです.

だって。
その通りmapfileをいじってやります。

おー、表示できたー。

じゃあ前述の ST_Force_2D(GEOGRAPHY) はいらんのか?

「他の部分はジオメトリの場合と同じです」となっていたので、ST_Force_2D(GEOGRAPHY) を外してみた。
エラーが出ました。

まとめ

  • ジオグラフィはPostgreSQLの型と同じに扱えるので ALTER TABLE ADD COLUMN もOK
  • ST_Force_2D(GEOGRAPHY) が無いなら無理やり作れないことはない
  • mapfile をいじって SRID=4326 固定にして GEOMETRY_COLUMNS を読みに行かせないことが可能