Index: src/Common/NetTopologySuite/Operation/Linemerge/LineMerger.cs =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r5fc71a385897af92ccb092f2f969b5709afab85a --- src/Common/NetTopologySuite/Operation/Linemerge/LineMerger.cs (.../LineMerger.cs) (revision 8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9) +++ src/Common/NetTopologySuite/Operation/Linemerge/LineMerger.cs (.../LineMerger.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a) @@ -16,42 +16,20 @@ /// at their endpoints. The LineMerger will still run on incorrectly noded input /// but will not form polygons from incorrected noded edges. /// - public class LineMerger + public class LineMerger { - /// - /// - /// - private class AnonymousGeometryComponentFilterImpl : IGeometryComponentFilter - { - private LineMerger container = null; + private readonly LineMergeGraph graph = new LineMergeGraph(); + private IList mergedLineStrings = null; + private IList edgeStrings = null; + private IGeometryFactory factory = null; - /// - /// - /// - /// - public AnonymousGeometryComponentFilterImpl(LineMerger container) - { - this.container = container; - } - - /// - /// - /// - /// - public void Filter(IGeometry component) - { - if (component is ILineString) - container.Add((ILineString) component); - } - } - /// /// Adds a collection of Geometries to be processed. May be called multiple times. /// Any dimension of Geometry may be added; the constituent linework will be /// extracted. /// /// - public void Add(IList geometries) + public void Add(IList geometries) { IEnumerator i = geometries.GetEnumerator(); while (i.MoveNext()) @@ -61,96 +39,105 @@ } } - private LineMergeGraph graph = new LineMergeGraph(); - private IList mergedLineStrings = null; - private IList edgeStrings = null; - private IGeometryFactory factory = null; - /// /// Adds a Geometry to be processed. May be called multiple times. /// Any dimension of Geometry may be added; the constituent linework will be /// extracted. /// /// public void Add(IGeometry geometry) - { + { geometry.Apply(new AnonymousGeometryComponentFilterImpl(this)); } /// + /// Returns the LineStrings built by the merging process. + /// + /// + public IList GetMergedLineStrings() + { + Merge(); + return mergedLineStrings; + } + + /// /// /// /// - private void Add(ILineString lineString) + private void Add(ILineString lineString) { - if (factory == null) - this.factory = lineString.Factory; + if (factory == null) + { + factory = lineString.Factory; + } graph.AddEdge(lineString); } - + /// /// /// - private void Merge() + private void Merge() { - if (mergedLineStrings != null) - return; + if (mergedLineStrings != null) + { + return; + } edgeStrings = new ArrayList(); BuildEdgeStringsForObviousStartNodes(); BuildEdgeStringsForIsolatedLoops(); - mergedLineStrings = new ArrayList(); - for (IEnumerator i = edgeStrings.GetEnumerator(); i.MoveNext(); ) + mergedLineStrings = new ArrayList(); + for (IEnumerator i = edgeStrings.GetEnumerator(); i.MoveNext();) { EdgeString edgeString = (EdgeString) i.Current; mergedLineStrings.Add(edgeString.ToLineString()); - } + } } /// /// /// - private void BuildEdgeStringsForObviousStartNodes() + private void BuildEdgeStringsForObviousStartNodes() { BuildEdgeStringsForNonDegree2Nodes(); } /// /// /// - private void BuildEdgeStringsForIsolatedLoops() + private void BuildEdgeStringsForIsolatedLoops() { BuildEdgeStringsForUnprocessedNodes(); - } + } /// /// /// - private void BuildEdgeStringsForUnprocessedNodes() + private void BuildEdgeStringsForUnprocessedNodes() { IEnumerator i = graph.Nodes.GetEnumerator(); while (i.MoveNext()) { Node node = (Node) i.Current; - if (!node.IsMarked) - { + if (!node.IsMarked) + { Assert.IsTrue(node.Degree == 2); BuildEdgeStringsStartingAt(node); node.Marked = true; } } - } + } /// /// /// - private void BuildEdgeStringsForNonDegree2Nodes() + private void BuildEdgeStringsForNonDegree2Nodes() { IEnumerator i = graph.Nodes.GetEnumerator(); - while (i.MoveNext()) + while (i.MoveNext()) { Node node = (Node) i.Current; - if (node.Degree != 2) - { + if (node.Degree != 2) + { BuildEdgeStringsStartingAt(node); node.Marked = true; } @@ -161,14 +148,16 @@ /// /// /// - private void BuildEdgeStringsStartingAt(Node node) + private void BuildEdgeStringsStartingAt(Node node) { IEnumerator i = node.OutEdges.GetEnumerator(); - while (i.MoveNext()) + while (i.MoveNext()) { LineMergeDirectedEdge directedEdge = (LineMergeDirectedEdge) i.Current; if (directedEdge.Edge.IsMarked) + { continue; + } edgeStrings.Add(BuildEdgeStringStartingWith(directedEdge)); } } @@ -178,28 +167,46 @@ /// /// /// - private EdgeString BuildEdgeStringStartingWith(LineMergeDirectedEdge start) - { + private EdgeString BuildEdgeStringStartingWith(LineMergeDirectedEdge start) + { EdgeString edgeString = new EdgeString(factory); LineMergeDirectedEdge current = start; - do + do { edgeString.Add(current); current.Edge.Marked = true; - current = current.Next; - } - while (current != null && current != start); + current = current.Next; + } while (current != null && current != start); return edgeString; } /// - /// Returns the LineStrings built by the merging process. + /// /// - /// - public IList GetMergedLineStrings() + private class AnonymousGeometryComponentFilterImpl : IGeometryComponentFilter { - Merge(); - return mergedLineStrings; + private readonly LineMerger container = null; + + /// + /// + /// + /// + public AnonymousGeometryComponentFilterImpl(LineMerger container) + { + this.container = container; + } + + /// + /// + /// + /// + public void Filter(IGeometry component) + { + if (component is ILineString) + { + container.Add((ILineString) component); + } + } } } -} +} \ No newline at end of file