ST_Bufferの情報ありがとうございます
hfuさん、geosanakさん、情報ありがとうございます。
まずはGEOSはJTSをC++に移植したものである、とまずは言っておきます。
JTSについて、自己交差、自己接触を回避するためにbuffer(0)は裏技として使っているとのこと。そうなのか。
ご紹介頂いた http://lin-ear-th-inking.blogspot.com/2007/11/fast-polygon-merging-in-jts-using.html によると、
- Iterated Union (ポリゴン二つをUNIONして、その結果と他のポリゴンをUNIONして…と続ける)
- Buffer Union (ポリゴンをUNIONせずに集めてbuffer(0)を実行)
- Cascaded Union (木を作って葉から開始して、兄弟ノードをUNIONしていき、上位ノードに上がる)
が紹介されています。
ちょうど、
- Iterated Union = PostGIS 1.3以前のST_Union(the_geom)
- Buffer Union = ST_Buffer(ST_Collect(the_geom)),0)
- Cascaded Union = PostGIS 1.4のST_Union(the_geom)
となりますね。
id:wata909:20090916#p1 とも合致しますね。
カラクリについては、怠惰な私はソースを見るのはやめておいて、「そういうもの」と考えることにします。
なお、スナップさせて自己接触だらけになったポリゴンをUNIONしようとしたときは http://trac.osgeo.org/postgis/wiki/UsersWikiCleanPolygons を使っていました。