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); }
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); }