私は2日間問題に取り組んでいますが、トピックがPostGIS(v2.5)の交差部分である場合、多くの人が行き詰まることにも気づきました。そのため、より詳細で一般的な一般的な質問をすることにしました。
次の表があります。
DROP TABLE IF EXISTS tbl_foo;
CREATE TABLE tbl_foo (
id bigint NOT NULL,
geom public.geometry(MultiPolygon, 4326),
att_category character varying(15),
att_value integer
);
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(1, ST_SetSRID('MULTIPOLYGON (((0 6, 0 12, 8 9, 0 6)))'::geometry,4326) , 'cat1', 2 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(2, ST_SetSRID('MULTIPOLYGON (((5 0, 5 12, 9 12, 9 0, 5 0)))'::geometry,4326), 'cat1', 1 );
INSERT INTO tbl_foo (id, geom, att_category, att_value) VALUES
(3, ST_SetSRID('MULTIPOLYGON (((4 4, 3 8, 4 12, 7 14,10 12, 11 8, 10 4, 4 4)))'::geometry,4326) , 'cat2', 5 );
次のようになります。
親ポリゴンの交差に基づいてすべての子ポリゴンを取得したい。結果については、次のことが予想されます。
- それらの間にオーバーラップのない子ポリゴン。
- 親ポリゴンの値の合計を含む列、
- 1つのカテゴリの親ポリゴンの数を含む列
- 別のカテゴリの数を含む列
- 次のルールに基づく、子ポリゴンのカテゴリを含む列。-すべての親ポリゴンが1つのクラスからのものである場合、子ポリゴンにもこのクラスがあります。それ以外の場合、子ポリゴンのカテゴリは3番目のカテゴリです。
したがって、次のようになります。
だから、最終的には、(この例で)生成された出力テーブルにはの列を含む、7行(全7、非重複、子ポリゴン)を持つことになりますcategory
、sum_value
、ct_overlap_cat1
、ct_overlap_cat2
私が始めた次のコードは、ある親を別の親と比較して、個々の交差を与えます。
SELECT
(ST_Dump(
ST_SymDifference(a.geom, b.geom)
)).geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom)
UNION ALL
SELECT
ST_Intersection(a.geom, b.geom) as geom
FROM tbl_foo a, tbl_foo b
WHERE a.ID < b.ID AND ST_INTERSECTS(a.geom, b.geom);
このコードの結果を再帰的にループするには、オーバーラップポリゴンの数に関係なく、常に「最小」(子)ポリゴンを取得します(図2)。