Поскольку вы сказали, что получаете группу пересекающихся многоугольников для каждого интересующего вас многоугольника, вы можете создать так называемый «наложение многоугольника».
Это не совсем то, что делает решение Адама. Чтобы увидеть разницу, взгляните на эту картинку пересечения ABC:
Я полагаю, что решение Адама создаст многоугольник "AB", который охватывает как области "AB! C" и "ABC", так и многоугольник "AC", который охватывает "AC! B" и "ABC", а также " До н.э. "многоугольник" это "BC! A" и "ABC". Таким образом, выходные полигоны "AB", "AC" и "BC" будут перекрывать область "ABC".
Наложение полигонов создает неперекрывающиеся полигоны, поэтому AB! C будет одним полигоном, а ABC будет одним полигоном.
Создание наложения полигонов в PostGIS на самом деле довольно просто.
Есть в основном три шага.
Шаг 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...)
Вы можете сохранить выходные данные каждого из этих шагов во временную таблицу или объединить их все в один оператор:
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_Dump, потому что выходные данные ST_Polygonize являются коллекцией геометрии, и (обычно) удобнее иметь таблицу, в которой каждая строка является одним из полигонов, составляющих наложение полигонов.