PostGIS recursive intersection between polygons

后端 未结 1 1675
故里飘歌
故里飘歌 2021-02-14 06:54

I\'m trying to perform a recursive intersection between all the Polygons in a spatial Table, and obtain the resulting (multi)pololygons and the information about every intersect

1条回答
  •  深忆病人
    2021-02-14 06:57

    ST_DIFFRENCE doesn't have to be recursive, you already have all the polygons so from every geom you have to substract the union of other geoms which contain that ret but ain't equal to it. This works so you should do it kinda like that:

        WITH RECURSIVE 
    source (rownum, geom, ret) AS (
        SELECT row_number() OVER (ORDER BY name ASC), ST_Multi(geom), ARRAY[name] FROM test 
    ),
    r (rownum, geom, ret, incroci) AS (
        SELECT rownum, geom, ret, 0 FROM source 
        UNION ALL
        SELECT s.rownum, ST_CollectionExtract(ST_Intersection(s.geom, r.geom), 3), (r.ret || s.ret), (r.incroci + 1) 
            FROM source AS s INNER JOIN r ON s.rownum > r.rownum AND ST_Intersects(s.geom, r.geom) AND ST_Area(ST_Intersection(s.geom, r.geom)) > 0.5
    ),
    result (geom, ret) AS (
        SELECT ST_Difference(ST_Union(r.geom),q.geom) AS geom, r.ret FROM r JOIN (SELECT r.ret,ST_UNION(COALESCE(r2.geom,ST_GeomFromText('POLYGON EMPTY'))) as geom FROM r LEFT JOIN r AS r2 ON r.ret<@r2.ret AND r.ret!=r2.ret GROUP BY r.ret) AS q on r.ret=q.ret GROUP BY r.ret,q.geom
    )
    SELECT geom, ST_Area(geom) AS area, ret FROM result ORDER BY ret
    

    0 讨论(0)
提交回复
热议问题