/// <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());
            }
예제 #3
0
        /**
         * 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));
                }
            }
        }