using System.Collections; using GeoAPI.Geometries; using GisSharpBlog.NetTopologySuite.Geometries; namespace GisSharpBlog.NetTopologySuite.Operation.Linemerge { /// /// A sequence of LineMergeDirectedEdges forming one of the lines that will /// be output by the line-merging process. /// public class EdgeString { private readonly IGeometryFactory factory; private readonly IList directedEdges = new ArrayList(); private ICoordinate[] coordinates = null; /// /// Constructs an EdgeString with the given factory used to convert this EdgeString /// to a LineString. /// /// public EdgeString(IGeometryFactory factory) { this.factory = factory; } /// /// Adds a directed edge which is known to form part of this line. /// /// public void Add(LineMergeDirectedEdge directedEdge) { directedEdges.Add(directedEdge); } /// /// Converts this EdgeString into a LineString. /// public ILineString ToLineString() { return factory.CreateLineString(Coordinates); } /// /// /// private ICoordinate[] Coordinates { get { if (coordinates == null) { int forwardDirectedEdges = 0; int reverseDirectedEdges = 0; CoordinateList coordinateList = new CoordinateList(); IEnumerator i = directedEdges.GetEnumerator(); while (i.MoveNext()) { LineMergeDirectedEdge directedEdge = (LineMergeDirectedEdge) i.Current; if (directedEdge.EdgeDirection) { forwardDirectedEdges++; } else { reverseDirectedEdges++; } coordinateList.Add(((LineMergeEdge) directedEdge.Edge).Line.Coordinates, false, directedEdge.EdgeDirection); } coordinates = coordinateList.ToCoordinateArray(); if (reverseDirectedEdges > forwardDirectedEdges) { CoordinateArrays.Reverse(coordinates); } } return coordinates; } } } }