Оскільки ви сказали, що ви отримуєте групу пересічних багатокутників для кожного цікавить вас багатокутника, ви можете створити те, що називається "перекриття полігону".
Це не зовсім те, що робить рішення Адама. Щоб побачити різницю, подивіться на цю картину перетину ABC:
Я вважаю, що рішення Адама створить багатокутник "AB", який охоплює і область "AB! C" і "ABC", а також полігон "AC", який охоплює "AC! B" і "ABC", і " BC "багатокутник, що є" 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 - це колекція геометрії, і, як правило, зручніше мати таблицю, де кожен рядок є одним з многокутників, що складається з накладання багатокутника.