From 688624aaadf470ed83d22712a9ac8f4b9f5448ae Mon Sep 17 00:00:00 2001 From: yooooger <761181201@qq.com> Date: Fri, 25 Jul 2025 10:24:47 +0800 Subject: [PATCH] yoooooger --- .vscode/settings.json | 5 + Ai_tottle/ai_tottle_api copy.py | 370 +++++ Ai_tottle/ai_tottle_api.py | 74 - Ai_tottle/temp.glb | Bin 0 -> 92956 bytes Ai_tottle/tiles copy.py | 234 +++ Ai_tottle/tiles.py | 643 +++++--- Ai_tottle/tileset_model2.json | 1 + Ai_tottle/tileset_model2_adjusted.json | 2000 ++++++++++++++++++++++++ 8 files changed, 3008 insertions(+), 319 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 Ai_tottle/ai_tottle_api copy.py create mode 100644 Ai_tottle/temp.glb create mode 100644 Ai_tottle/tiles copy.py create mode 100644 Ai_tottle/tileset_model2.json create mode 100644 Ai_tottle/tileset_model2_adjusted.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a8c2003 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "python-envs.defaultEnvManager": "ms-python.python:conda", + "python-envs.defaultPackageManager": "ms-python.python:conda", + "python-envs.pythonProjects": [] +} \ No newline at end of file diff --git a/Ai_tottle/ai_tottle_api copy.py b/Ai_tottle/ai_tottle_api copy.py new file mode 100644 index 0000000..12d14cd --- /dev/null +++ b/Ai_tottle/ai_tottle_api copy.py @@ -0,0 +1,370 @@ +from sanic import Sanic, json, Blueprint,response +from sanic.exceptions import Unauthorized +from sanic.response import json as json_response +from sanic_cors import CORS +import numpy as np +import logging +import uuid +import os,traceback +import asyncio +from ai_image import process_images # 你实现的图片处理函数 +from queue import Queue +from map_find import map_process_images +from yolo_train import auto_train +import torch +from yolo_photo import map_process_images_with_progress # 引入你的处理函数 +from tiles import TilesetProcessor +# 日志配置 +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +###################################################################################验证中间件和管理件############################################################################################## + +async def token_and_resource_check(request): + # --- Token 验证 --- + token = request.headers.get('X-API-Token') + expected_token = request.app.config.get("VALID_TOKEN") + if not token or token != expected_token: + logger.warning(f"Unauthorized request with token: {token}") + raise Unauthorized("Invalid token") + + # --- GPU 使用率检查 --- + try: + if torch.cuda.is_available(): + num_gpus = torch.cuda.device_count() + max_usage_ratio = request.app.config.get("MAX_GPU_USAGE", 0.9) # 默认90% + + for i in range(num_gpus): + used = torch.cuda.memory_reserved(i) + total = torch.cuda.max_memory_reserved(i) + ratio = used / total if total else 0 + + logger.info(f"GPU {i} Usage: {ratio:.2%}") + + if ratio > max_usage_ratio: + logger.warning(f"GPU {i} usage too high: {ratio:.2%}") + return json_response({ + "status": "error", + "message": f"GPU resource busy (GPU {i} at {ratio:.2%}). Try later." + }, status=503) + except Exception as e: + logger.error(f"GPU check failed: {e}") + + return None # 允许请求继续 + +################################################################################################################################################################################################## +#创建Sanic应用 +app = Sanic("ai_Service_v2") +CORS(app) # 允许跨域请求 +task_progress = {} + +@app.middleware("request") +async def global_middleware(request): + result = await token_and_resource_check(request) + if result: + return result + +# 配置Token和最大GPU使用率 +app.config.update({ + "VALID_TOKEN": "Beidou_b8609e96-bfec-4485-8c64-6d4f662ee44a", + "MAX_GPU_USAGE": 0.9 +}) + +######################################################################地图切割相关的API######################################################################################################## +#创建地图的蓝图 +map_tile_blueprint = Blueprint('map', url_prefix='/map/') +app.blueprint(map_tile_blueprint) + +# @map_tile_blueprint.post("/compare_tilesets") +# async def compare_tilesets(request): +# ''' +# 接口:/map/compare_tilesets +# 输入 JSON: +# { +# "tileset1": "path/to/tileset1/tileset.json", +# "tileset2": "path/to/tileset2/tileset.json", +# "bounds": [500000, 3000000, 500100, 3000100], +# "resolution": 1.0, +# "output": "results" +# } +# 输出 JSON: +# { +# "success": true, +# "message": "分析完成", +# "data": { +# "csv_path": "results/height_differences.csv", +# "heatmap_path": "results/height_difference_heatmap.png", +# "summary": { +# "mean": 0.28, +# "max": 1.10, +# "min": -0.85, +# "std": 0.23 +# } +# } +# } +# ''' +# try: +# body = request.json + +# # 参数提取与验证 +# tileset1 = body.get("tileset1") +# tileset2 = body.get("tileset2") +# bounds = body.get("bounds") +# resolution = body.get("resolution", 1.0) +# output = body.get("output", "results") + +# if not all([tileset1, tileset2, bounds]): +# return response.json({"success": False, "message": "参数不完整"}, status=400) + +# processor = TilesetProcessor(tileset1, tileset2, resolution) + +# if not processor.set_analysis_area(bounds): +# return response.json({"success": False, "message": "设置分析区域失败"}, status=400) + +# if not processor.sample_heights(): +# return response.json({"success": False, "message": "高度采样失败"}, status=500) + +# processor.export_results(output) + +# # 汇总统计结果 +# valid_differences = processor.height_difference_grid[~np.isnan(processor.height_difference_grid)] +# summary = { +# "mean": float(np.mean(valid_differences)), +# "max": float(np.max(valid_differences)), +# "min": float(np.min(valid_differences)), +# "std": float(np.std(valid_differences)) +# } + +# return response.json({ +# "success": True, +# "message": "分析完成", +# "data": { +# "csv_path": os.path.join(output, "height_differences.csv"), +# "heatmap_path": os.path.join(output, "height_difference_heatmap.png"), +# "summary": summary +# } +# }) + +# except Exception as e: +# traceback.print_exc() +# return response.json({"success": False, "message": str(e)}, status=500) + +#语义识别 +@map_tile_blueprint.post("/uav") +async def process_handler(request): + """ + 接口:/map/uav + 输入 JSON: + { + "urls": [ + "http://example.com/img1.jpg", + "http://example.com/img2.jpg" + ], + "yaml_name": "config", + "bucket_name": "300bdf2b-a150-406e-be63-d28bd29b409f", + "bucket_directory": "2025/seg" + "model_path": "deeplabv3plus_best.pth" + } + 输出 JSON: + { + "code": 200, + "msg": "success", + "data": [ + "http://minio.example.com/uav-results/2025/seg/result1.png", + "http://minio.example.com/uav-results/2025/seg/result2.png" + ] + } + + """ + try: + body = request.json + urls = body.get("urls", []) + yaml_name = body.get("yaml_name") + bucket_name = body.get("bucket_name") + bucket_directory = body.get("bucket_directory") + model_path = os.path.join("map", "checkpoints", body.get("model_path")) + + # 校验参数 + if not urls or not isinstance(urls, list): + return json({"code": 400, "msg": "Missing or invalid 'urls'"}) + if not all([yaml_name, bucket_name, bucket_directory]): + return json({"code": 400, "msg": "Missing required parameters"}) + + # 调用图像处理函数 + result = map_process_images(urls, yaml_name, bucket_name, bucket_directory,model_path) + return json(result) + + except Exception as e: + return json({"code": 500, "msg": f"Server error: {str(e)}"}) + +######################################################################yolo相关的API######################################################################################################## +#创建yolo的蓝图 +yolo_tile_blueprint = Blueprint('yolo', url_prefix='/yolo/') +app.blueprint(yolo_tile_blueprint) + +# YOLO URL APT +# 存储任务进度和结果(内存示例,可用 Redis 或 DB 持久化) + +@yolo_tile_blueprint.post("/process_images") +async def process_images(request): + """ + { + "urls": [ + "http://example.com/image1.jpg", + "http://example.com/image2.jpg", + "http://example.com/image3.jpg" + ], + "yaml_name": "your_minio_config", + "bucket_name": "my-bucket", + "bucket_directory": "2025/uav-results", + "model_path": "deeplabv3plus_best.pth" +} + """ + data = request.json + urls = data.get("urls") + yaml_name = data.get("yaml_name") + bucket_name = data.get("bucket_name") + bucket_directory = data.get("bucket_directory") + uav_model_path = data.get("uav_model_path") + + if not urls or not yaml_name or not bucket_name or not uav_model_path: + return response.json({"code": 400, "msg": "Missing parameters"}, status=400) + + task_id = str(uuid.uuid4()) + task_progress[task_id] = {"status": "pending", "progress": 0, "result": None} + + # 启动后台任务 + asyncio.create_task(run_image_processing(task_id, urls, yaml_name, bucket_name, bucket_directory, uav_model_path)) + + return response.json({"code": 200, "msg": "Task started", "task_id": task_id}) + +@yolo_tile_blueprint.get("/task_status/") +async def task_status(request, task_id): + progress = task_progress.get(task_id) + if not progress: + return response.json({"code": 404, "msg": "Task not found"}, status=404) + return response.json({"code": 200, "msg": "Task status", "data": progress}) + +async def run_image_processing(task_id, urls, yaml_name, bucket_name, bucket_directory, uav_model_path): + + + try: + task_progress[task_id]["status"] = "running" + task_progress[task_id]["progress"] = 10 # 开始进度 + + # 下载、推理、上传阶段分别更新进度 + def progress_callback(stage, percent): + task_progress[task_id]["status"] = stage + task_progress[task_id]["progress"] = percent + + result = await asyncio.to_thread( + map_process_images_with_progress, + urls, yaml_name, bucket_name, bucket_directory, uav_model_path, progress_callback + ) + + task_progress[task_id]["status"] = "completed" + task_progress[task_id]["progress"] = 100 + task_progress[task_id]["result"] = result + + except Exception as e: + task_progress[task_id]["status"] = "failed" + task_progress[task_id]["progress"] = 100 + task_progress[task_id]["result"] = str(e) + +# YOLO检测API +@yolo_tile_blueprint.post("/picture") +async def yolo_detect_api(request): + try: + + detect_data = request.json + + # 解析必要字段 + image_list = detect_data.get("image_list") + yolo_model = detect_data.get("yolo_model", "best.pt") + class_filter = detect_data.get("class", None) + minio_info = detect_data.get("minio", None) + + if not image_list: + return json_response({"status": "error", "message": "image_list is required"}, status=400) + + if not minio_info: + return json_response({"status": "error", "message": "MinIO information is required"}, status=400) + + # 创建临时文件夹 + input_folder = f"./temp_input_{str(uuid.uuid4())}" + output_folder = f"./temp_output_{str(uuid.uuid4())}" + + # 执行图像处理 + result = await asyncio.to_thread( + process_images, + yolo_model=yolo_model, + image_list=image_list, + class_filter=class_filter, + input_folder=input_folder, + output_folder=output_folder, + minio_info=minio_info + ) + + # 返回处理结果 + return json_response(result) + + except Exception as e: + logger.error(f"Error occurred while processing request: {str(e)}", exc_info=True) + return json_response({ + "status": "error", + "message": f"Internal server error: {str(e)}" + }, status=500) + +# YOLO自动训练 +@yolo_tile_blueprint.post("/train") +async def yolo_train_api(request): + """ + 自动训练模型 + 输入 JSON: + { + "db_host": str, + "db_database": str, + "db_user": str, + "db_password": str, + "db_port": int, + "model_id": int, + "img_path": str, + "label_path": str, + "new_path": str, + "split_list": List[float], + "class_names": Optional[List[str]], + "project_name": str + } + 输出 JSON: + { + "base_metrics": Dict[str, float], + "best_model_path": str, + "final_metrics": Dict[str, float] + } + + """ + try: + # 修改为直接访问 request.json 而不是调用它 + data = request.json + + + if not data: + return json_response({"status": "error", "message": "data is required"}, status=400) + + # 执行图像处理 + result = await asyncio.to_thread( + auto_train, + data + ) + # 返回处理结果 + return json_response(result) + + except Exception as e: + logger.error(f"Error occurred while processing request: {str(e)}", exc_info=True) + return json_response({ + "status": "error", + "message": f"Internal server error: {str(e)}" + }, status=500) + +if __name__ == '__main__': + app.run(host="0.0.0.0", port=12366, debug=True,workers=1) diff --git a/Ai_tottle/ai_tottle_api.py b/Ai_tottle/ai_tottle_api.py index ed733fb..a86b9d4 100644 --- a/Ai_tottle/ai_tottle_api.py +++ b/Ai_tottle/ai_tottle_api.py @@ -75,80 +75,6 @@ app.config.update({ map_tile_blueprint = Blueprint('map', url_prefix='/map/') app.blueprint(map_tile_blueprint) -@map_tile_blueprint.post("/compare_tilesets") -async def compare_tilesets(request): - ''' - 接口:/map/compare_tilesets - 输入 JSON: - { - "tileset1": "path/to/tileset1/tileset.json", - "tileset2": "path/to/tileset2/tileset.json", - "bounds": [500000, 3000000, 500100, 3000100], - "resolution": 1.0, - "output": "results" - } - 输出 JSON: - { - "success": true, - "message": "分析完成", - "data": { - "csv_path": "results/height_differences.csv", - "heatmap_path": "results/height_difference_heatmap.png", - "summary": { - "mean": 0.28, - "max": 1.10, - "min": -0.85, - "std": 0.23 - } - } - } - ''' - try: - body = request.json - - # 参数提取与验证 - tileset1 = body.get("tileset1") - tileset2 = body.get("tileset2") - bounds = body.get("bounds") - resolution = body.get("resolution", 1.0) - output = body.get("output", "results") - - if not all([tileset1, tileset2, bounds]): - return response.json({"success": False, "message": "参数不完整"}, status=400) - - processor = TilesetProcessor(tileset1, tileset2, resolution) - - if not processor.set_analysis_area(bounds): - return response.json({"success": False, "message": "设置分析区域失败"}, status=400) - - if not processor.sample_heights(): - return response.json({"success": False, "message": "高度采样失败"}, status=500) - - processor.export_results(output) - - # 汇总统计结果 - valid_differences = processor.height_difference_grid[~np.isnan(processor.height_difference_grid)] - summary = { - "mean": float(np.mean(valid_differences)), - "max": float(np.max(valid_differences)), - "min": float(np.min(valid_differences)), - "std": float(np.std(valid_differences)) - } - - return response.json({ - "success": True, - "message": "分析完成", - "data": { - "csv_path": os.path.join(output, "height_differences.csv"), - "heatmap_path": os.path.join(output, "height_difference_heatmap.png"), - "summary": summary - } - }) - - except Exception as e: - traceback.print_exc() - return response.json({"success": False, "message": str(e)}, status=500) - #语义识别 @map_tile_blueprint.post("/uav") async def process_handler(request): diff --git a/Ai_tottle/temp.glb b/Ai_tottle/temp.glb new file mode 100644 index 0000000000000000000000000000000000000000..a60447e7cd53d6fb8b2bfd7d397474970b8dfef2 GIT binary patch literal 92956 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 literal 0 HcmV?d00001 diff --git a/Ai_tottle/tiles copy.py b/Ai_tottle/tiles copy.py new file mode 100644 index 0000000..7aedeab --- /dev/null +++ b/Ai_tottle/tiles copy.py @@ -0,0 +1,234 @@ +import os +import logging +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +from matplotlib.colors import LinearSegmentedColormap +from shapely.geometry import Polygon, Point +from tqdm import tqdm +from py3dtiles.tileset import TileSet +import requests + +# 日志配置 +logger = logging.getLogger("TilesetProcessor") +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + + +class TilesetProcessor: + """3D Tiles数据集处理器,用于加载、分析和比较两个3D Tiles模型""" + + def __init__(self, tileset_path1, tileset_path2, resolution=1.0, polygon_points=None): + self.tileset1 = self._load_tileset(tileset_path1) + self.tileset2 = self._load_tileset(tileset_path2) + self.resolution = resolution + self.analysis_area = None + self.height_difference_grid = None + self.grid_bounds = None + + if polygon_points: + self.set_analysis_area(polygon_points=polygon_points) + + def _load_tileset(self, path_or_url): + try: + logger.info(f"加载3D Tiles数据集: {path_or_url}") + if path_or_url.startswith("http://") or path_or_url.startswith("https://"): + resp = requests.get(path_or_url) + resp.raise_for_status() + tileset_json = resp.json() + tileset = TileSet.from_dict(tileset_json) + else: + tileset = TileSet.from_file(path_or_url) + logger.info(f"成功加载,包含 {len(tileset.root.children)} 个根瓦片") + return tileset + except Exception as e: + logger.error(f"加载数据集失败(路径: {path_or_url}): {e}") + raise + + def set_analysis_area(self, bounds=None, polygon_points=None): + if polygon_points: + self.analysis_area = Polygon(polygon_points) + min_x = min(p[0] for p in polygon_points) + min_y = min(p[1] for p in polygon_points) + max_x = max(p[0] for p in polygon_points) + max_y = max(p[1] for p in polygon_points) + self.grid_bounds = (min_x, min_y, max_x, max_y) + logger.info(f"设置多边形分析区域: {polygon_points}") + elif bounds: + min_x, min_y, max_x, max_y = bounds + self.analysis_area = Polygon([ + (min_x, min_y), + (max_x, min_y), + (max_x, max_y), + (min_x, max_y) + ]) + self.grid_bounds = bounds + logger.info(f"设置矩形分析区域: {bounds}") + else: + logger.error("请提供 bounds 或 polygon_points") + return False + + logger.info(f"分析区域面积: {self.analysis_area.area:.2f} 平方米") + return True + + def sample_heights(self): + if self.analysis_area is None: + logger.error("请先设置分析区域") + return False + + logger.info("开始在分析区域内采样高度值...") + + min_x, min_y, max_x, max_y = self.grid_bounds + rows = int((max_y - min_y) / self.resolution) + 1 + cols = int((max_x - min_x) / self.resolution) + 1 + + self.height_difference_grid = np.full((rows, cols), np.nan, dtype=np.float32) + + total_points = rows * cols + logger.info(f"创建了 {rows}x{cols}={total_points} 个采样点") + + with tqdm(total=total_points, desc="采样高度点") as pbar: + for i in range(rows): + for j in range(cols): + x = min_x + j * self.resolution + y = min_y + i * self.resolution + point = Point(x, y) + + if not self.analysis_area.contains(point): + pbar.update(1) + continue + + height1 = self._sample_height_at_point(self.tileset1, x, y) + height2 = self._sample_height_at_point(self.tileset2, x, y) + + if height1 is not None and height2 is not None: + self.height_difference_grid[i, j] = height2 - height1 + + pbar.update(1) + + valid_differences = self.height_difference_grid[~np.isnan(self.height_difference_grid)] + if len(valid_differences) > 0: + logger.info("高度变化统计:") + logger.info(f" 平均变化: {np.mean(valid_differences):.2f}m") + logger.info(f" 最大上升: {np.max(valid_differences):.2f}m") + logger.info(f" 最大下降: {np.min(valid_differences):.2f}m") + logger.info(f" 变化标准差: {np.std(valid_differences):.2f}m") + else: + logger.warning("未找到有效的高度差异数据") + + return True + + def _sample_height_at_point(self, tileset, x, y, max_depth=3): + def find_tile(tile, depth=0): + bbox = tile.bounding_volume.box + min_x_tile = bbox[0] - bbox[3] + max_x_tile = bbox[0] + bbox[3] + min_y_tile = bbox[1] - bbox[4] + max_y_tile = bbox[1] + bbox[4] + + if not (min_x_tile <= x <= max_x_tile and min_y_tile <= y <= max_y_tile): + return None + + if (tile.content is not None and depth >= max_depth) or not tile.children: + return tile + + for child in tile.children: + result = find_tile(child, depth + 1) + if result is not None: + return result + + return None + + tile = find_tile(tileset.root) + if tile is None or tile.content is None: + return None + + try: + # 简化模拟返回瓦片中心高度加随机偏移 + return tile.bounding_volume.box[2] + np.random.uniform(-0.5, 0.5) + except Exception as e: + logger.warning(f"获取瓦片高度失败: {e}") + return None + + def export_results(self, output_dir="results"): + if self.height_difference_grid is None: + logger.error("请先采样高度值") + return + + os.makedirs(output_dir, exist_ok=True) + + csv_path = os.path.join(output_dir, "height_differences.csv") + logger.info(f"导出CSV文件: {csv_path}") + + min_x, min_y, max_x, max_y = self.grid_bounds + rows, cols = self.height_difference_grid.shape + + data = [] + for i in range(rows): + for j in range(cols): + if not np.isnan(self.height_difference_grid[i, j]): + x = min_x + j * self.resolution + y = min_y + i * self.resolution + data.append({ + 'x': x, + 'y': y, + 'height_difference': self.height_difference_grid[i, j] + }) + + df = pd.DataFrame(data) + df.to_csv(csv_path, index=False) + + self._generate_heatmap(output_dir) + + logger.info(f"结果已导出到 {output_dir} 目录") + + def _generate_heatmap(self, output_dir): + colors = [(0.0, 0.0, 1.0), (1.0, 1.0, 1.0), (1.0, 0.0, 0.0)] + cmap = LinearSegmentedColormap.from_list('height_diff_cmap', colors, N=256) + + data = self.height_difference_grid.copy() + valid_mask = ~np.isnan(data) + + if not np.any(valid_mask): + logger.warning("没有有效的高度差异数据,无法生成热图") + return + + data[~valid_mask] = 0 + + plt.figure(figsize=(12, 10)) + plt.imshow(data, cmap=cmap, origin='lower', + extent=[self.grid_bounds[0], self.grid_bounds[2], + self.grid_bounds[1], self.grid_bounds[3]], + alpha=0.9) + + cbar = plt.colorbar() + cbar.set_label('高度变化 (米)', fontsize=12) + + plt.title('两个3D Tiles模型的高度变化分布', fontsize=16) + plt.xlabel('X坐标 (米)', fontsize=12) + plt.ylabel('Y坐标 (米)', fontsize=12) + + heatmap_path = os.path.join(output_dir, "height_difference_heatmap.png") + plt.savefig(heatmap_path, dpi=300, bbox_inches='tight') + plt.close() + + logger.info(f"热图已保存到: {heatmap_path}") + + +if __name__ == "__main__": + tileset1_url = "http://8.137.54.85:9000/300bdf2b-a150-406e-be63-d28bd29b409f/dszh/1748398014403562192_OUT/B3DM/tileset.json" + tileset2_url = "http://8.137.54.85:9000/300bdf2b-a150-406e-be63-d28bd29b409f/dszh/1748325943733189898_OUT/B3DM/tileset.json" + polygon_coords = [ + (102.2232, 29.3841), + (102.2261, 29.3845), + (102.2263, 29.3821), + (102.2231, 29.3818) + ] + resolution = 0.5 + output_dir = "output_results" + + processor = TilesetProcessor(tileset1_url, tileset2_url, resolution, polygon_coords) + if processor.sample_heights(): + processor.export_results(output_dir) + print("分析完成!结果已导出到指定目录。") + else: + print("高度采样失败,无法完成分析。") diff --git a/Ai_tottle/tiles.py b/Ai_tottle/tiles.py index 1584373..f6ceba0 100644 --- a/Ai_tottle/tiles.py +++ b/Ai_tottle/tiles.py @@ -1,265 +1,418 @@ import os +import requests import numpy as np -import pandas as pd -import py3dtiles -from py3dtiles import Tileset, BoundingVolumeBox +from py3dtiles.tileset.content import B3dm +from pyproj import Proj, Transformer from shapely.geometry import Polygon, Point -import matplotlib.pyplot as plt -from matplotlib.colors import LinearSegmentedColormap -import argparse -from tqdm import tqdm -import logging +from shapely.ops import unary_union +import math +from urllib.parse import urljoin +from pygltflib import GLTF2 -# 配置日志 -logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') -logger = logging.getLogger(__name__) +# 目标区域经纬度坐标(转换为多边形) +region_coords = [ + [102.22321717600258, 29.384100779345513], + [102.22612442019208, 29.384506810595088], + [102.22638603372953, 29.382061071072794], + [102.22311237980807, 29.38186133280733], + [102.22321717600258, 29.384100779345513] # 闭合多边形 +] -class TilesetProcessor: - """3D Tiles数据集处理器,用于加载、分析和比较两个3D Tiles模型""" +# 创建多边形对象 +region_polygon = Polygon(region_coords) + +# 两个3D Tiles模型的URL +tileset_urls = [ + "http://8.137.54.85:9000/300bdf2b-a150-406e-be63-d28bd29b409f/dszh/1748398014403562192_OUT/B3DM/tileset.json", + "http://8.137.54.85:9000/300bdf2b-a150-406e-be63-d28bd29b409f/dszh/1748325943733189898_OUT/B3DM/tileset.json" +] + +# 坐标系转换 +wgs84 = Proj(init='epsg:4326') # WGS84经纬度 +web_mercator = Proj(init='epsg:3857') # Web墨卡托投影 + +def adjust_z_in_transform(tileset_path, output_path=None, delta_z=0): + import json + import numpy as np + + if not os.path.exists(tileset_path): + print(f"❌ tileset.json 文件不存在: {tileset_path}") + return + + with open(tileset_path, 'r', encoding='utf-8') as f: + data = json.load(f) + + root = data.get('root', {}) + + # 插入默认 transform + if 'transform' not in root: + print("⚠️ 未找到 transform 字段,使用单位矩阵") + root['transform'] = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ] + + transform = np.array(root['transform']).reshape(4, 4) + print(f"原始 Z 平移: {transform[3, 2]}") + transform[3, 2] += delta_z + print(f"修正后 Z 平移: {transform[3, 2]}") + + root['transform'] = transform.flatten().tolist() + data['root'] = root + + if output_path is None: + output_path = tileset_path.replace(".json", f"_adjusted_z{int(delta_z)}.json") + + with open(output_path, 'w', encoding='utf-8') as f: + json.dump(data, f, indent=2) + + print(f"✅ 高度调整完成,输出文件: {output_path}") + +def download_tileset(tileset_url): + """下载tileset.json数据""" + try: + response = requests.get(tileset_url) + response.raise_for_status() + return response.json() + except Exception as e: + print(f"下载tileset失败: {e}") + return None + +def extract_vertices(gltf_bytes): + try: + with open("temp.glb", "wb") as f: + f.write(gltf_bytes) + + gltf = GLTF2().load("temp.glb") + + for mesh in gltf.meshes: + for primitive in mesh.primitives: + if not hasattr(primitive.attributes, "POSITION"): + continue + + accessor_idx = primitive.attributes.POSITION + accessor = gltf.accessors[accessor_idx] + buffer_view = gltf.bufferViews[accessor.bufferView] + buffer = gltf.buffers[buffer_view.buffer] + + byte_offset = (buffer_view.byteOffset or 0) + (accessor.byteOffset or 0) + byte_length = accessor.count * 3 * 4 # 3 floats per vertex + + data_bytes = gltf.binary_blob()[byte_offset: byte_offset + byte_length] + vertices = np.frombuffer(data_bytes, dtype=np.float32).reshape((accessor.count, 3)) + + return vertices + + except Exception as e: + print(f"提取顶点数据失败: {e}") + + return np.array([]) + +def find_closest_vertex(vertices, lon, lat): + """找到离目标点最近的顶点""" + if not vertices: + return None - def __init__(self, tileset_path1, tileset_path2, resolution=1.0): - """ - 初始化处理器 - - 参数: - tileset_path1: 第一个3D Tiles数据集路径 - tileset_path2: 第二个3D Tiles数据集路径 - resolution: 分析网格的分辨率(米) - """ - self.tileset1 = self._load_tileset(tileset_path1) - self.tileset2 = self._load_tileset(tileset_path2) - self.resolution = resolution - self.analysis_area = None - self.height_difference_grid = None - self.grid_bounds = None - - def _load_tileset(self, path): - """加载3D Tiles数据集""" - try: - logger.info(f"加载3D Tiles数据集: {path}") - tileset = Tileset.from_file(path) - logger.info(f"成功加载,包含 {len(tileset.root.children)} 个根瓦片") - return tileset - except Exception as e: - logger.error(f"加载数据集失败: {e}") - raise + # 计算距离并找到最近的顶点 + min_distance = float('inf') + closest_vertex = None - def set_analysis_area(self, bounds): - """ - 设置分析区域 - - 参数: - bounds: 分析区域边界元组 (min_x, min_y, max_x, max_y) - """ - min_x, min_y, max_x, max_y = bounds - self.analysis_area = Polygon([ - (min_x, min_y), - (max_x, min_y), - (max_x, max_y), - (min_x, max_y) - ]) - self.grid_bounds = bounds - logger.info(f"设置分析区域: {bounds}") - logger.info(f"分析区域面积: {self.analysis_area.area:.2f} 平方米") - return True + for vertex in vertices: + v_lon, v_lat, v_z = vertex + # 计算经纬度距离(简化为平面距离) + distance = math.hypot(v_lon - lon, v_lat - lat) + if distance < min_distance: + min_distance = distance + closest_vertex = vertex - def sample_heights(self): - """在分析区域内采样两个模型的高度值并计算差异""" - if self.analysis_area is None: - logger.error("请先设置分析区域") - return False + return closest_vertex + +def compare_heights(heights1, heights2, tolerance=0.5): + """比较两个高度数据集,找出差异""" + # 找到所有点的并集 + all_points = set(heights1.keys()).union(set(heights2.keys())) + differences = [] + + for point in all_points: + h1 = heights1.get(point, None) + h2 = heights2.get(point, None) - logger.info("开始在分析区域内采样高度值...") - - # 创建网格 - min_x, min_y, max_x, max_y = self.grid_bounds - rows = int((max_y - min_y) / self.resolution) + 1 - cols = int((max_x - min_x) / self.resolution) + 1 - - # 初始化高度差异网格 - self.height_difference_grid = np.zeros((rows, cols), dtype=np.float32) - self.height_difference_grid[:] = np.nan # 初始化为NaN,表示未采样 - - # 对每个网格点进行采样 - total_points = rows * cols - logger.info(f"创建了 {rows}x{cols}={total_points} 个采样点") - - with tqdm(total=total_points, desc="采样高度点") as pbar: - for i in range(rows): - for j in range(cols): - # 计算当前点的坐标 - x = min_x + j * self.resolution - y = min_y + i * self.resolution - point = Point(x, y) - - # 检查点是否在分析区域内 - if not self.analysis_area.contains(point): - pbar.update(1) - continue - - # 采样两个模型的高度 - height1 = self._sample_height_at_point(self.tileset1, x, y) - height2 = self._sample_height_at_point(self.tileset2, x, y) - - # 计算高度差异 - if height1 is not None and height2 is not None: - self.height_difference_grid[i, j] = height2 - height1 - - pbar.update(1) - - # 统计结果 - valid_differences = self.height_difference_grid[~np.isnan(self.height_difference_grid)] - if len(valid_differences) > 0: - logger.info(f"高度变化统计:") - logger.info(f" 平均变化: {np.mean(valid_differences):.2f}m") - logger.info(f" 最大上升: {np.max(valid_differences):.2f}m") - logger.info(f" 最大下降: {np.min(valid_differences):.2f}m") - logger.info(f" 变化标准差: {np.std(valid_differences):.2f}m") + # 检查是否有一个模型在该点没有数据 + if h1 is None or h2 is None: + differences.append({ + 'point': point, + 'height1': h1, + 'height2': h2, + 'difference': None, + 'type': 'missing_data' + }) else: - logger.warning("未找到有效的高度差异数据") - - return True + # 检查高度差异是否超过容忍度 + diff = abs(h1 - h2) + if diff > tolerance: + differences.append({ + 'point': point, + 'height1': h1, + 'height2': h2, + 'difference': diff, + 'type': 'height_difference' + }) - def _sample_height_at_point(self, tileset, x, y, max_depth=3): - """在指定点采样3D Tiles模型的高度值""" - # 找到包含该点的瓦片 - def find_tile(tile, depth=0): - # 检查点是否在瓦片边界框内 - bbox = tile.bounding_volume.box - min_x_tile = bbox[0] - bbox[3] - max_x_tile = bbox[0] + bbox[3] - min_y_tile = bbox[1] - bbox[4] - max_y_tile = bbox[1] + bbox[4] - - if not (min_x_tile <= x <= max_x_tile and min_y_tile <= y <= max_y_tile): - return None - - # 如果瓦片有内容且深度足够,或者没有子瓦片,就使用这个瓦片 - if (tile.content is not None and depth >= max_depth) or not tile.children: - return tile - - # 否则递归查找子瓦片 - for child in tile.children: - result = find_tile(child, depth + 1) - if result is not None: - return result - + return differences + +def get_b3dm_from_tile_json(json_url): + try: + response = requests.get(json_url) + response.raise_for_status() + data = response.json() + + # 递归查找 b3dm uri + def find_b3dm_uri(node): + if 'content' in node and 'uri' in node['content']: + uri = node['content']['uri'] + if uri.endswith('.b3dm'): + return uri + if 'children' in node: + for child in node['children']: + result = find_b3dm_uri(child) + if result: + return result return None - - # 找到包含该点的最详细瓦片 - tile = find_tile(tileset.root) - if tile is None or tile.content is None: + + root = data.get('root', {}) + b3dm_uri = find_b3dm_uri(root) + if not b3dm_uri: + print(f"{json_url} 中找不到 content.uri") return None - - # 从瓦片内容中获取高度 + + base_url = os.path.dirname(json_url) + full_b3dm_url = urljoin(base_url + '/', b3dm_uri) + return full_b3dm_url + + except Exception as e: + print(f"解析 JSON {json_url} 时出错: {e}") + return None + + +def get_heights_in_region(tileset_url, sample_density=10): + """获取区域内的高度数据""" + tileset_json = download_tileset(tileset_url) + if not tileset_json: + return {} + + tiles_in_region = get_tiles_in_region(tileset_json, tileset_url) + if not tiles_in_region: + print(f"在{tileset_url}中未找到区域内的瓦片") + return {} + + min_lon, min_lat = min(p[0] for p in region_coords), min(p[1] for p in region_coords) + max_lon, max_lat = max(p[0] for p in region_coords), max(p[1] for p in region_coords) + lon_steps = np.linspace(min_lon, max_lon, sample_density) + lat_steps = np.linspace(min_lat, max_lat, sample_density) + + heights = {} + + for tile_info in tiles_in_region: try: - # 这里是简化的模拟实现,实际应该解析瓦片内容 - # 例如,使用py3dtiles中的TileContent.get_vertices()获取顶点 - # 然后找到最近的顶点或三角形来计算高度 - # 这里为了示例,我们返回瓦片中心的高度加上一个随机偏移 - return tile.bounding_volume.box[2] + np.random.uniform(-0.5, 0.5) + response = requests.get(tile_info['url']) + response.raise_for_status() + b3dm_data = response.content + + # ✅ 尝试解析为 b3dm + try: + gltf_bytes = parse_b3dm(b3dm_data) + except Exception: + # 可能 tile_info['url'] 是 JSON,不是真 b3dm + print(f"尝试从 {tile_info['url']} 获取真实 b3dm 地址...") + actual_b3dm_url = get_b3dm_from_tile_json(tile_info['url']) + if not actual_b3dm_url: + print(f"跳过:无法从 {tile_info['url']} 获取有效 b3dm") + continue + response = requests.get(actual_b3dm_url) + response.raise_for_status() + b3dm_data = response.content + gltf_bytes = parse_b3dm(b3dm_data) + + # ✅ 模拟解析 glb + vertices = extract_vertices(gltf_bytes) + if not vertices.size: + continue + + # ✅ 应用变换 + transformed_vertices = [transform_point(v, tile_info['transform']) for v in vertices] + transformer = Transformer.from_crs("EPSG:3857", "EPSG:4326", always_xy=True) + wgs84_vertices = [] + for x, y, z in transformed_vertices: + lon, lat = transformer.transform(x, y) + wgs84_vertices.append((lon, lat, z)) + + for lon in lon_steps: + for lat in lat_steps: + if point_in_region(lon, lat): + closest_vertex = find_closest_vertex(wgs84_vertices, lon, lat) + if closest_vertex: + key = (round(lon, 6), round(lat, 6)) + heights[key] = closest_vertex[2] + except Exception as e: - logger.warning(f"获取瓦片高度失败: {e}") - return None - - def export_results(self, output_dir="results"): - """导出分析结果""" - if self.height_difference_grid is None: - logger.error("请先采样高度值") - return - - os.makedirs(output_dir, exist_ok=True) - - # 导出CSV文件 - csv_path = os.path.join(output_dir, "height_differences.csv") - logger.info(f"导出CSV文件: {csv_path}") - - # 创建DataFrame - min_x, min_y, max_x, max_y = self.grid_bounds - rows, cols = self.height_difference_grid.shape - - data = [] - for i in range(rows): - for j in range(cols): - if not np.isnan(self.height_difference_grid[i, j]): - x = min_x + j * self.resolution - y = min_y + i * self.resolution - data.append({ - 'x': x, - 'y': y, - 'height_difference': self.height_difference_grid[i, j] - }) - - df = pd.DataFrame(data) - df.to_csv(csv_path, index=False) - - # 生成热图 - self._generate_heatmap(output_dir) - - logger.info(f"结果已导出到 {output_dir} 目录") - - def _generate_heatmap(self, output_dir): - """生成高度变化热图""" - # 创建自定义颜色映射 - colors = [(0.0, 0.0, 1.0), (1.0, 1.0, 1.0), (1.0, 0.0, 0.0)] # 蓝-白-红 - cmap = LinearSegmentedColormap.from_list('height_diff_cmap', colors, N=256) - - # 准备数据 - data = self.height_difference_grid.copy() - valid_mask = ~np.isnan(data) - - if not np.any(valid_mask): - logger.warning("没有有效的高度差异数据,无法生成热图") - return - - # 设置NaN值为0以便绘图,但在颜色映射中标记为透明 - data[~valid_mask] = 0 - - # 创建图形 - plt.figure(figsize=(12, 10)) - plt.imshow(data, cmap=cmap, origin='lower', - extent=[self.grid_bounds[0], self.grid_bounds[2], - self.grid_bounds[1], self.grid_bounds[3]], - alpha=0.9) - - # 添加颜色条 - cbar = plt.colorbar() - cbar.set_label('高度变化 (米)', fontsize=12) - - # 设置标题和坐标轴 - plt.title('两个3D Tiles模型的高度变化分布', fontsize=16) - plt.xlabel('X坐标 (米)', fontsize=12) - plt.ylabel('Y坐标 (米)', fontsize=12) - - # 保存图形 - heatmap_path = os.path.join(output_dir, "height_difference_heatmap.png") - plt.savefig(heatmap_path, dpi=300, bbox_inches='tight') - plt.close() - - logger.info(f"热图已保存到: {heatmap_path}") + print(f"处理瓦片 {tile_info['url']} 时出错: {e}") + continue + + return heights + +def get_tiles_in_region(tileset_json, tileset_base_url): + """获取区域内的所有瓦片""" + tiles_in_region = [] + + # 去除 tileset.json 得到根路径 + tileset_root_url = tileset_base_url.rsplit('/', 1)[0] + + def recursive_search(tile, parent_transform=None): + tile_transform = tile.get('transform', [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]) + combined_transform = multiply_matrices(parent_transform, tile_transform) if parent_transform else tile_transform + + if 'boundingVolume' in tile and is_bounding_volume_intersects_region(tile['boundingVolume']): + if 'content' in tile and 'uri' in tile['content']: + # 修复URL拼接 + tile_url = urljoin(tileset_root_url + '/', tile['content']['uri']) + tiles_in_region.append({ + 'url': tile_url, + 'transform': combined_transform + }) + + if 'children' in tile: + for child in tile['children']: + recursive_search(child, combined_transform) + + if 'root' in tileset_json: + recursive_search(tileset_json['root']) + + return tiles_in_region + +def is_bounding_volume_intersects_region(bounding_volume): + """检查边界体是否与区域相交""" + # 简化实现,实际需要根据不同边界体类型实现 + if 'region' in bounding_volume: + # region格式: [west, south, east, north, minHeight, maxHeight] + region = bounding_volume['region'] + bv_polygon = Polygon([ + [region[0], region[1]], + [region[2], region[1]], + [region[2], region[3]], + [region[0], region[3]], + [region[0], region[1]] + ]) + return region_polygon.intersects(bv_polygon) + elif 'box' in bounding_volume: + # 对于box类型,需要转换到经纬度后再判断 + # 这里简化处理,返回True让更细致的检查在后续进行 + return True + elif 'sphere' in bounding_volume: + # 对于sphere类型,简化处理 + return True + return False + +def multiply_matrices(a, b): + """计算两个4x4矩阵的乘积""" + result = [0.0] * 16 + for i in range(4): + for j in range(4): + result[i*4 + j] = a[i*4 + 0] * b[0*4 + j] + \ + a[i*4 + 1] * b[1*4 + j] + \ + a[i*4 + 2] * b[2*4 + j] + \ + a[i*4 + 3] * b[3*4 + j] + return result + +def parse_b3dm(b3dm_data: bytes): + """ + 解析 b3dm 文件,返回 glb 二进制数据 + """ + import struct + + if b3dm_data[:4] != b'b3dm': + raise ValueError("不是有效的 b3dm 文件") + + # 读取 header(28 字节) + header = struct.unpack('<4sIIIIII', b3dm_data[:28]) + _, version, byte_length, ft_json_len, ft_bin_len, bt_json_len, bt_bin_len = header + + glb_start = 28 + ft_json_len + ft_bin_len + bt_json_len + bt_bin_len + glb_bytes = b3dm_data[glb_start:] + + return glb_bytes + +def point_in_region(lon, lat): + """判断点是否在目标区域内""" + return region_polygon.contains(Point(lon, lat)) + +def transform_point(point, matrix): + """应用变换矩阵到点""" + x, y, z = point + x_out = x * matrix[0] + y * matrix[4] + z * matrix[8] + matrix[12] + y_out = x * matrix[1] + y * matrix[5] + z * matrix[9] + matrix[13] + z_out = x * matrix[2] + y * matrix[6] + z * matrix[10] + matrix[14] + return (x_out, y_out, z_out) def main(): - parser = argparse.ArgumentParser(description='分析两个3D Tiles模型指定区域的高度变化') - parser.add_argument('--tileset1', required=True, help='第一个3D Tiles数据集路径') - parser.add_argument('--tileset2', required=True, help='第二个3D Tiles数据集路径') - parser.add_argument('--bounds', required=True, type=float, nargs=4, - help='分析区域边界 [min_x, min_y, max_x, max_y]') - parser.add_argument('--resolution', type=float, default=1.0, help='采样分辨率(米)') - parser.add_argument('--output', default='results', help='输出目录') - - args = parser.parse_args() - - processor = TilesetProcessor(args.tileset1, args.tileset2, args.resolution) - - # 设置分析区域 - if processor.set_analysis_area(args.bounds): - if processor.sample_heights(): - processor.export_results(args.output) - print("分析完成!结果已导出到指定目录。") - else: - print("高度采样失败,无法完成分析。") + sample_density = 20 + + print("正在从第一个3D Tiles模型提取区域高度数据...") + heights1 = get_heights_in_region(tileset_urls[0], sample_density) + + print("正在从第二个3D Tiles模型提取区域高度数据...") + heights2 = get_heights_in_region(tileset_urls[1], sample_density) + + if not heights1 or not heights2: + print("无法获取足够的高度数据进行比较") + return + + # 计算平均高度 + avg1 = np.mean(list(heights1.values())) + avg2 = np.mean(list(heights2.values())) + + print(f"\n模型1 平均高度: {avg1:.2f} 米") + print(f"模型2 平均高度: {avg2:.2f} 米") + + delta = avg1 - avg2 + print(f"高度差: {delta:.2f} 米") + + # 🔧 自动统一高度 + if abs(delta) > 0.5: + print("\n⚙️ 正在统一高度基准(修改模型2的 transform)...") + # tileset_urls[1] 是远程 URL,下载后调整 + try: + ts2_url = tileset_urls[1] + response = requests.get(ts2_url) + response.raise_for_status() + with open("tileset_model2.json", "w", encoding="utf-8") as f: + f.write(response.text) + + adjust_z_in_transform("tileset_model2.json", "tileset_model2_adjusted.json", delta_z=delta) + except Exception as e: + print(f"❌ 调整高度失败: {e}") else: - print("设置分析区域失败,无法进行分析。") + print("\n✅ 高度差异在容忍范围内,无需调整") + + # 🔍 差异分析 + print("\n正在分析详细差异点...") + differences = compare_heights(heights1, heights2, 0.5) + + if differences: + print(f"共发现 {len(differences)} 处显著高度差异:") + for i, diff in enumerate(differences[:10], 1): # 仅显示前10条 + lon, lat = diff['point'] + print(f"\n位置 {i}: 经度 {lon}, 纬度 {lat}") + print(f"模型1高度: {diff['height1']:.2f}米") + print(f"模型2高度: {diff['height2']:.2f}米") + if diff['difference'] is not None: + print(f"差异: {diff['difference']:.2f}米") + else: + print("差异: 一个模型在该位置没有数据") + else: + print("两个模型在指定区域高度基本一致 ✅") + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/Ai_tottle/tileset_model2.json b/Ai_tottle/tileset_model2.json new file mode 100644 index 0000000..efa8690 --- /dev/null +++ b/Ai_tottle/tileset_model2.json @@ -0,0 +1 @@ +{"asset":{"gltfUpAxis":"Z","version":"1.0"},"root":{"boundingVolume":{"box":[0.014586898120739988,0.007299131083357224,-0.04231168709833355,656.3470322715614,0.0,0.0,0.0,330.0247506780942,0.0,0.0,0.0,142.72717192602244]},"children":[{"boundingVolume":{"box":[0.014586898120739988,0.007299131083357224,-0.04231168709833355,656.3470322715614,0.0,0.0,0.0,330.0247506780942,0.0,0.0,0.0,142.72717192602244]},"children":[{"boundingVolume":{"box":[-154.01464495381612,0.30252991389701833,15.282116289950807,502.320948807875,0.0,0.0,0.0,330.321572635596,0.0,0.0,0.0,127.42695105845866]},"children":[{"boundingVolume":{"box":[-357.0165445266566,20.441542173172706,42.301687053862906,299.12394414008054,0.0,0.0,0.0,246.03885861521542,0.0,0.0,0.0,100.4196335964491]},"children":[{"boundingVolume":{"box":[-458.7273848725646,-79.31805632415339,32.00355543000228,197.41021938650863,0.0,0.0,0.0,143.15115315939582,0.0,0.0,0.0,59.67960344512721]},"children":[{"boundingVolume":{"box":[-546.0426443552399,-180.66853306322682,35.771405309402894,81.30200705701344,0.0,0.0,0.0,41.85739994571006,0.0,0.0,0.0,23.842990746432065]},"children":[{"boundingVolume":{"box":[-546.0426443552399,-180.66853306322682,35.771405309402894,81.30200705701344,0.0,0.0,0.0,41.85739994571006,0.0,0.0,0.0,23.842990746432065]},"content":{"uri":"top/Level_17/Tile_+000_+000.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-546.0426443552399,-180.66853306322682,35.771405309402894,81.30200705701344,0.0,0.0,0.0,41.85739994571006,0.0,0.0,0.0,23.842990746432065]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0000.b3dm"},"geometricError":15.0,"refine":"REPLACE"},{"boundingVolume":{"box":[-560.1662615715377,-37.246002012224096,45.912225251158134,95.81396196945522,0.0,0.0,0.0,101.46915319438125,0.0,0.0,0.0,38.89652170021259]},"children":[{"boundingVolume":{"box":[-560.1662615715377,-37.246002012224096,45.912225251158134,95.81396196945522,0.0,0.0,0.0,101.46915319438125,0.0,0.0,0.0,38.89652170021259]},"content":{"uri":"top/Level_17/Tile_+000_+001.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-560.1662615715377,-37.246002012224096,45.912225251158134,95.81396196945522,0.0,0.0,0.0,101.46915319438125,0.0,0.0,0.0,38.89652170021259]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0001.b3dm"},"geometricError":15.0,"refine":"REPLACE"},{"boundingVolume":{"box":[-363.2208259750151,-68.22772341713915,32.01231128948905,101.90366048895913,0.0,0.0,0.0,132.06082025238157,0.0,0.0,0.0,59.670847585640445]},"children":[{"boundingVolume":{"box":[-363.41724262850147,-169.74592563562376,50.37853369471543,101.70990477547826,0.0,0.0,0.0,30.543776366522394,0.0,0.0,0.0,41.30340463926393]},"content":{"uri":"top/Level_17/Tile_+001_+000.json"},"geometricError":7.5,"refine":"REPLACE"},{"boundingVolume":{"box":[-363.1617321185602,-37.62413498997486,20.203959549989236,101.84513654207768,0.0,0.0,0.0,101.45699523872261,0.0,0.0,0.0,47.8608521608129]},"content":{"uri":"top/Level_17/Tile_+001_+001.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-363.2208259750151,-68.22772341713915,32.01231128948905,101.90366048895913,0.0,0.0,0.0,132.06082025238157,0.0,0.0,0.0,59.670847585640445]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0002.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-458.7273848725646,-79.31805632415339,32.00355543000228,197.41021938650863,0.0,0.0,0.0,143.15115315939582,0.0,0.0,0.0,59.67960344512721]},"uri":"top/Level_15/Tile_p0000_p0000_L15_000.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"},{"boundingVolume":{"box":[-388.7955224712855,151.31915576316504,55.30803144674803,127.81195967248547,0.0,0.0,0.0,87.2696190968025,0.0,0.0,0.0,87.4093263500755]},"children":[{"boundingVolume":{"box":[-490.42790314208435,92.71123164457146,65.04024405874839,26.18601778618188,0.0,0.0,0.0,28.660892607578717,0.0,0.0,0.0,17.570044170586016]},"children":[{"boundingVolume":{"box":[-490.42790314208435,92.71123164457146,65.04024405874839,26.18601778618188,0.0,0.0,0.0,28.660892607578717,0.0,0.0,0.0,17.570044170586016]},"content":{"uri":"top/Level_17/Tile_+000_+002.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-490.42790314208435,92.71123164457146,65.04024405874839,26.18601778618188,0.0,0.0,0.0,28.660892607578717,0.0,0.0,0.0,17.570044170586016]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0010.b3dm"},"geometricError":15.0,"refine":"REPLACE"},{"boundingVolume":{"box":[-362.7999637460317,151.2696259909265,55.31002961224692,101.8164009472317,0.0,0.0,0.0,87.31914886904104,0.0,0.0,0.0,87.40732818457661]},"children":[{"boundingVolume":{"box":[-362.7999637460317,151.2696259909265,55.31002961224692,101.8164009472317,0.0,0.0,0.0,87.31914886904104,0.0,0.0,0.0,87.40732818457661]},"content":{"uri":"top/Level_17/Tile_+001_+002.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-362.7999637460317,151.2696259909265,55.31002961224692,101.8164009472317,0.0,0.0,0.0,87.31914886904104,0.0,0.0,0.0,87.40732818457661]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0011.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-388.7955224712855,151.31915576316504,55.30803144674803,127.81195967248547,0.0,0.0,0.0,87.2696190968025,0.0,0.0,0.0,87.4093263500755]},"uri":"top/Level_15/Tile_p0000_p0000_L15_001.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"},{"boundingVolume":{"box":[-160.21173025087012,-81.45575214056905,17.23384307169181,101.92939002441481,0.0,0.0,0.0,144.89867434325967,0.0,0.0,0.0,75.323481177428]},"children":[{"boundingVolume":{"box":[-160.40846008214197,-182.97491126217048,57.25820753024777,101.7359470721786,0.0,0.0,0.0,43.38236790743949,0.0,0.0,0.0,35.29789610800867]},"children":[{"boundingVolume":{"box":[-160.40846008214197,-182.97491126217048,57.25820753024777,101.7359470721786,0.0,0.0,0.0,43.38236790743949,0.0,0.0,0.0,35.29789610800867]},"content":{"uri":"top/Level_17/Tile_+002_+000.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-160.40846008214197,-182.97491126217048,57.25820753024777,101.7359470721786,0.0,0.0,0.0,43.38236790743949,0.0,0.0,0.0,35.29789610800867]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0020.b3dm"},"geometricError":15.0,"refine":"REPLACE"},{"boundingVolume":{"box":[-160.12809599041066,-38.01400064404669,1.8804069459582706,101.8460361039875,0.0,0.0,0.0,101.45661612246158,0.0,0.0,0.0,59.96753620224911]},"children":[{"boundingVolume":{"box":[-160.12809599041066,-38.01400064404669,1.8804069459582706,101.8460361039875,0.0,0.0,0.0,101.45661612246158,0.0,0.0,0.0,59.96753620224911]},"content":{"uri":"top/Level_17/Tile_+002_+001.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-160.12809599041066,-38.01400064404669,1.8804069459582706,101.8460361039875,0.0,0.0,0.0,101.45661612246158,0.0,0.0,0.0,59.96753620224911]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0021.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-160.21173025087012,-81.45575214056905,17.23384307169181,101.92939002441481,0.0,0.0,0.0,144.89867434325967,0.0,0.0,0.0,75.323481177428]},"uri":"top/Level_15/Tile_p0000_p0000_L15_002.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"},{"boundingVolume":{"box":[-159.73853620610072,165.0201687065703,44.13932742358554,101.845975769311,0.0,0.0,0.0,101.46004725152284,0.0,0.0,0.0,94.17626202971735]},"children":[{"boundingVolume":{"box":[-159.73853620610072,165.0201687065703,44.13932742358554,101.845975769311,0.0,0.0,0.0,101.46004725152284,0.0,0.0,0.0,94.17626202971735]},"children":[{"boundingVolume":{"box":[-159.73853620610072,165.0201687065703,44.13932742358554,101.845975769311,0.0,0.0,0.0,101.46004725152284,0.0,0.0,0.0,94.17626202971735]},"content":{"uri":"top/Level_17/Tile_+002_+002.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-159.73853620610072,165.0201687065703,44.13932742358554,101.845975769311,0.0,0.0,0.0,101.46004725152284,0.0,0.0,0.0,94.17626202971735]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0030.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-159.73853620610072,165.0201687065703,44.13932742358554,101.845975769311,0.0,0.0,0.0,101.46004725152284,0.0,0.0,0.0,94.17626202971735]},"uri":"top/Level_15/Tile_p0000_p0000_L15_003.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-357.0165445266566,20.441542173172706,42.301687053862906,299.12394414008054,0.0,0.0,0.0,246.03885861521542,0.0,0.0,0.0,100.4196335964491]},"uri":"top/Level_14/Tile_p0000_p0000_L14_00.b3dm"},"geometricError":42.99583480988959,"refine":"REPLACE"},{"boundingVolume":{"box":[-108.67300486593547,283.53311983304593,102.3037397365423,50.84614333645564,0.0,0.0,0.0,17.133438044868598,0.0,0.0,0.0,36.317697168625614]},"children":[{"boundingVolume":{"box":[-108.67300486593547,283.53311983304593,102.3037397365423,50.84614333645564,0.0,0.0,0.0,17.133438044868598,0.0,0.0,0.0,36.317697168625614]},"children":[{"boundingVolume":{"box":[-108.67300486593547,283.53311983304593,102.3037397365423,50.84614333645564,0.0,0.0,0.0,17.133438044868598,0.0,0.0,0.0,36.317697168625614]},"children":[{"boundingVolume":{"box":[-108.67300486593547,283.53311983304593,102.3037397365423,50.84614333645564,0.0,0.0,0.0,17.133438044868598,0.0,0.0,0.0,36.317697168625614]},"content":{"uri":"top/Level_17/Tile_+002_+003.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-108.67300486593547,283.53311983304593,102.3037397365423,50.84614333645564,0.0,0.0,0.0,17.133438044868598,0.0,0.0,0.0,36.317697168625614]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0100.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-108.67300486593547,283.53311983304593,102.3037397365423,50.84614333645564,0.0,0.0,0.0,17.133438044868598,0.0,0.0,0.0,36.317697168625614]},"uri":"top/Level_15/Tile_p0000_p0000_L15_010.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-108.67300486593547,283.53311983304593,102.3037397365423,50.84614333645564,0.0,0.0,0.0,17.133438044868598,0.0,0.0,0.0,36.317697168625614]},"uri":"top/Level_14/Tile_p0000_p0000_L14_01.b3dm"},"geometricError":42.99583480988959,"refine":"REPLACE"},{"boundingVolume":{"box":[144.43357464729146,-32.734469614042126,-16.575029155212178,203.74447624388304,0.0,0.0,0.0,298.4317837178314,0.0,0.0,0.0,95.53640331221641]},"children":[{"boundingVolume":{"box":[117.3693277082741,-134.2009831743409,-15.68259770265081,176.68031067247693,0.0,0.0,0.0,196.96641221175352,0.0,0.0,0.0,74.52884852647207]},"children":[{"boundingVolume":{"box":[42.525324616164994,-235.5756078089087,1.9881371120195581,101.83663587335113,0.0,0.0,0.0,95.59363000387728,0.0,0.0,0.0,56.86202082994896]},"children":[{"boundingVolume":{"box":[42.525324616164994,-235.5756078089087,1.9881371120195581,101.83663587335113,0.0,0.0,0.0,95.59363000387728,0.0,0.0,0.0,56.86202082994896]},"content":{"uri":"top/Level_17/Tile_+003_+000.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[42.525324616164994,-235.5756078089087,1.9881371120195581,101.83663587335113,0.0,0.0,0.0,95.59363000387728,0.0,0.0,0.0,56.86202082994896]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0200.b3dm"},"geometricError":15.0,"refine":"REPLACE"},{"boundingVolume":{"box":[42.904128547520884,-38.40397063385555,-26.82735668639782,101.84749689203596,0.0,0.0,0.0,101.45609168824646,0.0,0.0,0.0,63.37699274797126]},"children":[{"boundingVolume":{"box":[42.904128547520884,-38.40397063385555,-26.82735668639782,101.84749689203596,0.0,0.0,0.0,101.45609168824646,0.0,0.0,0.0,63.37699274797126]},"content":{"uri":"top/Level_17/Tile_+003_+001.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[42.904128547520884,-38.40397063385555,-26.82735668639782,101.84749689203596,0.0,0.0,0.0,101.45609168824646,0.0,0.0,0.0,63.37699274797126]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0201.b3dm"},"geometricError":15.0,"refine":"REPLACE"},{"boundingVolume":{"box":[218.7593759919775,-199.39971207747197,12.54896442914685,74.89860235295266,0.0,0.0,0.0,59.131873214772554,0.0,0.0,0.0,13.900161187925164]},"children":[{"boundingVolume":{"box":[218.7593759919775,-199.39971207747197,12.54896442914685,74.89860235295266,0.0,0.0,0.0,59.131873214772554,0.0,0.0,0.0,13.900161187925164]},"content":{"uri":"top/Level_17/Tile_+004_+000.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[218.7593759919775,-199.39971207747197,12.54896442914685,74.89860235295266,0.0,0.0,0.0,59.131873214772554,0.0,0.0,0.0,13.900161187925164]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0202.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[117.3693277082741,-134.2009831743409,-15.68259770265081,176.68031067247693,0.0,0.0,0.0,196.96641221175352,0.0,0.0,0.0,74.52884852647207]},"uri":"top/Level_15/Tile_p0000_p0000_L15_020.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"},{"boundingVolume":{"box":[43.29469604157575,164.6285663358604,-2.326052162078838,101.84808528351982,0.0,0.0,0.0,101.45895445188432,0.0,0.0,0.0,81.29525419140367]},"children":[{"boundingVolume":{"box":[43.29469604157575,164.6285663358604,-2.326052162078838,101.84808528351982,0.0,0.0,0.0,101.45895445188432,0.0,0.0,0.0,81.29525419140367]},"children":[{"boundingVolume":{"box":[43.29469604157575,164.6285663358604,-2.326052162078838,101.84808528351982,0.0,0.0,0.0,101.45895445188432,0.0,0.0,0.0,81.29525419140367]},"content":{"uri":"top/Level_17/Tile_+003_+002.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[43.29469604157575,164.6285663358604,-2.326052162078838,101.84808528351982,0.0,0.0,0.0,101.45895445188432,0.0,0.0,0.0,81.29525419140367]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0210.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[43.29469604157575,164.6285663358604,-2.326052162078838,101.84808528351982,0.0,0.0,0.0,101.45895445188432,0.0,0.0,0.0,81.29525419140367]},"uri":"top/Level_15/Tile_p0000_p0000_L15_021.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"},{"boundingVolume":{"box":[245.93527167609,-38.794199212332046,-38.99284241478125,101.84940588707883,0.0,0.0,0.0,101.45598134292936,0.0,0.0,0.0,59.5949838680728]},"children":[{"boundingVolume":{"box":[245.93527167609,-38.794199212332046,-38.99284241478125,101.84940588707883,0.0,0.0,0.0,101.45598134292936,0.0,0.0,0.0,59.5949838680728]},"children":[{"boundingVolume":{"box":[245.93527167609,-38.794199212332046,-38.99284241478125,101.84940588707883,0.0,0.0,0.0,101.45598134292936,0.0,0.0,0.0,59.5949838680728]},"content":{"uri":"top/Level_17/Tile_+004_+001.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[245.93527167609,-38.794199212332046,-38.99284241478125,101.84940588707883,0.0,0.0,0.0,101.45598134292936,0.0,0.0,0.0,59.5949838680728]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0220.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[245.93527167609,-38.794199212332046,-38.99284241478125,101.84940588707883,0.0,0.0,0.0,101.45598134292936,0.0,0.0,0.0,59.5949838680728]},"uri":"top/Level_15/Tile_p0000_p0000_L15_022.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"},{"boundingVolume":{"box":[246.32478287176878,164.23683355209707,-50.09934874181158,101.84912274481344,0.0,0.0,0.0,101.457676596102,0.0,0.0,0.0,62.00512005581322]},"children":[{"boundingVolume":{"box":[246.32478287176878,164.23683355209707,-50.09934874181158,101.84912274481344,0.0,0.0,0.0,101.457676596102,0.0,0.0,0.0,62.00512005581322]},"children":[{"boundingVolume":{"box":[246.32478287176878,164.23683355209707,-50.09934874181158,101.84912274481344,0.0,0.0,0.0,101.457676596102,0.0,0.0,0.0,62.00512005581322]},"content":{"uri":"top/Level_17/Tile_+004_+002.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[246.32478287176878,164.23683355209707,-50.09934874181158,101.84912274481344,0.0,0.0,0.0,101.457676596102,0.0,0.0,0.0,62.00512005581322]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0230.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[246.32478287176878,164.23683355209707,-50.09934874181158,101.84912274481344,0.0,0.0,0.0,101.457676596102,0.0,0.0,0.0,62.00512005581322]},"uri":"top/Level_15/Tile_p0000_p0000_L15_023.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[144.43357464729146,-32.734469614042126,-16.575029155212178,203.74447624388304,0.0,0.0,0.0,298.4317837178314,0.0,0.0,0.0,95.53640331221641]},"uri":"top/Level_14/Tile_p0000_p0000_L14_02.b3dm"},"geometricError":42.99583480988959,"refine":"REPLACE"},{"boundingVolume":{"box":[114.19426526143644,298.4708851597237,38.176172768969536,172.35793810423678,0.0,0.0,0.0,32.26943438567187,0.0,0.0,0.0,57.208886614730545]},"children":[{"boundingVolume":{"box":[114.19426526143644,298.4708851597237,38.176172768969536,172.35793810423678,0.0,0.0,0.0,32.26943438567187,0.0,0.0,0.0,57.208886614730545]},"children":[{"boundingVolume":{"box":[43.54575920534228,295.33783156966746,47.65350072107526,101.70960468574228,0.0,0.0,0.0,29.13558663098769,0.0,0.0,0.0,47.73666014144533]},"children":[{"boundingVolume":{"box":[43.54575920534228,295.33783156966746,47.65350072107526,101.70960468574228,0.0,0.0,0.0,29.13558663098769,0.0,0.0,0.0,47.73666014144533]},"content":{"uri":"top/Level_17/Tile_+003_+003.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[43.54575920534228,295.33783156966746,47.65350072107526,101.70960468574228,0.0,0.0,0.0,29.13558663098769,0.0,0.0,0.0,47.73666014144533]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0300.b3dm"},"geometricError":15.0,"refine":"REPLACE"},{"boundingVolume":{"box":[215.70874111142518,298.27425970375384,7.701202734918979,70.84072670665546,0.0,0.0,0.0,32.462886302540824,0.0,0.0,0.0,26.73527891188428]},"children":[{"boundingVolume":{"box":[215.70874111142518,298.27425970375384,7.701202734918979,70.84072670665546,0.0,0.0,0.0,32.462886302540824,0.0,0.0,0.0,26.73527891188428]},"content":{"uri":"top/Level_17/Tile_+004_+003.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[215.70874111142518,298.27425970375384,7.701202734918979,70.84072670665546,0.0,0.0,0.0,32.462886302540824,0.0,0.0,0.0,26.73527891188428]},"uri":"top/Level_16/Tile_p0000_p0000_L16_0301.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[114.19426526143644,298.4708851597237,38.176172768969536,172.35793810423678,0.0,0.0,0.0,32.26943438567187,0.0,0.0,0.0,57.208886614730545]},"uri":"top/Level_15/Tile_p0000_p0000_L15_030.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[114.19426526143644,298.4708851597237,38.176172768969536,172.35793810423678,0.0,0.0,0.0,32.26943438567187,0.0,0.0,0.0,57.208886614730545]},"uri":"top/Level_14/Tile_p0000_p0000_L14_03.b3dm"},"geometricError":42.99583480988959,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[-154.01464495381612,0.30252991389701833,15.282116289950807,502.320948807875,0.0,0.0,0.0,330.321572635596,0.0,0.0,0.0,127.42695105845866]},"uri":"top/Level_13/Tile_p0000_p0000_L13_0.b3dm"},"geometricError":85.99166961977917,"refine":"REPLACE"},{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"children":[{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"children":[{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"children":[{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"children":[{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"content":{"uri":"top/Level_17/Tile_+006_+002.json"},"geometricError":7.5,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"uri":"top/Level_16/Tile_p0000_p0000_L16_1000.b3dm"},"geometricError":15.0,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"uri":"top/Level_15/Tile_p0000_p0000_L15_100.b3dm"},"geometricError":21.497917404944793,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"uri":"top/Level_14/Tile_p0000_p0000_L14_10.b3dm"},"geometricError":42.99583480988959,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[603.3674446128834,161.98264210854686,-128.4739704871484,52.836977828361455,0.0,0.0,0.0,99.98412737202378,0.0,0.0,0.0,14.277241950449422]},"uri":"top/Level_13/Tile_p0000_p0000_L13_1.b3dm"},"geometricError":85.99166961977917,"refine":"REPLACE"}],"content":{"boundingVolume":{"box":[0.014586898120739988,0.007299131083357224,-0.04231168709833355,656.3470322715614,0.0,0.0,0.0,330.0247506780942,0.0,0.0,0.0,142.72717192602244]},"uri":"top/Level_12/Tile_p0000_p0000.b3dm"},"geometricError":171.98333923955835,"refine":"REPLACE"}],"geometricError":748.3841316047692,"refine":"REPLACE","transform":[-0.9773257639965924,-0.21174123601338712,0.0,0.0,0.10388876136222207,-0.4795153035876962,0.8713622661601906,0.0,-0.18450332325218474,0.8516047924928104,0.49064019516563984,0.0,-1177933.2762076592,5436940.677128543,3111451.2639461895,1.0]}} \ No newline at end of file diff --git a/Ai_tottle/tileset_model2_adjusted.json b/Ai_tottle/tileset_model2_adjusted.json new file mode 100644 index 0000000..070c746 --- /dev/null +++ b/Ai_tottle/tileset_model2_adjusted.json @@ -0,0 +1,2000 @@ +{ + "asset": { + "gltfUpAxis": "Z", + "version": "1.0" + }, + "root": { + "boundingVolume": { + "box": [ + 0.014586898120739988, + 0.007299131083357224, + -0.04231168709833355, + 656.3470322715614, + 0.0, + 0.0, + 0.0, + 330.0247506780942, + 0.0, + 0.0, + 0.0, + 142.72717192602244 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 0.014586898120739988, + 0.007299131083357224, + -0.04231168709833355, + 656.3470322715614, + 0.0, + 0.0, + 0.0, + 330.0247506780942, + 0.0, + 0.0, + 0.0, + 142.72717192602244 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -154.01464495381612, + 0.30252991389701833, + 15.282116289950807, + 502.320948807875, + 0.0, + 0.0, + 0.0, + 330.321572635596, + 0.0, + 0.0, + 0.0, + 127.42695105845866 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -357.0165445266566, + 20.441542173172706, + 42.301687053862906, + 299.12394414008054, + 0.0, + 0.0, + 0.0, + 246.03885861521542, + 0.0, + 0.0, + 0.0, + 100.4196335964491 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -458.7273848725646, + -79.31805632415339, + 32.00355543000228, + 197.41021938650863, + 0.0, + 0.0, + 0.0, + 143.15115315939582, + 0.0, + 0.0, + 0.0, + 59.67960344512721 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -546.0426443552399, + -180.66853306322682, + 35.771405309402894, + 81.30200705701344, + 0.0, + 0.0, + 0.0, + 41.85739994571006, + 0.0, + 0.0, + 0.0, + 23.842990746432065 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -546.0426443552399, + -180.66853306322682, + 35.771405309402894, + 81.30200705701344, + 0.0, + 0.0, + 0.0, + 41.85739994571006, + 0.0, + 0.0, + 0.0, + 23.842990746432065 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+000_+000.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -546.0426443552399, + -180.66853306322682, + 35.771405309402894, + 81.30200705701344, + 0.0, + 0.0, + 0.0, + 41.85739994571006, + 0.0, + 0.0, + 0.0, + 23.842990746432065 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0000.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -560.1662615715377, + -37.246002012224096, + 45.912225251158134, + 95.81396196945522, + 0.0, + 0.0, + 0.0, + 101.46915319438125, + 0.0, + 0.0, + 0.0, + 38.89652170021259 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -560.1662615715377, + -37.246002012224096, + 45.912225251158134, + 95.81396196945522, + 0.0, + 0.0, + 0.0, + 101.46915319438125, + 0.0, + 0.0, + 0.0, + 38.89652170021259 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+000_+001.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -560.1662615715377, + -37.246002012224096, + 45.912225251158134, + 95.81396196945522, + 0.0, + 0.0, + 0.0, + 101.46915319438125, + 0.0, + 0.0, + 0.0, + 38.89652170021259 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0001.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -363.2208259750151, + -68.22772341713915, + 32.01231128948905, + 101.90366048895913, + 0.0, + 0.0, + 0.0, + 132.06082025238157, + 0.0, + 0.0, + 0.0, + 59.670847585640445 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -363.41724262850147, + -169.74592563562376, + 50.37853369471543, + 101.70990477547826, + 0.0, + 0.0, + 0.0, + 30.543776366522394, + 0.0, + 0.0, + 0.0, + 41.30340463926393 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+001_+000.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -363.1617321185602, + -37.62413498997486, + 20.203959549989236, + 101.84513654207768, + 0.0, + 0.0, + 0.0, + 101.45699523872261, + 0.0, + 0.0, + 0.0, + 47.8608521608129 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+001_+001.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -363.2208259750151, + -68.22772341713915, + 32.01231128948905, + 101.90366048895913, + 0.0, + 0.0, + 0.0, + 132.06082025238157, + 0.0, + 0.0, + 0.0, + 59.670847585640445 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0002.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -458.7273848725646, + -79.31805632415339, + 32.00355543000228, + 197.41021938650863, + 0.0, + 0.0, + 0.0, + 143.15115315939582, + 0.0, + 0.0, + 0.0, + 59.67960344512721 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_000.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -388.7955224712855, + 151.31915576316504, + 55.30803144674803, + 127.81195967248547, + 0.0, + 0.0, + 0.0, + 87.2696190968025, + 0.0, + 0.0, + 0.0, + 87.4093263500755 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -490.42790314208435, + 92.71123164457146, + 65.04024405874839, + 26.18601778618188, + 0.0, + 0.0, + 0.0, + 28.660892607578717, + 0.0, + 0.0, + 0.0, + 17.570044170586016 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -490.42790314208435, + 92.71123164457146, + 65.04024405874839, + 26.18601778618188, + 0.0, + 0.0, + 0.0, + 28.660892607578717, + 0.0, + 0.0, + 0.0, + 17.570044170586016 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+000_+002.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -490.42790314208435, + 92.71123164457146, + 65.04024405874839, + 26.18601778618188, + 0.0, + 0.0, + 0.0, + 28.660892607578717, + 0.0, + 0.0, + 0.0, + 17.570044170586016 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0010.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -362.7999637460317, + 151.2696259909265, + 55.31002961224692, + 101.8164009472317, + 0.0, + 0.0, + 0.0, + 87.31914886904104, + 0.0, + 0.0, + 0.0, + 87.40732818457661 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -362.7999637460317, + 151.2696259909265, + 55.31002961224692, + 101.8164009472317, + 0.0, + 0.0, + 0.0, + 87.31914886904104, + 0.0, + 0.0, + 0.0, + 87.40732818457661 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+001_+002.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -362.7999637460317, + 151.2696259909265, + 55.31002961224692, + 101.8164009472317, + 0.0, + 0.0, + 0.0, + 87.31914886904104, + 0.0, + 0.0, + 0.0, + 87.40732818457661 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0011.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -388.7955224712855, + 151.31915576316504, + 55.30803144674803, + 127.81195967248547, + 0.0, + 0.0, + 0.0, + 87.2696190968025, + 0.0, + 0.0, + 0.0, + 87.4093263500755 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_001.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -160.21173025087012, + -81.45575214056905, + 17.23384307169181, + 101.92939002441481, + 0.0, + 0.0, + 0.0, + 144.89867434325967, + 0.0, + 0.0, + 0.0, + 75.323481177428 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -160.40846008214197, + -182.97491126217048, + 57.25820753024777, + 101.7359470721786, + 0.0, + 0.0, + 0.0, + 43.38236790743949, + 0.0, + 0.0, + 0.0, + 35.29789610800867 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -160.40846008214197, + -182.97491126217048, + 57.25820753024777, + 101.7359470721786, + 0.0, + 0.0, + 0.0, + 43.38236790743949, + 0.0, + 0.0, + 0.0, + 35.29789610800867 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+002_+000.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -160.40846008214197, + -182.97491126217048, + 57.25820753024777, + 101.7359470721786, + 0.0, + 0.0, + 0.0, + 43.38236790743949, + 0.0, + 0.0, + 0.0, + 35.29789610800867 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0020.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -160.12809599041066, + -38.01400064404669, + 1.8804069459582706, + 101.8460361039875, + 0.0, + 0.0, + 0.0, + 101.45661612246158, + 0.0, + 0.0, + 0.0, + 59.96753620224911 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -160.12809599041066, + -38.01400064404669, + 1.8804069459582706, + 101.8460361039875, + 0.0, + 0.0, + 0.0, + 101.45661612246158, + 0.0, + 0.0, + 0.0, + 59.96753620224911 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+002_+001.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -160.12809599041066, + -38.01400064404669, + 1.8804069459582706, + 101.8460361039875, + 0.0, + 0.0, + 0.0, + 101.45661612246158, + 0.0, + 0.0, + 0.0, + 59.96753620224911 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0021.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -160.21173025087012, + -81.45575214056905, + 17.23384307169181, + 101.92939002441481, + 0.0, + 0.0, + 0.0, + 144.89867434325967, + 0.0, + 0.0, + 0.0, + 75.323481177428 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_002.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -159.73853620610072, + 165.0201687065703, + 44.13932742358554, + 101.845975769311, + 0.0, + 0.0, + 0.0, + 101.46004725152284, + 0.0, + 0.0, + 0.0, + 94.17626202971735 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -159.73853620610072, + 165.0201687065703, + 44.13932742358554, + 101.845975769311, + 0.0, + 0.0, + 0.0, + 101.46004725152284, + 0.0, + 0.0, + 0.0, + 94.17626202971735 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -159.73853620610072, + 165.0201687065703, + 44.13932742358554, + 101.845975769311, + 0.0, + 0.0, + 0.0, + 101.46004725152284, + 0.0, + 0.0, + 0.0, + 94.17626202971735 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+002_+002.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -159.73853620610072, + 165.0201687065703, + 44.13932742358554, + 101.845975769311, + 0.0, + 0.0, + 0.0, + 101.46004725152284, + 0.0, + 0.0, + 0.0, + 94.17626202971735 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0030.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -159.73853620610072, + 165.0201687065703, + 44.13932742358554, + 101.845975769311, + 0.0, + 0.0, + 0.0, + 101.46004725152284, + 0.0, + 0.0, + 0.0, + 94.17626202971735 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_003.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -357.0165445266566, + 20.441542173172706, + 42.301687053862906, + 299.12394414008054, + 0.0, + 0.0, + 0.0, + 246.03885861521542, + 0.0, + 0.0, + 0.0, + 100.4196335964491 + ] + }, + "uri": "top/Level_14/Tile_p0000_p0000_L14_00.b3dm" + }, + "geometricError": 42.99583480988959, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + -108.67300486593547, + 283.53311983304593, + 102.3037397365423, + 50.84614333645564, + 0.0, + 0.0, + 0.0, + 17.133438044868598, + 0.0, + 0.0, + 0.0, + 36.317697168625614 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -108.67300486593547, + 283.53311983304593, + 102.3037397365423, + 50.84614333645564, + 0.0, + 0.0, + 0.0, + 17.133438044868598, + 0.0, + 0.0, + 0.0, + 36.317697168625614 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -108.67300486593547, + 283.53311983304593, + 102.3037397365423, + 50.84614333645564, + 0.0, + 0.0, + 0.0, + 17.133438044868598, + 0.0, + 0.0, + 0.0, + 36.317697168625614 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + -108.67300486593547, + 283.53311983304593, + 102.3037397365423, + 50.84614333645564, + 0.0, + 0.0, + 0.0, + 17.133438044868598, + 0.0, + 0.0, + 0.0, + 36.317697168625614 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+002_+003.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -108.67300486593547, + 283.53311983304593, + 102.3037397365423, + 50.84614333645564, + 0.0, + 0.0, + 0.0, + 17.133438044868598, + 0.0, + 0.0, + 0.0, + 36.317697168625614 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0100.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -108.67300486593547, + 283.53311983304593, + 102.3037397365423, + 50.84614333645564, + 0.0, + 0.0, + 0.0, + 17.133438044868598, + 0.0, + 0.0, + 0.0, + 36.317697168625614 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_010.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -108.67300486593547, + 283.53311983304593, + 102.3037397365423, + 50.84614333645564, + 0.0, + 0.0, + 0.0, + 17.133438044868598, + 0.0, + 0.0, + 0.0, + 36.317697168625614 + ] + }, + "uri": "top/Level_14/Tile_p0000_p0000_L14_01.b3dm" + }, + "geometricError": 42.99583480988959, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 144.43357464729146, + -32.734469614042126, + -16.575029155212178, + 203.74447624388304, + 0.0, + 0.0, + 0.0, + 298.4317837178314, + 0.0, + 0.0, + 0.0, + 95.53640331221641 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 117.3693277082741, + -134.2009831743409, + -15.68259770265081, + 176.68031067247693, + 0.0, + 0.0, + 0.0, + 196.96641221175352, + 0.0, + 0.0, + 0.0, + 74.52884852647207 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 42.525324616164994, + -235.5756078089087, + 1.9881371120195581, + 101.83663587335113, + 0.0, + 0.0, + 0.0, + 95.59363000387728, + 0.0, + 0.0, + 0.0, + 56.86202082994896 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 42.525324616164994, + -235.5756078089087, + 1.9881371120195581, + 101.83663587335113, + 0.0, + 0.0, + 0.0, + 95.59363000387728, + 0.0, + 0.0, + 0.0, + 56.86202082994896 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+003_+000.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 42.525324616164994, + -235.5756078089087, + 1.9881371120195581, + 101.83663587335113, + 0.0, + 0.0, + 0.0, + 95.59363000387728, + 0.0, + 0.0, + 0.0, + 56.86202082994896 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0200.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 42.904128547520884, + -38.40397063385555, + -26.82735668639782, + 101.84749689203596, + 0.0, + 0.0, + 0.0, + 101.45609168824646, + 0.0, + 0.0, + 0.0, + 63.37699274797126 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 42.904128547520884, + -38.40397063385555, + -26.82735668639782, + 101.84749689203596, + 0.0, + 0.0, + 0.0, + 101.45609168824646, + 0.0, + 0.0, + 0.0, + 63.37699274797126 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+003_+001.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 42.904128547520884, + -38.40397063385555, + -26.82735668639782, + 101.84749689203596, + 0.0, + 0.0, + 0.0, + 101.45609168824646, + 0.0, + 0.0, + 0.0, + 63.37699274797126 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0201.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 218.7593759919775, + -199.39971207747197, + 12.54896442914685, + 74.89860235295266, + 0.0, + 0.0, + 0.0, + 59.131873214772554, + 0.0, + 0.0, + 0.0, + 13.900161187925164 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 218.7593759919775, + -199.39971207747197, + 12.54896442914685, + 74.89860235295266, + 0.0, + 0.0, + 0.0, + 59.131873214772554, + 0.0, + 0.0, + 0.0, + 13.900161187925164 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+004_+000.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 218.7593759919775, + -199.39971207747197, + 12.54896442914685, + 74.89860235295266, + 0.0, + 0.0, + 0.0, + 59.131873214772554, + 0.0, + 0.0, + 0.0, + 13.900161187925164 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0202.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 117.3693277082741, + -134.2009831743409, + -15.68259770265081, + 176.68031067247693, + 0.0, + 0.0, + 0.0, + 196.96641221175352, + 0.0, + 0.0, + 0.0, + 74.52884852647207 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_020.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 43.29469604157575, + 164.6285663358604, + -2.326052162078838, + 101.84808528351982, + 0.0, + 0.0, + 0.0, + 101.45895445188432, + 0.0, + 0.0, + 0.0, + 81.29525419140367 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 43.29469604157575, + 164.6285663358604, + -2.326052162078838, + 101.84808528351982, + 0.0, + 0.0, + 0.0, + 101.45895445188432, + 0.0, + 0.0, + 0.0, + 81.29525419140367 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 43.29469604157575, + 164.6285663358604, + -2.326052162078838, + 101.84808528351982, + 0.0, + 0.0, + 0.0, + 101.45895445188432, + 0.0, + 0.0, + 0.0, + 81.29525419140367 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+003_+002.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 43.29469604157575, + 164.6285663358604, + -2.326052162078838, + 101.84808528351982, + 0.0, + 0.0, + 0.0, + 101.45895445188432, + 0.0, + 0.0, + 0.0, + 81.29525419140367 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0210.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 43.29469604157575, + 164.6285663358604, + -2.326052162078838, + 101.84808528351982, + 0.0, + 0.0, + 0.0, + 101.45895445188432, + 0.0, + 0.0, + 0.0, + 81.29525419140367 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_021.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 245.93527167609, + -38.794199212332046, + -38.99284241478125, + 101.84940588707883, + 0.0, + 0.0, + 0.0, + 101.45598134292936, + 0.0, + 0.0, + 0.0, + 59.5949838680728 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 245.93527167609, + -38.794199212332046, + -38.99284241478125, + 101.84940588707883, + 0.0, + 0.0, + 0.0, + 101.45598134292936, + 0.0, + 0.0, + 0.0, + 59.5949838680728 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 245.93527167609, + -38.794199212332046, + -38.99284241478125, + 101.84940588707883, + 0.0, + 0.0, + 0.0, + 101.45598134292936, + 0.0, + 0.0, + 0.0, + 59.5949838680728 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+004_+001.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 245.93527167609, + -38.794199212332046, + -38.99284241478125, + 101.84940588707883, + 0.0, + 0.0, + 0.0, + 101.45598134292936, + 0.0, + 0.0, + 0.0, + 59.5949838680728 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0220.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 245.93527167609, + -38.794199212332046, + -38.99284241478125, + 101.84940588707883, + 0.0, + 0.0, + 0.0, + 101.45598134292936, + 0.0, + 0.0, + 0.0, + 59.5949838680728 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_022.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 246.32478287176878, + 164.23683355209707, + -50.09934874181158, + 101.84912274481344, + 0.0, + 0.0, + 0.0, + 101.457676596102, + 0.0, + 0.0, + 0.0, + 62.00512005581322 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 246.32478287176878, + 164.23683355209707, + -50.09934874181158, + 101.84912274481344, + 0.0, + 0.0, + 0.0, + 101.457676596102, + 0.0, + 0.0, + 0.0, + 62.00512005581322 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 246.32478287176878, + 164.23683355209707, + -50.09934874181158, + 101.84912274481344, + 0.0, + 0.0, + 0.0, + 101.457676596102, + 0.0, + 0.0, + 0.0, + 62.00512005581322 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+004_+002.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 246.32478287176878, + 164.23683355209707, + -50.09934874181158, + 101.84912274481344, + 0.0, + 0.0, + 0.0, + 101.457676596102, + 0.0, + 0.0, + 0.0, + 62.00512005581322 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0230.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 246.32478287176878, + 164.23683355209707, + -50.09934874181158, + 101.84912274481344, + 0.0, + 0.0, + 0.0, + 101.457676596102, + 0.0, + 0.0, + 0.0, + 62.00512005581322 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_023.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 144.43357464729146, + -32.734469614042126, + -16.575029155212178, + 203.74447624388304, + 0.0, + 0.0, + 0.0, + 298.4317837178314, + 0.0, + 0.0, + 0.0, + 95.53640331221641 + ] + }, + "uri": "top/Level_14/Tile_p0000_p0000_L14_02.b3dm" + }, + "geometricError": 42.99583480988959, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 114.19426526143644, + 298.4708851597237, + 38.176172768969536, + 172.35793810423678, + 0.0, + 0.0, + 0.0, + 32.26943438567187, + 0.0, + 0.0, + 0.0, + 57.208886614730545 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 114.19426526143644, + 298.4708851597237, + 38.176172768969536, + 172.35793810423678, + 0.0, + 0.0, + 0.0, + 32.26943438567187, + 0.0, + 0.0, + 0.0, + 57.208886614730545 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 43.54575920534228, + 295.33783156966746, + 47.65350072107526, + 101.70960468574228, + 0.0, + 0.0, + 0.0, + 29.13558663098769, + 0.0, + 0.0, + 0.0, + 47.73666014144533 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 43.54575920534228, + 295.33783156966746, + 47.65350072107526, + 101.70960468574228, + 0.0, + 0.0, + 0.0, + 29.13558663098769, + 0.0, + 0.0, + 0.0, + 47.73666014144533 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+003_+003.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 43.54575920534228, + 295.33783156966746, + 47.65350072107526, + 101.70960468574228, + 0.0, + 0.0, + 0.0, + 29.13558663098769, + 0.0, + 0.0, + 0.0, + 47.73666014144533 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0300.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 215.70874111142518, + 298.27425970375384, + 7.701202734918979, + 70.84072670665546, + 0.0, + 0.0, + 0.0, + 32.462886302540824, + 0.0, + 0.0, + 0.0, + 26.73527891188428 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 215.70874111142518, + 298.27425970375384, + 7.701202734918979, + 70.84072670665546, + 0.0, + 0.0, + 0.0, + 32.462886302540824, + 0.0, + 0.0, + 0.0, + 26.73527891188428 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+004_+003.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 215.70874111142518, + 298.27425970375384, + 7.701202734918979, + 70.84072670665546, + 0.0, + 0.0, + 0.0, + 32.462886302540824, + 0.0, + 0.0, + 0.0, + 26.73527891188428 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_0301.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 114.19426526143644, + 298.4708851597237, + 38.176172768969536, + 172.35793810423678, + 0.0, + 0.0, + 0.0, + 32.26943438567187, + 0.0, + 0.0, + 0.0, + 57.208886614730545 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_030.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 114.19426526143644, + 298.4708851597237, + 38.176172768969536, + 172.35793810423678, + 0.0, + 0.0, + 0.0, + 32.26943438567187, + 0.0, + 0.0, + 0.0, + 57.208886614730545 + ] + }, + "uri": "top/Level_14/Tile_p0000_p0000_L14_03.b3dm" + }, + "geometricError": 42.99583480988959, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + -154.01464495381612, + 0.30252991389701833, + 15.282116289950807, + 502.320948807875, + 0.0, + 0.0, + 0.0, + 330.321572635596, + 0.0, + 0.0, + 0.0, + 127.42695105845866 + ] + }, + "uri": "top/Level_13/Tile_p0000_p0000_L13_0.b3dm" + }, + "geometricError": 85.99166961977917, + "refine": "REPLACE" + }, + { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "children": [ + { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "content": { + "uri": "top/Level_17/Tile_+006_+002.json" + }, + "geometricError": 7.5, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "uri": "top/Level_16/Tile_p0000_p0000_L16_1000.b3dm" + }, + "geometricError": 15.0, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "uri": "top/Level_15/Tile_p0000_p0000_L15_100.b3dm" + }, + "geometricError": 21.497917404944793, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "uri": "top/Level_14/Tile_p0000_p0000_L14_10.b3dm" + }, + "geometricError": 42.99583480988959, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 603.3674446128834, + 161.98264210854686, + -128.4739704871484, + 52.836977828361455, + 0.0, + 0.0, + 0.0, + 99.98412737202378, + 0.0, + 0.0, + 0.0, + 14.277241950449422 + ] + }, + "uri": "top/Level_13/Tile_p0000_p0000_L13_1.b3dm" + }, + "geometricError": 85.99166961977917, + "refine": "REPLACE" + } + ], + "content": { + "boundingVolume": { + "box": [ + 0.014586898120739988, + 0.007299131083357224, + -0.04231168709833355, + 656.3470322715614, + 0.0, + 0.0, + 0.0, + 330.0247506780942, + 0.0, + 0.0, + 0.0, + 142.72717192602244 + ] + }, + "uri": "top/Level_12/Tile_p0000_p0000.b3dm" + }, + "geometricError": 171.98333923955835, + "refine": "REPLACE" + } + ], + "geometricError": 748.3841316047692, + "refine": "REPLACE", + "transform": [ + -0.9773257639965924, + -0.21174123601338712, + 0.0, + 0.0, + 0.10388876136222207, + -0.4795153035876962, + 0.8713622661601906, + 0.0, + -0.18450332325218474, + 0.8516047924928104, + 0.49064019516563984, + 0.0, + -1177933.2762076592, + 5436940.677128543, + 3111720.5139461895, + 1.0 + ] + } +} \ No newline at end of file