Exemplo n.º 1
0
        public void Faces_AssignFaces_OneLoop2_ShouldAssign2()
        {
            var graphs = new TiledBarrierGraph();

            //    0
            //   / \
            //  1---2

            var v1 = graphs.AddVertex(
                4.788075685501099,
                51.26676188180721, 564341430);
            var v2 = graphs.AddVertex(
                4.786123037338257,
                51.26496276736555, 564341431);
            var v3 = graphs.AddVertex(
                4.790832996368408,
                51.265137311403734, 564341432);

            var e1 = graphs.AddEdge(v1, v2);
            var e2 = graphs.AddEdge(v3, v2);
            var e3 = graphs.AddEdge(v3, v1);

            graphs.SetTileLoaded(Tiles.TileStatic.WorldTileLocalId(graphs.GetVertex(v1), 14));
            graphs.SetTileLoaded(Tiles.TileStatic.WorldTileLocalId(graphs.GetVertex(v2), 14));
            graphs.SetTileLoaded(Tiles.TileStatic.WorldTileLocalId(graphs.GetVertex(v3), 14));

            graphs.AssignFaces(Tiles.TileStatic.WorldTileLocalId(graphs.GetVertex(v1), 14));

            Assert.Equal(3, graphs.FaceCount);
            var enumerator = graphs.GetEnumerator();

            enumerator.MoveTo(v1);
            enumerator.MoveNextUntil(e1);

            Assert.NotEqual(int.MaxValue, enumerator.FaceLeft);
            var left = enumerator.FaceLeft;

            Assert.NotEqual(int.MaxValue, enumerator.FaceRight);
            var right = enumerator.FaceRight;

            enumerator.MoveTo(v2);
            enumerator.MoveNextUntil(e2);
            Assert.False(enumerator.Forward);
            Assert.Equal(left, enumerator.FaceRight);
            Assert.Equal(right, enumerator.FaceLeft);
            enumerator.MoveTo(v3);
            enumerator.MoveNextUntil(e3);
            Assert.Equal(left, enumerator.FaceLeft);
            Assert.Equal(right, enumerator.FaceRight);
        }
Exemplo n.º 2
0
        public void Faces_AssignFaces_OneEdge_ShouldAssign1()
        {
            var graphs = new TiledBarrierGraph();

            var v1   = graphs.AddVertex(4.7522735595703125, 50.97918242660188, 564341430);
            var v2   = graphs.AddVertex(4.7525310516357420, 50.97851368626033, 564341431);
            var e    = graphs.AddEdge(v1, v2);
            var tile = Tiles.TileStatic.WorldTileLocalId(4.7522735595703125, 50.97918242660188, 14);

            graphs.SetTileLoaded(tile);

            graphs.AssignFaces(tile);

            Assert.Equal(1, graphs.FaceCount);
        }
Exemplo n.º 3
0
        public void Faces_AssignFaces_NoEdges_ShouldDoNothing()
        {
            var graphs = new TiledBarrierGraph();

            graphs.AssignFaces(41525);
        }
Exemplo n.º 4
0
        public static async Task BuildForTile(uint tile, string folder, Func <uint, IEnumerable <OsmGeo> > getTile,
                                              Func <TagsCollectionBase, bool> isBarrier)
        {
            // wait until tile is removed from queue.
            while (true)
            {
                if (_tiles.ContainsKey(tile))
                {
                    await Task.Delay(200);
                }
                else
                {
                    _tiles[tile] = tile;
                    break;
                }
            }

            try
            {
                var file = Path.Combine(folder, $"{tile}.tile.graph.zip");
                if (File.Exists(file))
                {
                    return;
                }

                // load data for tile.
                var graph = new TiledBarrierGraph();
                graph.LoadForTile(tile, getTile, isBarrier);

                // run face assignment for the tile.
                var result = graph.AssignFaces(tile);
                while (!result.success)
                {
                    // extra tiles need loading.-
                    graph.AddTiles(result.missingTiles, getTile, isBarrier);

                    // try again.
                    result = graph.AssignFaces(tile);
                }

                // assign landuse.
                IEnumerable <(Polygon polygon, string type)> GetLanduse(
                    ((double longitude, double latitude)topLeft, (double longitude, double latitude)bottomRight) box)
                {
                    return(LandusePolygons.GetLandusePolygons(box, graph.Zoom, getTile, t =>
                    {
                        if (DefaultMergeFactorCalculator.Landuses.TryCalculateValue(t, out var type))
                        {
                            return type;
                        }

                        return null;
                    }));
                }

                graph.AssignLanduse(tile, GetLanduse);

                await using var stream           = File.Open(file, FileMode.Create);
                await using var compressedStream = new GZipStream(stream, CompressionLevel.Fastest);
                graph.WriteTileTo(compressedStream, tile);
            }
            finally
            {
                _tiles.Remove(tile, out _);
            }
        }