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 を読みに行かせないことが可能