DATE : 2007/12/11 (Tue)
※ これはインストールの仕方が悪かっただけなのかもしれません。ただ、長時間詰まってしまったので、ここにメモしておきます。
ST_Union( geometry set )という関数があります。これは、geometry で指定された幾何オブジェクトを結合する集約関数で、次のように使用します。ここで、幾何オブジェクトが格納されたテーブルは geometry_table で、幾何オブジェクトの列は the_geom と想定します。
SELECT ST_Union( the_geom ) FROM geometry_table;
上の例では、geometry_table テーブル内の the_geom 列に格納されている幾何オブジェクトが全て結合され、その結果、幾何オブジェクトひとつが返されます。
ところが、上の SQL を PostGIS 1.3.2 で実行すると、ST_Union( geometry )とマッチする関数はないというエラーが出てしまいました。
そこで、次のように ST_Union 関数の代わりに GeomUnion 関数を使用してみました。
SELECT GeomUnion( the_geom ) FROM geometry_table;
PostGIS の 1.3 未満では ST_Union の代わりに GeomUnion を使用していたので、昔のバージョンの関数ならば動くのではないかと踏んだのです。
そして、実際にこれはうまくいきました。ところが、PostGIS 1.3 以降は GeomUnion ではなく ST_Union 関数の使用が推奨されているので、このままではしっくりきません。将来のバージョンでは GeomUnion が削除されてしまう可能性もあります。
そこで、PostGIS 1.3 に付属する SQL 文を調べてみました。具体的には、「<PostgreSQL をインストールしたディレクトリ>\share\contrib\lwpostgis.sql」です。このファイルには、PostGIS の関数などが収められています。そのファイル内で、ST_Union や GeomUnion の集約関数の定義を探すと、次のように見つかりました。
-- Deprecation in 1.2.3 CREATE AGGREGATE GeomUnion ( sfunc = geom_accum, basetype = geometry, type = geometry[], finalfunc = ST_unite_garray ); -- Availability: 1.2.2 CREATE AGGREGATE ST_Union ( sfunc = ST_geom_accum, basetype = geometry, stype = geometry[], finalfunc = ST_unite_garray );
この定義を見ると、きちんと定義されているようです。しかも、定義の内容も GeomUnion と ST_Union とでまったく同じです。
そのため、上の ST_Union の定義を実行することで問題が解決しました。
(;^ω^)おそらくインストールの仕方が悪かったのだと思いますが、根本の原因はいまだに不明です。とりあえずの対処療法です。