ThinkGeo.com    |     Documentation    |     Premium Support

Conver Polygon to Polyine

Hello all,


Would you have method can convert Polygon to Polyline?


ArcGIS seems have this fuction.


It will convert polygon to polyline.(It can help county boundary will not duplicate generated )

 


If you have any idea can help me to do this, please let me know.


Thanks, Carol


 



 Carol,


  Here are two methods to do this.  We should include this in the base API.  I will add an issue to our tracking system and see if we can add that by the November release.  Until then you can use the two methods below.




        private MultilineShape ConvertPolygonToMultiLineShape(PolygonShape polygon)
        {
            MultilineShape newMultiLineShape = new MultilineShape();

            LineShape outerRingLineShape = new LineShape();
            newMultiLineShape.Lines.Add(outerRingLineShape);
            foreach (Vertex vertex in polygon.OuterRing.Vertices)
            {
                outerRingLineShape.Vertices.Add(vertex);
            }

            foreach (RingShape ring in polygon.InnerRings)
            {
                LineShape innerRingLineShape = new LineShape();
                newMultiLineShape.Lines.Add(innerRingLineShape);
                foreach (Vertex vertex in ring.Vertices)
                {
                    innerRingLineShape.Vertices.Add(vertex);
                }
            }

            return newMultiLineShape;
        }

        private MultilineShape ConvertMultiPolygonToMultiLineShape(MultipolygonShape multiPolygon)
        {
            MultilineShape newMultiLineShape = new MultilineShape();

            foreach (PolygonShape polygon in multiPolygon.Polygons)
            {
                LineShape outerRingLineShape = new LineShape();
                newMultiLineShape.Lines.Add(outerRingLineShape);
                foreach (Vertex vertex in polygon.OuterRing.Vertices)
                {
                    outerRingLineShape.Vertices.Add(vertex);
                }

                foreach (RingShape ring in polygon.InnerRings)
                {
                    LineShape innerRingLineShape = new LineShape();
                    newMultiLineShape.Lines.Add(innerRingLineShape);
                    foreach (Vertex vertex in ring.Vertices)
                    {
                        innerRingLineShape.Vertices.Add(vertex);
                    }
                }
            }
            return newMultiLineShape;
        }


David



Thanks for your reply, David 
 But it seems doesn’t solve the problem of duplicate boundary. 
 I’d like to convert polygon to polyline, but these polylines will not repeat. 


Carol, 
  
   Can you give me an example as I don’t quite understand.  Sorry… 
  
 David

Sorry, David

I describe this problem unclearly.

In your code, you just convert polygonShape to LineShape.

But you don't have delete duplicate line segment.

ex.




There is two polygons. In your code, even if they convert to polyline, they still have some vertex is repeated.(In their common boundary)


 



Carol, 
  
 I will provide a function to remove duplicate line segments. Please keep an eye on this post. 
  
 Thanks 
  
 James 


Carol,


I have created a function to remove the duplicate line segments, and also change a little for David's code to make it easier.


functions:


private void RemoveDuplicateLineSegments(MultilineShape multilineShape)
{
    MultilineShape result = new MultilineShape();

    for (int i = multilineShape.Lines.Count - 1; i >= 0; i--)
    {
        LineShape line = multilineShape.Lines[i];
        for (int j = multilineShape.Lines.Count - 1; j >= 0; j--)
        {
            if (j == i) { continue; }

            if (line.IsTopologicallyEqual(multilineShape.Lines[j]))
            {
                multilineShape.Lines.RemoveAt(i);
                break;
            }
        }
    }
}

private MultilineShape ConvertPolygonToMultiLineShape(PolygonShape polygon)
{
    MultilineShape newMultiLineShape = new MultilineShape();

    for (int i = 0; i < polygon.OuterRing.Vertices.Count - 1; i++)
    {
        Vertex vertex1 = polygon.OuterRing.Vertices[i];
        Vertex vertex2 = polygon.OuterRing.Vertices[i + 1];
        newMultiLineShape.Lines.Add(new LineShape(new Vertex[] { vertex1, vertex2 }));
    }

    foreach (RingShape ring in polygon.InnerRings)
    {
        for (int i = 0; i < ring.Vertices.Count - 1; i++)
        {
            Vertex vertex1 = ring.Vertices[i];
            Vertex vertex2 = ring.Vertices[i + 1];
            newMultiLineShape.Lines.Add(new LineShape(new Vertex[] { vertex1, vertex2 }));
        }
    }

    return newMultiLineShape;
}

private MultilineShape ConvertMultiPolygonToMultiLineShape(MultipolygonShape multiPolygon)
{
    MultilineShape newMultiLineShape = new MultilineShape();

    foreach (PolygonShape polygon in multiPolygon.Polygons)
    {
        for (int i = 0; i < polygon.OuterRing.Vertices.Count - 1; i++)
        {
            Vertex vertex1 = polygon.OuterRing.Vertices[i];
            Vertex vertex2 = polygon.OuterRing.Vertices[i + 1];
            newMultiLineShape.Lines.Add(new LineShape(new Vertex[] { vertex1, vertex2 }));
        }

        foreach (RingShape ring in polygon.InnerRings)
        {
            for (int i = 0; i < ring.Vertices.Count - 1; i++)
            {
                Vertex vertex1 = ring.Vertices[i];
                Vertex vertex2 = ring.Vertices[i + 1];
                newMultiLineShape.Lines.Add(new LineShape(new Vertex[] { vertex1, vertex2 }));
            }
        }
    }
    return newMultiLineShape;
}

sample test code:


// Code for ConvertMultiPolygonToMultiLineShape
PolygonShape polygon1 = new PolygonShape("POLYGON((10 60,40 70,30 85, 10 60))");
PolygonShape polygon2 = new PolygonShape("POLYGON((10 60,40 70,-30 -85, 10 60))");
MultipolygonShape polygons = new MultipolygonShape(new PolygonShape[] { polygon1, polygon2 });

MultilineShape multilineShape = ConvertMultiPolygonToMultiLineShape(polygons);
RemoveDuplicateLineSegments(multilineShape);


// Code for ConvertPolygonToMultiLineShape
PolygonShape polygon1 = new PolygonShape("POLYGON((10 60,40 70,30 85, 10 60))");
PolygonShape polygon2 = new PolygonShape("POLYGON((10 60,40 70,-30 -85, 10 60))");
MultilineShape line1 = ConvertPolygonToMultiLineShape(polygon1);
MultilineShape line2 = ConvertPolygonToMultiLineShape(polygon2);

MultilineShape multilineShape = new MultilineShape();
foreach (LineShape line in line1.Lines)
{
    multilineShape.Lines.Add(line);
}
foreach (LineShape line in line2.Lines)
{
    multilineShape.Lines.Add(line);
}

RemoveDuplicateLineSegments(multilineShape);

Please let me know if you have questions


Thanks


James