ThinkGeo.com    |     Documentation    |     Premium Support

Splitting a Polygon into two parts

Hi,


I need to do some polygon splitting using your tool and I need some help.  I have a couple scenarios:


First Scenario:


I a screen shot below that  helps explain what I want to do.   What happens is the yellow polygon below is one polygon feature in my InMemory layer.  Then a user draws another polygon to tell the application the area of the of the original polygon that they would like to split out.  Once this is done I want to still show Part 1, and Part 2 but have them as two separate features in my InMemory layer.



I can get the Part 1 Polygon by itself by using the following lines of code:


 


            varLayer.Open()
            varLayer.EditTools.BeginTransaction()
           ' remove the difference between the two shapes
            varLayer.EditTools.GetDifference(MapFeatureID.ToString(), DrawnShape) 
            varLayer.EditTools.CommitTransaction()
            varLayer.Close()

But how do I get Part 2 Polygon and add it to my layer?


Scenario #2:


OK, Scenario #2 is similar but a little more tricky, I have a polygon that is very close to being a square or rectangle shape.  However I want to allow the user to draw a circle over this square like polygon and split it into 5 different polygon shapes.  The first four shapes being the corners outside of the user drawn circle, and the remaining polygon shape being the portion of the original polygon completely contained within the drawn circle.  After I have these shapes I want to add them to my layer and remove/update the original polygon.  Can this be done? 


Below is a screen shot to help show what I'm trying to do.



Thanks!


 



Clint, 


For the 1st scenario, code should be like this:
 


Dim OriginalPolygon As New PolygonShape()  ‘ Brown Polygon
Dim UserDrawPolygon As New PolygonShape() ‘ the polygon user draws

Dim Part2 As MultipolygonShape = OriginalPolygon.GetIntersection(UserDrawPolygon)
Dim part1 As MultipolygonShape = OriginalPolygon.GetDifference(Part2)


 
For the 2nd scenario, code should be like this:



Dim OriginalPolygon As New PolygonShape() 'the brown rectangle
Dim UserDrawPolygon As New PolygonShape() 'the circle User draws

‘ Part1 is center polygon which is one of the 5 result polygons 
Dim Part1 As MultipolygonShape = OriginalPolygon.GetIntersection(UserDrawPolygon)
‘ Part2 includes the other 4 polygons 
Dim part2 As MultipolygonShape = OriginalPolygon.GetDifference(Part1)

For Each p As PolygonShape In part2.Polygons
' Get the p1, p2, p3, p4 here
Next

 
Here are some notes:
1, The return type is MultiPolygon that’s because it’s the result could be. Here as following is one sample. You can get Polygons from a MultiPolygon very easily (see code above).


 


2, the method layer.EditTools.GetDifference() is for the case you want to difference all the mapshapes within a layer, so if that’s not your case, please not use that.
3, please ref the Page 5-6 of the JTS Topology Suite Document, where you can get all the standard topology operations, which can also be found in MapSuite. Here is also a post related to spliting shape files, have a look if you are interested.
 
Ben