[postgis-users] Splitting a Polygon with a Linestring

Kevin Neufeld kneufeld at refractions.net
Wed May 28 12:53:29 PDT 2008


Things would get a little bit more complicated when holes are involved, 
but I don't think overly so.

The polygonizer builds polygons from all linework - this includes 
building polygons for what should be holes.   What you would need to do 
as a post-process is remove all polygons that don't belong.  (In the 
following example, I use contains and pointonsurface to determine which 
polygons I should exclude from the final result.

Here is another sample polygon splitting, this time the polygon has two 
holes where one is intersected by the splitting line.

CREATE TABLE poly AS
   SELECT 'POLYGON (( 1 1, 1 7, 7 7, 7 1, 1 1 ),
                    ( 2 3, 4 3, 4 5, 2 5, 2 3 ),
                    ( 5 5, 6 5, 6 6, 5 6, 5 5 ))'::geometry AS geom;

CREATE TABLE line AS
   SELECT 'LINESTRING (0 4, 8 4)'::geometry AS geom;

CREATE TABLE split_polys AS
SELECT geom FROM dump ((
   SELECT polygonize(geomunion(boundary(poly.geom), line.geom))
   FROM poly, line
));

DELETE FROM split_polys a
USING poly b
WHERE NOT contains(b.geom, pointonsurface(a.geom));

SELECT astext(geom) FROM split_polys;

                                 astext
----------------------------------------------------------------------
  POLYGON((1 1,1 4,2 4,2 3,4 3,4 4,7 4,7 1,1 1))
  POLYGON((1 4,1 7,7 7,7 4,4 4,4 5,2 5,2 4,1 4),(5 5,6 5,6 6,5 6,5 5))
(2 rows)


Cheers,
Kevin


Obe, Regina wrote:
> 
> Kevin,
>  
> that looks neat.  I'll have to remember that one.
>  
> I presume if you have a geometry with holes, this would not work.   How 
> would you tackle,   if say you wanted to cut a donut with a line.
>  
> Thanks,
> Regina
> 
> *From:* postgis-users-bounces at postgis.refractions.net on behalf of Kevin 
> Neufeld
> *Sent:* Wed 5/28/2008 1:47 PM
> *To:* PostGIS Users Discussion
> *Subject:* Re: [postgis-users] Splitting a Polygon with a Linestring
> 
> Right.
> 
> Here's an example splitting a polygon with a line.  Note that the
> dangling cutlines outside the polygon are quietly dropped.
> 
> 
> SELECT astext(geom )
> FROM dump ((
> 
> SELECT polygonize(geomunion(boundary(poly), line)) AS mpoly
> FROM
>    (SELECT 'POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1 ))'::geometry AS poly) AS a,
>    (SELECT 'LINESTRING (0 2, 4 2)'::geometry AS line) AS b
> 
> ));
> 
> 
>               astext
> --------------------------------
>   POLYGON((1 1,1 2,3 2,3 1,1 1))
>   POLYGON((1 2,1 3,3 3,3 2,1 2))
> (2 rows)
> 
> Cheers,
> Kevin
> 
> 
> James Beaudoin wrote:
>  > I think the steps below will work but I have one question. I am creating
>  > an application that allows a user to split a polygon by drawing a
>  > linestring across the polygon they wish to change. The crossing
>  > linestring has parts that are outside the polygon and I want to remove
>  > that before I geomunion. What's the easiest way to do that?
>  >
>  > - extract the lines that make up the polygon
>  > - add to this your crossing linestring
>  > - geomunion the lines together.
>  > - polygonize the union-ed set
>  >
>  > Thanks,
>  >
>  > Jim
>  > _______________________________________________
>  > postgis-users mailing list
>  > postgis-users at postgis.refractions.net
>  > http://postgis.refractions.net/mailman/listinfo/postgis-users
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
> 
> * The substance of this message, including any attachments, may be 
> confidential, legally privileged and/or exempt from disclosure pursuant 
> to Massachusetts law. It is intended solely for the addressee. If you 
> received this in error, please contact the sender and delete the 
> material from any computer. *
> 
> * Help make the earth a greener place. If at all possible resist 
> printing this email and join us in saving paper. *
> 
> * *
> 
> * *
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users



More information about the postgis-users mailing list