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;
}
}
}
}