2008年11月24日月曜日

cat_multilinestrings

 世間では3連休なんだけど、家で仕事・・・orz。マネジメントもするけど、諸々の事情で、多岐にわたってコーディングもしなければならない。
 PostGis で、MULTILINESTRING 型の図形を連結したいと思ったのだが、plpgsqlで関数を書くことに・・・。


CREATE OR REPLACE FUNCTION cat_multilinestrings(geoms geometry[])
RETURNS geometry AS
$BODY$
DECLARE
i integer;
j integer;
n integer;
sid integer;
pstr text;
tg geometry;
BEGIN
n := array_upper( geoms, 1 );
if n < 1 then
RAISE EXCEPTION 'cat_multilinestring: empty input';
elseif n < 2 then
RETURN geoms[1];
end if;
pstr := '';
sid := SRID(geoms[1]);
FOR i IN 1..n LOOP
if GeometryType( geoms[i] ) != 'MULTILINESTRING' then
RAISE EXCEPTION 'cat_multilinestring: invalid geometry type %1 in %2', GeometryType(geoms[i]), i;
end if;
if sid != GetSRID(geoms[i]) then
tg := Transform(geoms[i],sid);
else
tg := geoms[i];
end if;
FOR j IN 1..NumPoints(tg) LOOP
pstr := pstr || ',' || X(PointN(tg,j))::varchar || ' ' || Y(PointN(tg,j))::varchar;
END LOOP;
END LOOP;
-- 先頭のカンマを除去
pstr := substr( pstr, 2 );
RETURN GeomFromText( 'MULTILINESTRING((' || pstr || '))', sid );
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;

 バッファ長の問題で、あまり長い図形を連結すると空になるという問題があります。plpgsqlにおける配列の取り扱いについては、次のポストで書きます。

0 件のコメント: