Ejemplo n.º 1
0
        public static List <Tile> SortTrees(List <SingleTileset> tilesets, string parentFolder)
        {
            var comparer = new TilesetRegionComparer();

            tilesets.Sort(comparer);
            var nodes = new List <Tile>();
            var ts0   = tilesets[tilesets.Count - 1];

            nodes.Add(ToTile(ts0, parentFolder));
            Tile parent  = null;
            Tile current = nodes[0];

            for (var i = tilesets.Count - 1; i > 0; i--)
            {
                var j    = i - 1;
                var node = ToTile(tilesets[j], parentFolder);
                var sign = comparer.Compare(tilesets[i], tilesets[j]);
                if (sign == 1)
                {
                    current.Children.Add(node);
                    parent = current;
                }
                else if (sign == 0)
                {
                    if (parent != null)
                    {
                        parent.Children.Add(node);
                    }
                    else
                    {
                        nodes.Add(node);
                    }
                    //parent = current;
                }
                else
                {
                }
                current = node;
            }
            return(nodes);
        }
Ejemplo n.º 2
0
        internal static string MergeTilesets(string outputFolder, GisPosition gisPosition, bool lod, bool writeChildTilesetJson, params Task <SingleTileset>[] waitedTasks)
        {
            var west      = double.MaxValue;
            var south     = double.MaxValue;
            var north     = double.MinValue;
            var east      = double.MinValue;
            var minheight = double.MaxValue;
            var maxheight = double.MinValue;

            var outputTileset = Path.Combine(outputFolder, "tileset.json");
            var outputPath    = GenerateBatchedPath(outputFolder);

            var tilesetList = new List <SingleTileset>();

            var tiles          = new List <Tile>();
            var geometricError = 500.0;

            foreach (var t in waitedTasks)
            {
                var json = t.Result;
                tilesetList.Add(json);
                if (json.Root == null)
                {
                    continue;
                }
                var boundingVolume = json.Root.BoundingVolume;
                if (boundingVolume == null)
                {
                    continue;
                }
                var geometricError0 = json.GeometricError;
                if (boundingVolume.Region != null &&
                    boundingVolume.Region.Length >= 6)
                {
                    west      = Math.Min(west, boundingVolume.Region[0]);
                    south     = Math.Min(south, boundingVolume.Region[1]);
                    east      = Math.Max(east, boundingVolume.Region[2]);
                    north     = Math.Max(north, boundingVolume.Region[3]);
                    minheight = Math.Min(minheight, boundingVolume.Region[4]);
                    maxheight = Math.Max(maxheight, boundingVolume.Region[5]);
                }
                var contentName = Path.GetFileNameWithoutExtension(json.Root.Content.Url);
                if (!lod)
                {
                    var err = geometricError0 / 4.0;
                    if (json.Root != null)
                    {
                        double?err0 = null;
                        if (json.Root.OriginalX != null && json.Root.OriginalX.IsValid())
                        {
                            var errX = (json.Root.OriginalX.Max - json.Root.OriginalX.Min) / 10;
                            err0 = errX;
                        }
                        if (json.Root.OriginalY != null && json.Root.OriginalY.IsValid())
                        {
                            var errY = (json.Root.OriginalY.Max - json.Root.OriginalY.Min) / 10;
                            if (!err0.HasValue)
                            {
                                err0 = errY;
                            }
                            else if (err0.Value < errY)
                            {
                                err0 = errY;
                            }
                        }
                        if (json.Root.OriginalZ != null && json.Root.OriginalZ.IsValid())
                        {
                            var errZ = (json.Root.OriginalZ.Max - json.Root.OriginalZ.Min) / 10;
                            if (!err0.HasValue)
                            {
                                err0 = errZ;
                            }
                            else if (err0.Value < errZ)
                            {
                                err0 = errZ;
                            }
                        }
                        if (err0.HasValue)
                        {
                            err = err0.Value;
                        }
                    }
                    tiles.Add(new Tile
                    {
                        BoundingVolume = boundingVolume,
                        GeometricError = 0.0,
                        Refine         = null,
                        Content        = new TileContent
                        {
                            Url            = DataFolderName + "/" + json.Root.Content.Url,
                            BoundingVolume = boundingVolume
                        }
                    });
                }
                if (writeChildTilesetJson)
                {
                    var jsonFilepath = Path.Combine(outputPath, contentName + ".json");
                    WriteTilesetJsonFile(jsonFilepath, json);
                }
            }
            if (lod)
            {
                tiles = TilesetRegionComparer.SortTrees(tilesetList, DataFolderName);
            }

            var longitude      = gisPosition.Longitude;
            var latitude       = gisPosition.Latitude;
            var transHeight    = gisPosition.TransHeight.HasValue ? gisPosition.TransHeight.Value : 0.0;
            var transformArray = GisUtil.Wgs84Transform(
                longitude, latitude, transHeight).ToArray();

            var allTileset = new SingleTileset
            {
                Asset = new TilesetAsset
                {
                    Version        = "0.0",
                    TilesetVersion = "1.0.0-arctron"
                },
                GeometricError = geometricError,
                Root           = new Tile
                {
                    BoundingVolume = new BoundingVolume
                    {
                        Region = new double[] {
                            west, south,
                            east, north,
                            minheight, maxheight
                        }
                    },
                    Refine         = "ADD",
                    GeometricError = geometricError / 2.0,
                    Children       = tiles,
                    Transform      = transformArray
                }
            };


            allTileset.ResetGeometricErrors(); //TODO:

            var tilesetJsonPath = Path.Combine(outputFolder, "tileset.json");

            File.WriteAllText(tilesetJsonPath,
                              JsonConvert.SerializeObject(allTileset,
                                                          new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
                                    //,Formatting = Formatting.Indented
            }));
            return(tilesetJsonPath);
        }