/// <summary> /// Creates a graph. /// </summary> /// <param name="coordinates">The sequence of edge sequences.</param> /// <param name="vertexEqualityComparer">The vertex comparer.</param> /// <param name="edgeEqualityComparer">The edge comparer.</param> /// <param name="metadata">The metadata.</param> /// <returns>A graph containing the specified coordinates as vertices and edges and the metadata using the specified comparers.</returns> public IGeometryGraph CreateGraph(IEnumerable <IEnumerable <Coordinate> > coordinates, IEqualityComparer <IGraphVertex> vertexEqualityComparer, IEqualityComparer <IGraphEdge> edgeEqualityComparer, IDictionary <String, Object> metadata) { IGeometryGraph graph = new GeometryGraph(vertexEqualityComparer, edgeEqualityComparer, GetFactory <IGeometryFactory>(), metadata); if (coordinates != null) { foreach (IEnumerable <Coordinate> coordinateCollection in coordinates) { if (coordinateCollection == null) { continue; } IGraphVertex first, second; IEnumerator <Coordinate> enumerator = coordinateCollection.GetEnumerator(); if (enumerator.MoveNext()) { first = graph.AddVertex(enumerator.Current); while (enumerator.MoveNext()) { second = graph.AddVertex(enumerator.Current); graph.AddEdge(first, second); first = second; } } } } return(graph); }
public void GeometryGraphDepthFirstEnumeratorResetTest() { // simple reset GeometryGraph graph = new GeometryGraph(PrecisionModel.Default, null, null); IGraphVertex v1 = graph.AddVertex(new Coordinate(10, 10)); IGraphVertex v2 = graph.AddVertex(new Coordinate(0, 0)); IGraphVertex v3 = graph.AddVertex(new Coordinate(5, 5)); IGraphVertex v4 = graph.AddVertex(new Coordinate(15, 15)); graph.AddEdge(v1, v2); graph.AddEdge(v2, v1); graph.AddEdge(v3, v4); IEnumerator <IGraphVertex> enumerator = graph.GetEnumerator(EnumerationStrategy.DepthFirst); List <IGraphVertex> list = new List <IGraphVertex>(); while (enumerator.MoveNext()) { list.Add(enumerator.Current); } Assert.AreEqual(list.Count, graph.VertexCount); Assert.IsTrue(list.All(vertex => graph.Vertices.Contains(vertex))); enumerator.Reset(); list = new List <IGraphVertex>(); while (enumerator.MoveNext()) { list.Add(enumerator.Current); } Assert.AreEqual(list.Count, graph.VertexCount); Assert.IsTrue(list.All(vertex => graph.Vertices.Contains(vertex))); // modified collection graph.AddVertex(new Coordinate(20, 20)); Assert.Throws <InvalidOperationException>(() => enumerator.Reset()); }
/** * Use a GeometryGraph to node the created edges, * and create split edges between the nodes */ private ArrayList NodeEdges(ArrayList edges) { // intersect edges again to ensure they are noded correctly GeometryGraph graph = new GeometryGraph(0, _geomFact.PrecisionModel, 0); //for (Iterator i = edges.iterator(); i.hasNext(); ) foreach (object obj in edges) { Edge e = (Edge)obj; graph.AddEdge(e); } SegmentIntersector si = graph.ComputeSelfNodes(_li); /* * if (si.hasProperIntersection()) * Debug.println("proper intersection found"); * else * Debug.println("no proper intersection found"); */ ArrayList newEdges = new ArrayList(); graph.ComputeSplitEdges(newEdges); return(newEdges); }
public void GraphToGeometryConversionLinesTest() { Random random = new Random(); List <Coordinate> coordinates = new List <Coordinate>(); for (Int32 i = 0; i < 100; i++) { coordinates.Add(new Coordinate(i, i)); } GeometryGraph graph = new GeometryGraph(PrecisionModel.Default, _referenceSystemMock.Object, null); for (Int32 i = 0; i < coordinates.Count; i++) { graph.AddVertex(coordinates[i]); if (i > 0) { graph.AddEdge(graph.GetVertex(coordinates[i - 1]), graph.GetVertex(coordinates[i])); } } // only points Dictionary <OperationParameter, Object> parameters = new Dictionary <OperationParameter, object>(); parameters[GraphOperationParameters.GeometryDimension] = 0; GraphToGeometryConversion conversion = new GraphToGeometryConversion(graph, parameters); conversion.Execute(); IGeometry result = conversion.Result; Assert.IsTrue(result is IMultiPoint); Assert.AreSame(result.ReferenceSystem, graph.ReferenceSystem); Assert.AreEqual(coordinates.Count, (result as IMultiPoint).Count); foreach (IPoint point in result as IMultiPoint) { Assert.IsTrue(coordinates.Contains(point.Coordinate)); } // only lines parameters = new Dictionary <OperationParameter, object>(); parameters[GraphOperationParameters.GeometryDimension] = 1; conversion = new GraphToGeometryConversion(graph, parameters); conversion.Execute(); result = conversion.Result; Assert.IsTrue(result is IMultiLineString); Assert.AreEqual(coordinates.Count - 1, (result as IMultiLineString).Count); foreach (ILineString lineString in result as IMultiLineString) { Assert.IsTrue(lineString is ILine); Assert.IsTrue(coordinates.Contains(lineString.StartCoordinate)); Assert.IsTrue(coordinates.Contains(lineString.EndCoordinate)); } // points and lines List <Coordinate> newCoordinates = new List <Coordinate>(); for (Int32 i = 100; i < 200; i++) { newCoordinates.Add(new Coordinate(i, i)); } newCoordinates.ForEach(coordinate => graph.AddVertex(coordinate)); parameters = new Dictionary <OperationParameter, object>(); parameters[GraphOperationParameters.GeometryDimension] = 1; conversion = new GraphToGeometryConversion(graph, parameters); conversion.Execute(); result = conversion.Result; Assert.IsTrue(result is IGeometryCollection <IGeometry>); Assert.AreEqual(coordinates.Count - 1 + newCoordinates.Count, (result as IGeometryCollection <IGeometry>).Count); foreach (IGeometry geometry in result as IGeometryCollection <IGeometry> ) { Assert.IsTrue(geometry is ILine || geometry is IPoint); if (geometry is ILine) { Assert.IsTrue(coordinates.Contains((geometry as ILine).StartCoordinate)); Assert.IsTrue(coordinates.Contains((geometry as ILine).EndCoordinate)); } if (geometry is IPoint) { Assert.IsTrue(newCoordinates.Contains((geometry as IPoint).Coordinate)); } } }