ST_Bufferの情報ありがとうございます

hfuさん、geosanakさん、情報ありがとうございます。

まずはGEOSJTSC++に移植したものである、とまずは言っておきます。
JTSについて、自己交差、自己接触を回避するためにbuffer(0)は裏技として使っているとのこと。そうなのか。

ご紹介頂いた http://lin-ear-th-inking.blogspot.com/2007/11/fast-polygon-merging-in-jts-using.html によると、

  1. Iterated Union (ポリゴン二つをUNIONして、その結果と他のポリゴンをUNIONして…と続ける)
  2. Buffer Union (ポリゴンをUNIONせずに集めてbuffer(0)を実行)
  3. Cascaded Union (木を作って葉から開始して、兄弟ノードをUNIONしていき、上位ノードに上がる)

が紹介されています。
ちょうど、

  1. Iterated Union = PostGIS 1.3以前のST_Union(the_geom)
  2. Buffer Union = ST_Buffer(ST_Collect(the_geom)),0)
  3. Cascaded Union = PostGIS 1.4のST_Union(the_geom)

となりますね。

id:wata909:20090916#p1 とも合致しますね。

ラクリについては、怠惰な私はソースを見るのはやめておいて、「そういうもの」と考えることにします。

なお、スナップさせて自己接触だらけになったポリゴンをUNIONしようとしたときは http://trac.osgeo.org/postgis/wiki/UsersWikiCleanPolygons を使っていました。