由于您说的是每个感兴趣的多边形都有一组相交的多边形,因此您可能需要创建一个称为“多边形叠加层”的多边形。
这并不是亚当的解决方案正在做的事情。要查看差异,请看以下ABC交叉点图片:
我相信Adam的解决方案将创建一个覆盖“ AB!C”和“ ABC”区域的“ AB”多边形,以及一个覆盖“ AC!B”和“ ABC”的“ AC”多边形,以及一个“ 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的输出是一个几何图形集合,并且(通常)使用一个表(其中每一行都是构成多边形叠加层的多边形之一)更为方便。