興味のあるポリゴンごとに交差するポリゴンのグループを取得したと言ったので、「ポリゴンオーバーレイ」と呼ばれるものを作成することができます。
これは、Adamのソリューションが行っていることとはまったく異なります。違いを確認するには、ABC交差点のこの写真を見てください。
Adamのソリューションは、「AB!C」と「ABC」の両方の領域をカバーする「AB」ポリゴン、および「AC!B」と「ABC」をカバーする「AC」ポリゴン、および「 「BC」ポリゴンは「BC!A」および「ABC」です。そのため、「AB」、「AC」、および「BC」の出力ポリゴンはすべて「ABC」エリアと重なります。
ポリゴンオーバーレイは重複しないポリゴンを生成するため、AB!Cは1つのポリゴン、ABCは1つのポリゴンになります。
PostGISでポリゴンオーバーレイを作成するのは、実際には非常に簡単です。
基本的に3つのステップがあります。
ステップ1は、ラインワークを抽出します[ 多角形の外部リングを使用していることに注意してください。穴を正しく処理する場合、少し複雑になります]:
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
ステップ2は、ラインワークを「ノード化」することです(交差点ごとにノードを作成します)。JTSなどの一部のライブラリには、これを行うために使用できる「Noder」クラスがありますが、PostGISでは、ST_Union関数がそれを行います。
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
ステップ3では、ST_Polygonize関数によって、これらのすべてのラインから発生する可能性のあるすべての重複しないポリゴンを作成します。
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
これらの各ステップの出力を一時テーブルに保存することも、すべてを1つのステートメントに結合することもできます。
CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
) AS noded_lines
)
)
ST_Polygonizeの出力はジオメトリコレクションであり、各行がポリゴンオーバーレイを構成するポリゴンの1つであるテーブルが(通常)より便利なので、ST_Dumpを使用しています。