diff --git a/src/b3dm.tileset/OctreeTiler.cs b/src/b3dm.tileset/OctreeTiler.cs index 2f0f41fc..8756356b 100644 --- a/src/b3dm.tileset/OctreeTiler.cs +++ b/src/b3dm.tileset/OctreeTiler.cs @@ -114,13 +114,20 @@ private HashSet CreateTileForLargestGeometries3D(BoundingBox3D bbox, int var file = $"{tilesetSettings.OutputSettings.ContentFolder}{Path.AltDirectorySeparatorChar}{tile.Level}_{tile.Z}_{tile.X}_{tile.Y}.glb"; TileCreationHelper.WriteTileIfNeeded(geometriesToProcess, tilesetSettings.Translation, stylingSettings, tilesetSettings.Copyright, tilingSettings.CreateGltf, tilingSettings.SkipCreateTiles, file, file); + + if (!tilingSettings.UseImplicitTiling) { + UpdateTileBoundingBox3D(tile, tileBounds, tileHashes, where); + } + tile.Available = true; } tiles.Add(tile); if (tileBounds != null) { var key = $"{tile.Level}_{tile.Z}_{tile.X}_{tile.Y}"; - tileBounds[key] = bbox; + if (!tileBounds.ContainsKey(key)) { + tileBounds[key] = bbox; + } } return localProcessedGeometries; @@ -128,6 +135,7 @@ private HashSet CreateTileForLargestGeometries3D(BoundingBox3D bbox, int private void CreateTile3D(BoundingBox3D bbox, int level, Tile3D tile, List tiles, Dictionary tileBounds, string where, HashSet processedGeometries) { + var tileHashes = new HashSet(); int target_srs = tilingSettings.KeepProjection ? inputTable.EPSGCode : 4978; var bbox1 = new double[] { bbox.XMin, bbox.YMin, bbox.XMax, bbox.YMax, bbox.ZMin, bbox.ZMax }; @@ -136,11 +144,17 @@ private void CreateTile3D(BoundingBox3D bbox, int level, Tile3D tile, List 0) { // Collect hashes of processed geometries foreach (var geom in geometries.Where(geom => !string.IsNullOrEmpty(geom.Hash))) { + tileHashes.Add(geom.Hash); processedGeometries.Add(geom.Hash); } var file = $"{tilesetSettings.OutputSettings.ContentFolder}{Path.AltDirectorySeparatorChar}{tile.Level}_{tile.Z}_{tile.X}_{tile.Y}.glb"; TileCreationHelper.WriteTileIfNeeded(geometries, tilesetSettings.Translation, stylingSettings, tilesetSettings.Copyright, tilingSettings.CreateGltf, tilingSettings.SkipCreateTiles, file, file); + + if (!tilingSettings.UseImplicitTiling) { + UpdateTileBoundingBox3D(tile, tileBounds, tileHashes, where); + } + tile.Available = true; } else { @@ -150,7 +164,23 @@ private void CreateTile3D(BoundingBox3D bbox, int level, Tile3D tile, List tileBounds, HashSet tileHashes, string where) + { + if (tileBounds == null || tileHashes.Count == 0) { + return; } + + // Update bounding box based on actual geometries in the tile + var bbox_geometries = GeometryRepository.GetGeometriesBoundingBox(conn, inputTable.TableName, inputTable.GeometryColumn, inputTable.EPSGCode, null, tileHashes, where, tilingSettings.KeepProjection); + var bbox3d = new BoundingBox3D(bbox_geometries[0], bbox_geometries[1], bbox_geometries[4], bbox_geometries[2], bbox_geometries[3], bbox_geometries[5]); + + var key = $"{tile.Level}_{tile.Z}_{tile.X}_{tile.Y}"; + tileBounds[key] = bbox3d; } }