使用js/java合并3dtiles

2024-05-09 12:12
文章标签 js java 3dtiles 合并 使用

本文主要是介绍使用js/java合并3dtiles,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言:

需合并的json目录

aa/tileset.json

bb/tileset.json

cc/tileset.json

dd/tileset.json

ee/tileset.json

js源码:

运行命令:

生成结果:

java源码:

Matrix.java

ThreeDTilesJoin2.java

pom文件

运行程序:

生成合成文件

遇到的问题:

求矩阵运算的jar包:Apache Commons Math

计算代数余子式

计算行列式

转置矩阵

计算逆矩阵

矩阵相乘

需要注意


前言:

需要简单了解3dtile基本结构

需合并的json目录

aa/tileset.json
{"asset": {"generatetool": "cesiumlab2@www.cesiumlab.com/osgb2tiles3","version": "1.0"},"geometricError": 740.579323830987,"root": {"boundingVolume": {"box": [-3675.8994140625, 545.641296386719, 11.9535970687866, 272.260009765625, 0, 0, 0, 249.891235351563, 0, 0, 0, 23.3086099624634]},"children": [{"boundingVolume": {"box": [-3675.8994140625, 545.641296386719, 11.9535970687866, 272.260009765625, 0, 0, 0, 249.891235351563, 0, 0, 0, 23.3086099624634]},"children": [{"boundingVolume": {"box": [-3935.02001953125, 574.504516601563, 15.7210890054703, 13.139404296875, 0, 0, 0, 25.2759399414063, 0, 0, 0, 11.8160890340805]},"content": {"uri": "Tile_+002_+029/Tile_+002_+029.json"},"geometricError": 30.8405098086856}, {"boundingVolume": {"box": [-3931.19152832031, 630.064575195313, 5.76587748527527, 9.6800537109375, 0, 0, 0, 30.9617309570313, 0, 0, 0, 1.63892340660095]},"content": {"uri": "Tile_+002_+030/Tile_+002_+030.json"},"geometricError": 32.4810451438208}, {"boundingVolume": {"box": [-3872.32775878906, 566.557830810547, 15.5438475459814, 50.4261474609375, 0, 0, 0, 33.1085510253906, 0, 0, 0, 15.1476407200098]},"content": {"uri": "Tile_+003_+029/Tile_+003_+029.json"},"geometricError": 62.1966519849389}, {"boundingVolume": {"box": [-3872.03454589844, 628.938293457031, 18.1283311843872, 50.4095458984375, 0, 0, 0, 30.4552612304688, 0, 0, 0, 14.090537071228]},"content": {"uri": "Tile_+003_+030/Tile_+003_+030.json"},"geometricError": 60.5573157368986}, {"boundingVolume": {"box": [-3749.26013183594, 352.109008789063, 19.1447021961212, 26.1177978515625, 0, 0, 0, 46.5369567871094, 0, 0, 0, 15.1629683971405]},"content": {"uri": "Tile_+004_+027/Tile_+004_+027.json"},"geometricError": 55.4774127211521}, {"boundingVolume": {"box": [-3740.12866210938, 448.188674926758, 9.04387199878693, 17.607421875, 0, 0, 0, 50.3167572021484, 0, 0, 0, 5.57954967021942]},"content": {"uri": "Tile_+004_+028/Tile_+004_+028.json"},"geometricError": 53.5997083475893}, {"boundingVolume": {"box": [-3772.3740234375, 548.456268310547, 19.1229840517044, 50.480712890625, 0, 0, 0, 50.5904846191406, 0, 0, 0, 15.4035738706589]},"content": {"uri": "Tile_+004_+029/Tile_+004_+029.json"},"geometricError": 73.1092989703366}, {"boundingVolume": {"box": [-3772.05346679688, 619.552154541016, 18.2076432704926, 50.41162109375, 0, 0, 0, 21.6935119628906, 0, 0, 0, 14.1500952243805]},"content": {"uri": "Tile_+004_+030/Tile_+004_+030.json"},"geometricError": 56.6759666652712}, {"boundingVolume": {"box": [-3689.02783203125, 297.003692626953, 10.0964844226837, 5.725341796875, 0, 0, 0, 1.25363159179688, 0, 0, 0, 4.35963416099548]},"content": {"uri": "Tile_+005_+026/Tile_+005_+026.json"},"geometricError": 7.30462462257396}, {"boundingVolume": {"box": [-3673.70959472656, 348.031799316406, 12.3951093554497, 50.5650634765625, 0, 0, 0, 50.4035339355469, 0, 0, 0, 10.4135625958443]},"content": {"uri": "Tile_+005_+027/Tile_+005_+027.json"},"geometricError": 72.1511203206034}, {"boundingVolume": {"box": [-3673.11413574219, 447.839309692383, 6.34941649436951, 50.5919189453125, 0, 0, 0, 50.5899505615234, 0, 0, 0, 10.5448610782623]},"content": {"uri": "Tile_+005_+028/Tile_+005_+028.json"},"geometricError": 72.3192882676973}, {"boundingVolume": {"box": [-3672.49230957031, 547.832534790039, 18.5858655571938, 50.5924072265625, 0, 0, 0, 50.5895843505859, 0, 0, 0, 16.6763414740562]},"content": {"uri": "Tile_+005_+029/Tile_+005_+029.json"},"geometricError": 73.4642639567206}, {"boundingVolume": {"box": [-3671.8740234375, 647.7919921875, 11.636326789856, 50.582763671875, 0, 0, 0, 50.5528564453125, 0, 0, 0, 21.4873533248901]},"content": {"uri": "Tile_+005_+030/Tile_+005_+030.json"},"geometricError": 74.6720404728155}, {"boundingVolume": {"box": [-3665.76831054688, 730.397674560547, 12.528514623642, 44.778076171875, 0, 0, 0, 33.1688537597656, 0, 0, 0, 19.6651880741119]},"content": {"uri": "Tile_+005_+031/Tile_+005_+031.json"},"geometricError": 59.0928810211615}, {"boundingVolume": {"box": [-3622.38244628906, 395.646423339844, 5.87387609481812, 1.3489990234375, 0, 0, 0, 2.1663818359375, 0, 0, 0, 0.234408378601074]},"content": {"uri": "Tile_+006_+027/Tile_+006_+027.json"},"geometricError": 2.56280235528877}, {"boundingVolume": {"box": [-3591.23608398438, 447.522384643555, 11.8303036689758, 32.471923828125, 0, 0, 0, 50.2840118408203, 0, 0, 0, 7.67854261398315]},"content": {"uri": "Tile_+006_+028/Tile_+006_+028.json"},"geometricError": 60.3478889488445}, {"boundingVolume": {"box": [-3572.49584960938, 547.324279785156, 11.0218200683594, 50.58984375, 0, 0, 0, 50.475830078125, 0, 0, 0, 21.2449989318848]},"content": {"uri": "Tile_+006_+029/Tile_+006_+029.json"},"geometricError": 74.5552928526268}, {"boundingVolume": {"box": [-3571.88171386719, 647.205322265625, 10.7785501480103, 50.5970458984375, 0, 0, 0, 50.5909423828125, 0, 0, 0, 22.133563041687]},"content": {"uri": "Tile_+006_+030/Tile_+006_+030.json"},"geometricError": 74.8959219033318}, {"boundingVolume": {"box": [-3571.29382324219, 746.071563720703, 18.3907251358032, 50.5609130859375, 0, 0, 0, 49.4609680175781, 0, 0, 0, 14.5039548873901]},"content": {"uri": "Tile_+006_+031/Tile_+006_+031.json"},"geometricError": 72.2022021595952}, {"boundingVolume": {"box": [-3509.61206054688, 576.114654541016, 6.37169981002808, 13.11669921875, 0, 0, 0, 21.0632019042969, 0, 0, 0, 1.91424798965454]},"content": {"uri": "Tile_+007_+029/Tile_+007_+029.json"},"geometricError": 24.8871576967365}, {"boundingVolume": {"box": [-3478.34790039063, 646.816314697266, 16.745255947113, 44.12158203125, 0, 0, 0, 50.3578186035156, 0, 0, 0, 12.6729989051819]},"content": {"uri": "Tile_+007_+030/Tile_+007_+030.json"},"geometricError": 68.1412415259338}, {"boundingVolume": {"box": [-3471.40478515625, 741.000762939453, 17.6509721279144, 50.4560546875, 0, 0, 0, 44.9321594238281, 0, 0, 0, 13.3580210208893]},"content": {"uri": "Tile_+007_+031/Tile_+007_+031.json"},"geometricError": 68.8705243969495}, {"boundingVolume": {"box": [-3412.68273925781, 734.155242919922, 10.6947717666626, 9.0433349609375, 0, 0, 0, 17.5325012207031, 0, 0, 0, 5.41533184051514]},"content": {"uri": "Tile_+008_+031/Tile_+008_+031.json"},"geometricError": 20.4571827291191}],"geometricError": 740.579323830987}],"geometricError": 740.579323830987,"transform": [-0.860048066843865, -0.510213017001851, 0.0, 0.0, 0.268197168561964, -0.452090496848062, 0.850696456695934, 0.0, -0.434036405723617, 0.731639843052264, 0.525657244376012, 0.0, -2770907.60361716, 4670821.10507043, 3333353.96012987, 1.0]}
}
bb/tileset.json
{"asset": {"generatetool": "cesiumlab2@www.cesiumlab.com/osgb2tiles3","version": "1.0"},"geometricError": 700.379674431607,"root": {"boundingVolume": {"box": [1678.00695800781, -167.3508644104, 14.9421647787094, 237.2333984375, 0, 0, 0, 257.251705169678, 0, 0, 0, 13.2210794687271]},"children": [{"boundingVolume": {"box": [1678.00695800781, -167.3508644104, 14.9421647787094, 237.2333984375, 0, 0, 0, 257.251705169678, 0, 0, 0, 13.2210794687271]},"children": [{"boundingVolume": {"box": [1456.77575683594, -283.401695251465, 9.57817316055298, 16.002197265625, 0, 0, 0, 49.5448379516602, 0, 0, 0, 5.28457307815552]},"content": {"uri": "Tile_+056_+021/Tile_+056_+021.json"},"geometricError": 52.3324755539293}, {"boundingVolume": {"box": [1471.31585693359, -229.578811645508, 4.45599508285522, 1.51898193359375, 0, 0, 0, 4.85548400878906, 0, 0, 0, 0.0174999237060547]},"content": {"uri": "Tile_+056_+022/Tile_+056_+022.json"},"geometricError": 5.08756693533562}, {"boundingVolume": {"box": [1531.82299804688, -348.998123168945, 10.2060108184814, 40.3277587890625, 0, 0, 0, 14.9526214599609, 0, 0, 0, 6.00887680053711]},"content": {"uri": "Tile_+057_+020/Tile_+057_+020.json"},"geometricError": 43.4282813138826}, {"boundingVolume": {"box": [1522.18682861328, -284.460159301758, 9.90673196315765, 50.5840454101563, 0, 0, 0, 50.5893402099609, 0, 0, 0, 8.18564665317535]},"content": {"uri": "Tile_+057_+021/Tile_+057_+021.json"},"geometricError": 72.0071649495143}, {"boundingVolume": {"box": [1522.80364990234, -184.549896240234, 9.43511211872101, 50.5891723632813, 0, 0, 0, 50.506591796875, 0, 0, 0, 5.92474162578583]},"content": {"uri": "Tile_+057_+022/Tile_+057_+022.json"},"geometricError": 71.7306262252761}, {"boundingVolume": {"box": [1536.63287353516, -84.6287059783936, 10.7433174848557, 37.3843383789063, 0, 0, 0, 50.4350147247314, 0, 0, 0, 7.403111577034]},"content": {"uri": "Tile_+057_+023/Tile_+057_+023.json"},"geometricError": 63.2145990047746}, {"boundingVolume": {"box": [1548.78259277344, 15.3128070831299, 11.0693670511246, 25.8543701171875, 0, 0, 0, 50.38356590271, 0, 0, 0, 7.47109162807465]},"content": {"uri": "Tile_+057_+024/Tile_+057_+024.json"},"geometricError": 57.120656310518}, {"boundingVolume": {"box": [1557.44226074219, 77.4114685058594, 8.79704344272614, 17.3408203125, 0, 0, 0, 12.489372253418, 0, 0, 0, 5.12078511714935]},"content": {"uri": "Tile_+057_+025/Tile_+057_+025.json"},"geometricError": 21.9752339830746}, {"boundingVolume": {"box": [1621.77416992188, -364.557540893555, 10.4570751190186, 50.3675537109375, 0, 0, 0, 30.0714874267578, 0, 0, 0, 6.32948684692383]},"content": {"uri": "Tile_+058_+020/Tile_+058_+020.json"},"geometricError": 59.0020951037097}, {"boundingVolume": {"box": [1622.17553710938, -285.081962585449, 12.8714859485626, 50.5882568359375, 0, 0, 0, 50.5891189575195, 0, 0, 0, 8.59081149101257]},"content": {"uri": "Tile_+058_+021/Tile_+058_+021.json"},"geometricError": 72.0571490462324}, {"boundingVolume": {"box": [1622.79650878906, -185.08927154541, 13.1854486465454, 50.589111328125, 0, 0, 0, 50.5890426635742, 0, 0, 0, 8.58977794647217]},"content": {"uri": "Tile_+058_+022/Tile_+058_+022.json"},"geometricError": 72.057572175005}, {"boundingVolume": {"box": [1623.42102050781, -85.0964012145996, 10.2867512702942, 50.5892333984375, 0, 0, 0, 50.5891151428223, 0, 0, 0, 5.54497861862183]},"content": {"uri": "Tile_+058_+023/Tile_+058_+023.json"},"geometricError": 71.7584552136979}, {"boundingVolume": {"box": [1624.04296875, 14.8963890075684, 10.8929178714752, 50.5892333984375, 0, 0, 0, 50.5891761779785, 0, 0, 0, 6.47345900535583]},"content": {"uri": "Tile_+058_+024/Tile_+058_+024.json"},"geometricError": 71.8362092102733}, {"boundingVolume": {"box": [1624.42224121094, 76.6347541809082, 9.87600064277649, 50.348876953125, 0, 0, 0, 12.3346061706543, 0, 0, 0, 5.74333453178406]},"content": {"uri": "Tile_+058_+025/Tile_+058_+025.json"},"geometricError": 52.1549404310852}, {"boundingVolume": {"box": [1721.67340087891, -379.611175537109, 16.0873470306396, 50.4609985351563, 0, 0, 0, 44.5035400390625, 0, 0, 0, 12.0758972167969]},"content": {"uri": "Tile_+059_+020/Tile_+059_+020.json"},"geometricError": 68.3571850119951}, {"boundingVolume": {"box": [1722.16735839844, -285.70393371582, 5.40806865692139, 50.589111328125, 0, 0, 0, 50.5890960693359, 0, 0, 0, 0.90021276473999]},"content": {"uri": "Tile_+059_+021/Tile_+059_+021.json"},"geometricError": 71.5494598798882}, {"boundingVolume": {"box": [1722.79113769531, -185.71117401123, 12.7560157775879, 50.5909423828125, 0, 0, 0, 50.5891342163086, 0, 0, 0, 8.14298439025879]},"content": {"uri": "Tile_+059_+022/Tile_+059_+022.json"},"geometricError": 72.0070284535943}, {"boundingVolume": {"box": [1723.41357421875, -85.7185573577881, 12.8922352790833, 50.5914306640625, 0, 0, 0, 50.5892429351807, 0, 0, 0, 8.30024099349976]},"content": {"uri": "Tile_+059_+023/Tile_+059_+023.json"},"geometricError": 72.025400782929}, {"boundingVolume": {"box": [1724.03527832031, 14.2743854522705, 13.8084480762482, 50.5885009765625, 0, 0, 0, 50.5892391204834, 0, 0, 0, 9.1709201335907]},"content": {"uri": "Tile_+059_+024/Tile_+059_+024.json"},"geometricError": 72.1288660796897}, {"boundingVolume": {"box": [1724.40911865234, 75.4231605529785, 11.6732699871063, 50.3403930664063, 0, 0, 0, 11.7451057434082, 0, 0, 0, 7.08151745796204]},"content": {"uri": "Tile_+059_+025/Tile_+059_+025.json"},"geometricError": 52.1751911593196}, {"boundingVolume": {"box": [1797.44390869141, -380.166076660156, 13.3256312608719, 26.4188842773438, 0, 0, 0, 44.4364929199219, 0, 0, 0, 9.40558898448944]},"content": {"uri": "Tile_+060_+020/Tile_+060_+020.json"},"geometricError": 52.5454513124314}, {"boundingVolume": {"box": [1812.28704833984, -286.175262451172, 11.5870990753174, 40.7161254882813, 0, 0, 0, 50.4384155273438, 0, 0, 0, 7.63290023803711]},"content": {"uri": "Tile_+060_+021/Tile_+060_+021.json"},"geometricError": 65.2694247081303}, {"boundingVolume": {"box": [1822.78210449219, -186.271453857422, 15.3006939888, 50.5889892578125, 0, 0, 0, 50.5271301269531, 0, 0, 0, 11.2427039146423]},"content": {"uri": "Tile_+060_+022/Tile_+060_+022.json"},"geometricError": 72.3784160113043}, {"boundingVolume": {"box": [1823.40588378906, -86.3404502868652, 12.5961084365845, 50.58740234375, 0, 0, 0, 50.5890693664551, 0, 0, 0, 8.5899076461792]},"content": {"uri": "Tile_+060_+023/Tile_+060_+023.json"},"geometricError": 72.0564065758371}, {"boundingVolume": {"box": [1824.02978515625, 13.6523685455322, 15.3824796676636, 50.5882568359375, 0, 0, 0, 50.5891551971436, 0, 0, 0, 11.0295190811157]},"content": {"uri": "Tile_+060_+024/Tile_+060_+024.json"},"geometricError": 72.3884289401293}, {"boundingVolume": {"box": [1824.38507080078, 73.7163772583008, 9.60402154922485, 50.3248901367188, 0, 0, 0, 10.6603164672852, 0, 0, 0, 5.04884958267212]},"content": {"uri": "Tile_+060_+025/Tile_+060_+025.json"},"geometricError": 51.6887588994351}, {"boundingVolume": {"box": [1873.77648925781, -141.348236083984, 4.44181227684021, 1.0274658203125, 0, 0, 0, 4.982177734375, 0, 0, 0, 0.262368440628052]},"content": {"uri": "Tile_+061_+022/Tile_+061_+022.json"},"geometricError": 5.09378230664111}, {"boundingVolume": {"box": [1883.65350341797, -86.6555309295654, 9.82255268096924, 10.8458862304688, 0, 0, 0, 50.2822132110596, 0, 0, 0, 5.70098972320557]},"content": {"uri": "Tile_+061_+023/Tile_+061_+023.json"},"geometricError": 51.7536037136625}, {"boundingVolume": {"box": [1893.34643554688, 13.2779121398926, 10.3329606056213, 19.9166259765625, 0, 0, 0, 50.3416175842285, 0, 0, 0, 6.1720118522644]},"content": {"uri": "Tile_+061_+024/Tile_+061_+024.json"},"geometricError": 54.4889363228122}, {"boundingVolume": {"box": [1894.64739990234, 70.7054080963135, 9.54776215553284, 20.5929565429688, 0, 0, 0, 7.8891658782959, 0, 0, 0, 5.28816103935242]},"content": {"uri": "Tile_+061_+025/Tile_+061_+025.json"},"geometricError": 22.6775978581064}],"geometricError": 700.379674431607}],"geometricError": 700.379674431607,"transform": [-0.860048066843865, -0.510213017001851, 0.0, 0.0, 0.268197168561964, -0.452090496848062, 0.850696456695934, 0.0, -0.434036405723617, 0.731639843052264, 0.525657244376012, 0.0, -2770907.60361716, 4670821.10507043, 3333353.96012987, 1.0]}
}
cc/tileset.json
{"asset": {"generatetool": "cesiumlab2@www.cesiumlab.com/osgb2tiles3","version": "1.0"},"geometricError": 440.204868379572,"root": {"boundingVolume": {"box": [1399.13610839844, -98.4928131103516, 17.3625670671463, 113.360473632813, 0, 0, 0, 188.134658813477, 0, 0, 0, 14.1362904310226]},"children": [{"boundingVolume": {"box": [1399.13610839844, -98.4928131103516, 17.3625670671463, 113.360473632813, 0, 0, 0, 188.134658813477, 0, 0, 0, 14.1362904310226]},"children": [{"boundingVolume": {"box": [1329.28283691406, -251.359550476074, 16.0720038414001, 43.5072021484375, 0, 0, 0, 18.6329727172852, 0, 0, 0, 11.7183384895325]},"content": {"uri": "Tile_+055_+021/Tile_+055_+021.json"},"geometricError": 48.7584225341977}, {"boundingVolume": {"box": [1330.76959228516, -183.34806060791, 17.4266179800034, 42.6410522460938, 0, 0, 0, 50.4650802612305, 0, 0, 0, 14.0722395181656]},"content": {"uri": "Tile_+055_+022/Tile_+055_+022.json"},"geometricError": 67.5500672648307}, {"boundingVolume": {"box": [1343.38549804688, -83.4295806884766, 13.3076241016388, 30.647216796875, 0, 0, 0, 50.3902435302734, 0, 0, 0, 8.86118960380554]},"content": {"uri": "Tile_+055_+023/Tile_+055_+023.json"},"geometricError": 59.6401645003559}, {"boundingVolume": {"box": [1355.99951171875, 16.4887676239014, 12.5251359939575, 18.6517333984375, 0, 0, 0, 50.3155078887939, 0, 0, 0, 8.38973331451416]},"content": {"uri": "Tile_+055_+024/Tile_+055_+024.json"},"geometricError": 54.3132131065945}, {"boundingVolume": {"box": [1368.37573242188, 77.9040107727051, 6.60480356216431, 6.41845703125, 0, 0, 0, 11.7378349304199, 0, 0, 0, 2.24518442153931]},"content": {"uri": "Tile_+055_+025/Tile_+055_+025.json"},"geometricError": 13.5651838396135}, {"boundingVolume": {"box": [1407.76196289063, -259.938575744629, 15.907214641571, 35.7642822265625, 0, 0, 0, 26.6888961791992, 0, 0, 0, 11.5050873756409]},"content": {"uri": "Tile_+056_+021/Tile_+056_+021.json"},"geometricError": 46.0841415018922}, {"boundingVolume": {"box": [1421.63781738281, -183.753875732422, 17.1668101549149, 49.4112548828125, 0, 0, 0, 50.4975280761719, 0, 0, 0, 13.9405335187912]},"content": {"uri": "Tile_+056_+022/Tile_+056_+022.json"},"geometricError": 72.0125747747334}, {"boundingVolume": {"box": [1423.4345703125, -83.8446617126465, 13.146103978157, 50.58740234375, 0, 0, 0, 50.5813941955566, 0, 0, 0, 9.23278701305389]},"content": {"uri": "Tile_+056_+023/Tile_+056_+023.json"},"geometricError": 72.1304864165157}, {"boundingVolume": {"box": [1424.056640625, 16.1404838562012, 14.5895075798035, 50.58740234375, 0, 0, 0, 50.5891609191895, 0, 0, 0, 10.2280697822571]},"content": {"uri": "Tile_+056_+024/Tile_+056_+024.json"},"geometricError": 72.2700621963674}, {"boundingVolume": {"box": [1424.43774414063, 77.5803565979004, 13.805157661438, 50.35009765625, 0, 0, 0, 12.0362205505371, 0, 0, 0, 9.49176692962646]},"content": {"uri": "Tile_+056_+025/Tile_+056_+025.json"},"geometricError": 52.6317069700521}, {"boundingVolume": {"box": [1482.11926269531, -79.1935214996338, 5.75612854957581, 9.2208251953125, 0, 0, 0, 45.3083171844482, 0, 0, 0, 1.68560910224915]},"content": {"uri": "Tile_+057_+023/Tile_+057_+023.json"},"geometricError": 46.2677911879815}, {"boundingVolume": {"box": [1490.83251953125, 15.7759399414063, 12.0768136978149, 17.3740234375, 0, 0, 0, 50.3316650390625, 0, 0, 0, 8.07517910003662]},"content": {"uri": "Tile_+057_+024/Tile_+057_+024.json"},"geometricError": 53.8548207081674}, {"boundingVolume": {"box": [1493.28857421875, 77.2821998596191, 9.15342235565186, 19.2080078125, 0, 0, 0, 11.946231842041, 0, 0, 0, 4.94451904296875]},"content": {"uri": "Tile_+057_+025/Tile_+057_+025.json"},"geometricError": 23.1540123502415}],"geometricError": 440.204868379572}],"geometricError": 440.204868379572,"transform": [-0.860048066843865, -0.510213017001851, 0.0, 0.0, 0.268197168561964, -0.452090496848062, 0.850696456695934, 0.0, -0.434036405723617, 0.731639843052264, 0.525657244376012, 0.0, -2770907.60361716, 4670821.10507043, 3333353.96012987, 1.0]}
}
dd/tileset.json
{"asset": {"generatetool": "cesiumlab2@www.cesiumlab.com/osgb2tiles3","version": "1.0"},"geometricError": 371.970268249901,"root": {"boundingVolume": {"box": [-1300.84271240234, -886.116760253906, -6.17444896697998, 139.575012207031, 0, 0, 0, 116.933471679688, 0, 0, 0, 37.8926019668579]},"children": [{"boundingVolume": {"box": [-1300.84271240234, -886.116760253906, -6.17444896697998, 139.575012207031, 0, 0, 0, 116.933471679688, 0, 0, 0, 37.8926019668579]},"children": [{"boundingVolume": {"box": [-1391.99407958984, -933.559753417969, 14.0356489419937, 48.4236450195313, 0, 0, 0, 48.149169921875, 0, 0, 0, 11.1117585897446]},"content": {"uri": "Tile_+025_+004/Tile_+025_+004.json"},"geometricError": 69.1857148557412}, {"boundingVolume": {"box": [-1369.02563476563, -852.159057617188, 2.13443279266357, 25.9090576171875, 0, 0, 0, 34.1532592773438, 0, 0, 0, 21.7199869155884]},"content": {"uri": "Tile_+025_+005/Tile_+025_+005.json"},"geometricError": 48.0570725022815}, {"boundingVolume": {"box": [-1299.24267578125, -994.438171386719, 9.6319876909256, 32.385498046875, 0, 0, 0, 8.612060546875, 0, 0, 0, 5.9280823469162]},"content": {"uri": "Tile_+026_+003/Tile_+026_+003.json"},"geometricError": 34.0313125065579}, {"boundingVolume": {"box": [-1294.17193603516, -936.282165527344, 16.2041157484055, 50.5923461914063, 0, 0, 0, 50.5336303710938, 0, 0, 0, 12.6391478776932]},"content": {"uri": "Tile_+026_+004/Tile_+026_+004.json"},"geometricError": 72.6152969470457}, {"boundingVolume": {"box": [-1293.55456542969, -836.444793701172, 6.14014911651611, 50.57958984375, 0, 0, 0, 50.5338439941406, 0, 0, 0, 25.3308382034302]},"content": {"uri": "Tile_+026_+005/Tile_+026_+005.json"},"geometricError": 75.852591660895}, {"boundingVolume": {"box": [-1292.90478515625, -778.007720947266, 15.3367151618004, 27.361083984375, 0, 0, 0, 8.82443237304688, 0, 0, 0, 13.8531003594398]},"content": {"uri": "Tile_+026_+006/Tile_+026_+006.json"},"geometricError": 31.9125040238965}, {"boundingVolume": {"box": [-1219.70953369141, -920.958221435547, 15.8824429512024, 24.8853149414063, 0, 0, 0, 34.5433654785156, 0, 0, 0, 12.3139815330505]},"content": {"uri": "Tile_+027_+004/Tile_+027_+004.json"},"geometricError": 44.3188124785806}, {"boundingVolume": {"box": [-1202.70550537109, -841.645172119141, -6.17444896697998, 41.4378051757813, 0, 0, 0, 45.6526794433594, 0, 0, 0, 37.8926019668579]},"content": {"uri": "Tile_+027_+005/Tile_+027_+005.json"},"geometricError": 72.3678666395718}],"geometricError": 371.970268249901}],"geometricError": 371.970268249901,"transform": [-0.859624213482753, -0.510926816280138, 0.0, 0.0, 0.268445326760204, -0.451653926798071, 0.850850067255383, 0.0, -0.434722115994534, 0.731411319856156, 0.525408567737061, 0.0, -2775282.77578321, 4669358.11021673, 3331774.10493865, 1.0]}
}
ee/tileset.json
{"asset": {"generatetool": "cesiumlab2@www.cesiumlab.com/osgb2tiles3","version": "1.0"},"geometricError": 221.861093368121,"root": {"boundingVolume": {"box": [24.9149742126465, 458.556976318359, 5.52865505218506, 97.6052131652832, 0, 0, 0, 49.4085388183594, 0, 0, 0, 18.3740262985229]},"children": [{"boundingVolume": {"box": [24.9149742126465, 458.556976318359, 5.52865505218506, 97.6052131652832, 0, 0, 0, 49.4085388183594, 0, 0, 0, 18.3740262985229]},"children": [{"boundingVolume": {"box": [-53.5235767364502, 460.995025634766, 4.8595757484436, 19.1666622161865, 0, 0, 0, 44.6980590820313, 0, 0, 0, 17.1172251701355]},"content": {"uri": "Tile_+038_+018/Tile_+038_+018.json"},"geometricError": 51.5584796491835}, {"boundingVolume": {"box": [-49.5933418273926, 506.448089599609, 3.60871529579163, 15.2364234924316, 0, 0, 0, 1.51742553710938, 0, 0, 0, 0.110045909881592]},"content": {"uri": "Tile_+038_+019/Tile_+038_+019.json"},"geometricError": 15.3121941995155}, {"boundingVolume": {"box": [15.0548553466797, 457.191497802734, 5.52865505218506, 50.5630187988281, 0, 0, 0, 48.0430603027344, 0, 0, 0, 18.3740262985229]},"content": {"uri": "Tile_+039_+018/Tile_+039_+018.json"},"geometricError": 72.1273828425906}, {"boundingVolume": {"box": [-33.1613292694092, 505.072769165039, 3.53735184669495, 1.75724983215332, 0, 0, 0, 0.161758422851563, 0, 0, 0, 0.157356977462769]},"content": {"uri": "Tile_+039_+019/Tile_+039_+019.json"},"geometricError": 1.77168111643222}, {"boundingVolume": {"box": [93.4946136474609, 456.362838745117, 5.13061237335205, 29.0255737304688, 0, 0, 0, 45.5960540771484, 0, 0, 0, 17.7045965194702]},"content": {"uri": "Tile_+040_+018/Tile_+040_+018.json"},"geometricError": 56.8765049533316}],"geometricError": 221.861093368121}],"geometricError": 221.861093368121,"transform": [-0.859624213482753, -0.510926816280138, 0.0, 0.0, 0.268445326760204, -0.451653926798071, 0.850850067255383, 0.0, -0.434722115994534, 0.731411319856156, 0.525408567737061, 0.0, -2775282.77578321, 4669358.11021673, 3331774.10493865, 1.0]}
}
js源码:
// *****************************************************
// 功能:合并多个三维瓦片图层。
// +文件系统:
// -+合并图层目录
// --源图层目录符号链接...
// -+入口文件:tileset.json
// --+配置对象
// ----asset:预设对象
// ----geometricError:几何误差
// ---+root:场景根对象
// ----+boundingVolume:边界框对象
// ------box:包围盒数组
// ----+children:子对象数组
// -----+源图层子对象...
// ------+boundingVolume:子对象边界框对象
// --------box:子对象包围盒数组
// ------+content:子对象内容
// --------uri:子对象json|b3dm文件路径
// -------geometricError:子对象几何误差
// -------transform:子对象转换矩阵数组
// -----geometricError:几何误差
// -----transform:转换矩阵数组
// 算法:
// / 1: 判断合并图层目录是否存在,非追加时如已存在则在确认后清空,如不确认则退出,如不存在则创建。
// / 2:依次合并源图层目录。
// / 2.1:在合并图层目录下创建各源图层目录的符号链接。
// / 2.2:依次合并各图层的tileset文件。
// / 2.2.1:首次新建或读取图层配置对象。
// / 2.2.2:非追加合并:取首个源图层配置对象中的转换矩阵为全局转换矩阵。
// / 2.2.3:计算源图层配置对象中子对象的转换矩阵:全局转换矩阵的逆矩阵 x源图层配置对象的转换矩阵。
// / 2.2.4:将源图层配置对象中的子对象放入,并修改uri属性和符号链接对应。
// / 2.2.5:计算图层配置对象的外围框属性值:外围框坐标:(最大坐标+最小坐标)/2,外围框半长:(最大坐标-最小坐标)/2。
// / 2.2.6:计算图层配置对象的外围框几何误差值:外围框外包圆的直径。
// / 2.3:保存tileset文件。
// 用法:node 3DTileJoin <是否追加合并:1|0> <合并图层目录> <源图层目录>,...
// 输出:
// / 开始合并<合并图层目录>...
// / <源图层目录>已合并。
// *****************************************************// 导入模块
const $m=
{fs: require( "fs"),path: require( "path"),readline: require( "readline")
};
$m.matrix= new Matrix();// 执行主函数
main();// ******************* 【函数:主函数】 *********************
function main()
{// ================== 取命令行参数 =================var argIdx= 2; // 初始化参数索引// 取参数:是否追加合并var isAppend= process.argv[ argIdx++];if( !isAppend)return argErr( "缺少是否追加合并参数!");isAppend= isAppend== 1? true: isAppend== 0? false: null;if( isAppend== null)return argErr( "是否追加合并参数错误!");// 取参数:合并图层目录var joinLayerPath= process.argv[ argIdx++];if( !joinLayerPath)return argErr( "缺少合并图层目录参数!");joinLayerPath= $m.path.resolve( joinLayerPath); // 合并图层目录转绝对路径// 取参数:源图层目录var srcLayerPaths= delBlk( ( process.argv[ argIdx++]|| "").split( ",")); // 删除空值if( !srcLayerPaths.length)return argErr( "缺少源图层目录参数!");// 源图层目录转绝对路径for( var i= 0; i< srcLayerPaths.length; i++)srcLayerPaths[ i]= $m.path.resolve( srcLayerPaths[ i]);// 检测:源图层目录是否存在、源图层目录是否重复for( var i= 0, srcLayerPathm= {}; i< srcLayerPaths.length; i++){var srcLayerPath= srcLayerPaths[ i];if( !$m.fs.existsSync( srcLayerPath))return stdout( "源图层目录不存在:"+ srcLayerPath);else if( srcLayerPathm[ srcLayerPath])return stdout( "源图层目录重复:"+ srcLayerPath);elsesrcLayerPathm[ srcLayerPath]= 1;}// ================== 新建合并图层目录 ==================// 合并图层目录已存在且非追加:确认后清空var isExit= $m.fs.existsSync( joinLayerPath);if( isExit&& !isAppend){// 创建读行器var rl= $m.readline.createInterface({input: process.stdin,output: process.stdout});// 输入参数:是否删除目录rl.question( "请确认是否需要清空此目录:"+ joinLayerPath+ "?(Y/N)  ", function( answer){rl.close(), answer= answer.toUpperCase();answer== "Y"? ( emptyDir( joinLayerPath), joinLayer()) // 确认:清空: answer== "N"? stdout( "未确认!退出。") //: stdout( "输入错误!退出。"); // 不确认:退出});}// 合并图层目录不存在:创建else!isExit&& $m.fs.mkdirSync( joinLayerPath), isAppend= false, joinLayer(); // 创建目录,强制为非追加// 函数:合并图层function joinLayer(){var joinCfgo, joinTrsfInv; // 定义合并图层配置对象、合并图层转换矩阵的逆矩阵stdout( "开始合并"+ joinLayerPath+ "..."); // 输出:开始合并图层目录...// 依次合并源图层目录for( var i= 0; i< srcLayerPaths.length; i++){var srcLayerPath= srcLayerPaths[ i], srcLayerNm= $m.path.parse( srcLayerPath).name; // 源图层路径、源图层目录名var joinLinkPath= $m.path.join( joinLayerPath, srcLayerNm); // 合并图层链接路径(合并图层链接/源图层目录名)// 创建源图层符号链接isSymLinkSync( joinLinkPath)&& $m.fs.unlinkSync( joinLinkPath); // 源图层已存在:删除原先的符号链接$m.fs.symlinkSync( srcLayerPath, joinLinkPath);// 读取源图层的配置文件var srcCfgo= readJsonFile( $m.path.join( srcLayerPath, "tileset.json"));if( !srcCfgo)continue; // 读取失败:继续下一个// 首次:生成合并图层配置对象、取合并图层转换矩阵的逆矩阵!i&& ( joinCfgo= !isAppend? // 非追加:初始化配置对象{"asset": srcCfgo.asset,"geometricError": 0.0,"root":{"boundingVolume":{"box": []},"children": [],"geometricError": 0.0,"transform": srcCfgo.root.transform}}: readJsonFile( $m.path.join( joinLayerPath, "tileset.json")) // 追加:从合并图层中读取, joinTrsfInv= $m.matrix.inv( $m.matrix.dConver( joinCfgo.root.transform))); // 取合并图层转换矩阵的逆矩阵// 计算子对象的转换矩阵var srcTrsf= $m.matrix.dConver( $m.matrix.mul( joinTrsfInv, $m.matrix.dConver( srcCfgo.root.transform)));// 设置源图层子对象的转换矩阵var srcRtChos= srcCfgo.root.children;for( var l= 0; l< srcRtChos.length; l++){var srcRtCho= srcRtChos[ l];srcRtCho[ "transform"]= srcTrsf;// 替换uri开头为源图层目录名srcRtCho.content&& ( srcRtCho.content.uri= srcLayerNm+ "/"+ srcRtCho.content.uri);for( var j= 0; j< ( srcRtCho.children|| []).length; j++)srcRtCho.children[ j].content.uri= srcLayerNm+ "/"+ srcRtCho.children[ j].content.uri;// 合并源图层子对象for( var j= 0, chIdx= -1; j< joinCfgo.root.children.length&& chIdx== -1; j++){var joinRtCh= joinCfgo.root.children[ j];// 子对象无内层对象if( joinRtCh.content&& srcRtCho.content&& joinRtCh.content.uri== srcRtCho.content.uri){chIdx= j;continue;}// 子对象有内存对象else if( joinRtCh.children&& srcRtCho.children){for( var k= 0, found= false; k< joinRtCh.children.length&& !found; k++)joinRtCh.children[ k].content.uri!= srcRtCho.children[ k].content.uri&& ( found= true);!found&& ( chIdx= j);}}isAppend&& chIdx>= 0&& joinCfgo.root.children.splice( chIdx, 1); // 追加合并已存在源图层:覆盖joinCfgo.root.children.push( srcRtCho);}// 输出:源图层目录已合并stdout( srcLayerPath+ "已合并。");}// 计算合并图层配置对象外围框属性数值var joinRtChs= joinCfgo.root.children;// 最大的x坐标、最小的x坐标、最大的y坐标、最小的y坐标、最大的z坐标、最小的z坐标、最大的z轴半长var maxX= null, minX= null, maxY= null, minY= null, maxZ= null, minZ= null;for( var i= 0; i< joinRtChs.length; i++){var joinRtCh= joinRtChs[ i];var o= [ joinRtCh.boundingVolume.box[ 0]+ joinRtCh.transform[ 12], joinRtCh.boundingVolume.box[ 1]+ joinRtCh.transform[ 13], joinRtCh.boundingVolume.box[ 2]+ joinRtCh.transform[ 14]];var r= [ joinRtCh.boundingVolume.box[ 3], joinRtCh.boundingVolume.box[ 7], joinRtCh.boundingVolume.box[ 11]];var xa= [ o[ 0]- r[ 0], o[ 0]+ r[ 0]], ya= [ o[ 1]- r[ 1], o[ 1]+ r[ 1]], za= [ o[ 2]- r[ 2], o[ 2]+ r[ 2]];minX= !i? xa[ 0]: Math.min( xa[ 0], minX), maxX= !i? xa[ 1]: Math.max( xa[ 1], maxX);minY= !i? ya[ 0]: Math.min( ya[ 0], minY), maxY= !i? ya[ 1]: Math.max( ya[ 1], maxY);minZ= !i? za[ 0]: Math.min( za[ 0], minZ), maxZ= !i? za[ 1]: Math.max( za[ 1], maxZ);}// 计算:最外层包围盒x轴坐标、最外层包围盒y轴坐标、最外层包围盒z轴坐标var boxs= [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];boxs[ 0]= ( maxX+ minX)/ 2, boxs[ 1]= ( maxY+ minY)/ 2, boxs[ 2]= ( maxZ+ minZ)/ 2;// 计算:最外层包围盒x轴半长、最外层包围盒y轴半长、最外层包围盒z轴半长boxs[ 3]= ( maxX- minX)/ 2, boxs[ 7]= ( maxY- minY)/ 2, boxs[ 11]= ( maxZ- minZ)/ 2;joinCfgo.root.boundingVolume.box= boxs;// 计算:最外层包围盒几何误差值var geometricError= Math.sqrt( Math.pow( boxs[ 3], 2)+ Math.pow( boxs[ 7], 2))* 2;joinCfgo.geometricError= geometricError, joinCfgo.root.geometricError= geometricError;// 保存tileset文件try{$m.fs.writeFileSync( $m.path.join( joinLayerPath, "tileset.json"), JSON.stringify( joinCfgo));}catch( e){stdout( e);}// 提示完成stdout( "图层合并完成。");}// 函数:参数错误function argErr( err){var msg= err+ "\n用法:node 3DTileJoin <是否追加合并:1|0> <合并图层目录> <源图层目录>,...";stdout( msg);}// 函数:删除数组空元素function delBlk( items){for( var i= 0; i< items.length; i++)!items[ i].trim()&& items.splice( i--, 1);return items;}// 函数:判断文件是否为符号链接(考虑文件不存在的情况)function isSymLinkSync( path){var isSymLink= false;try{isSymLink= $m.fs.lstatSync( path).isSymbolicLink();}catch( e){return false;}return isSymLink;}
}// *********************【函数:标准输出】 ************************
function stdout( msg)
{console.log( msg);
}// *********************【函数:读取单个json文件内容】 ************************
function readJsonFile( path)
{try{var jsono= $m.fs.readFileSync( path), jsono= JSON.parse( jsono.toString());return jsono;}catch( e){stdout( e);stdout( "无法打开输入文件:"+ path);}
}// *********************【函数:清空目标目录】 ************************
function emptyDir( tarPath)
{var sons= $m.fs.readdirSync( tarPath);for( var i= 0; i< sons.length; i++){var son= sons[ i], sonPath= $m.path.join( tarPath, son);if( $m.fs.lstatSync( sonPath).isSymbolicLink()|| !$m.fs.statSync( sonPath).isDirectory())$m.fs.unlinkSync( sonPath);elseemptyDir( sonPath), $m.fs.rmdirSync( sonPath);}
}// 类:矩阵
function Matrix()
{var to= this;// ***********************【行列式】 ************************this.det= function( ms){// 矩阵阶数var n= ms.length, detVal= 0;// n阶矩阵求行列式if( n> 3){for( var column= 0; column< n; column++) // 去掉第 0行第column列的矩阵{var matrix= new Array( n- 1).fill( 0).map( function(){return new Array( n- 1).fill( 0);});for( var i= 0; i< n- 1; i++){for( var j= 0; j< n- 1; j++)j< column? matrix[ i][ j]= ms[ i+ 1][ j]: matrix[ i][ j]= ms[ i+ 1][ j+ 1];}detVal+= ms[ 0][ column]* Math.pow( -1, 0+ column)* to.det( matrix);}}// 3阶矩阵求行列式else if( n== 3)detVal= ms[ 0][ 0]* ms[ 1][ 1]* ms[ 2][ 2]+ ms[ 0][ 1]* ms[ 1][ 2]* ms[ 2][ 0] //+ ms[ 0][ 2]* ms[ 1][ 0]* ms[ 2][ 1]- ms[ 0][ 2]* ms[ 1][ 1]* ms[ 2][ 0] //- ms[ 0][ 1]* ms[ 1][ 0]* ms[ 2][ 2]- ms[ 0][ 0]* ms[ 1][ 2]* ms[ 2][ 1];// 2阶矩阵求行列式else if( n== 2)detVal= ms[ 0][ 0]* ms[ 1][ 1]- ms[ 0][ 1]* ms[ 1][ 0];// 1阶矩阵求行列式else if( n== 1)detVal= ms[ 0][ 0];return detVal;}// ************************* 【伴随矩阵】 *************************this.adjoint= function( ms){// 初始化二维矩阵(置零)var adjM= new Array( ms.length).fill( 0).map( function(){return new Array( ms.length).fill( 0);});// 求各位置的代数余子式for( var row= 0; row< ms.length; row++){for( var column= 0; column< ms.length; column++) // 去掉第 row 行第 column 列的矩阵{// 求各位置的余子式for( var i= 0, matrix= []; i< ms.length; i++){if( i!= row){for( var j= 0, arr= []; j< ms.length; j++)j!= column&& arr.push( ms[ i][ j]);matrix.push( arr);}}// 求代数余子式adjM[ row][ column]= Math.pow( -1, row+ column)* to.det( matrix);}}// 转置后返回return to.transpose( adjM);}// *********************** 【转置矩阵】 ************************this.transpose= function( ms){var transM= new Array( ms.length).fill( 0).map( function(){return new Array( ms[ 0].length).fill( 0);});for( var i= 0; i< transM.length; i++){for( var j= 0; j< transM[ 0].length; j++)transM[ i][ j]= ms[ j][ i];}return transM;}// *********************** 【逆矩阵】 ************************this.inv= function( ms){var detVal= to.det( ms), invM= to.adjoint( ms);for( var i= 0; i< invM.length; i++){for( var j= 0; j< invM.length; j++)invM[ i][ j]/= detVal;}return invM;}// ********************** 【矩阵相乘】 **********************this.mul= function( m1, m2){var m3= [];// 求m1的列数for( var i= 0, cn1= 0; i< m1.length; i++)cn1= Math.max( cn1, m1[ i].length);// 求m2的列数for( var i= 0, cn2= 0; i< m2.length; i++)cn2= Math.max( cn2, m2[ i].length);// 乘for( var i= 0; i< m1.length; i++){var l1= m1[ i], l3= m3[ i]= [];for( var j= 0; j< cn2; j++){l3[ j]= 0;for( var l= 0; l< cn1; l++)l3[ j]+= ( l1[ l]|| 0)* ( m2[ l][ j]|| 0);}}return m3;};// ********************** 【矩阵数组维度转换】 **********************// 一维矩阵数组转二维数组/二维矩阵数组转一维数组this.dConver= function( ms){var matrix, is2D= ms.every( function( item){return Array.isArray( item);});// 二维转一维if( is2D){matrix= new Array( Math.pow( ms.length, 2)).fill( 0);for( var i= 0; i< ms.length; i++){var rows= ms[ i];for( var j= 0; j< rows.length; j++)matrix[ i+ j* rows.length]= rows[ j];}}// 一维转二维else{var n= Math.sqrt( ms.length); // 矩阵阶数matrix= new Array( n).fill( 0).map( function(){return new Array( n).fill( 0);});for( var i= 0; i< ms.length; i++)matrix[ i% n][ parseInt( i/ n)]= ms[ i];}return matrix;}
}
运行命令:

node D:\JAVA\3dtiles\js\3DTileJoin2_test 0 D:\JAVA\3dtiles\js_test_success D:\JAVA\3dtiles\data\aa,D:\JAVA\3dtiles\data\bb,D:\JAVA\3dtiles\data\cc,D:\JAVA\3dtiles\data\dd,D:\JAVA\3dtiles\data\ee

生成结果:
{"asset": {"generatetool": "cesiumlab2@www.cesiumlab.com/osgb2tiles3","version": "1.0"},"geometricError": 9325.869057604898,"root": {"boundingVolume": {"box": [341.8290726169498, -1031.7488150345162, -5.334247002843764, 4289.988496445352, 0, 0, 0, 1827.2813467730307, 0, 0, 0, 40.59645403409377]},"children": [{"boundingVolume": {"box": [-3675.8994140625, 545.641296386719, 11.9535970687866, 272.260009765625, 0, 0, 0, 249.891235351563, 0, 0, 0, 23.3086099624634]},"children": [{"boundingVolume": {"box": [-3935.02001953125, 574.504516601563, 15.7210890054703, 13.139404296875, 0, 0, 0, 25.2759399414063, 0, 0, 0, 11.8160890340805]},"content": {"uri": "aa/Tile_+002_+029/Tile_+002_+029.json"},"geometricError": 30.8405098086856}, {"boundingVolume": {"box": [-3931.19152832031, 630.064575195313, 5.76587748527527, 9.6800537109375, 0, 0, 0, 30.9617309570313, 0, 0, 0, 1.63892340660095]},"content": {"uri": "aa/Tile_+002_+030/Tile_+002_+030.json"},"geometricError": 32.4810451438208}, {"boundingVolume": {"box": [-3872.32775878906, 566.557830810547, 15.5438475459814, 50.4261474609375, 0, 0, 0, 33.1085510253906, 0, 0, 0, 15.1476407200098]},"content": {"uri": "aa/Tile_+003_+029/Tile_+003_+029.json"},"geometricError": 62.1966519849389}, {"boundingVolume": {"box": [-3872.03454589844, 628.938293457031, 18.1283311843872, 50.4095458984375, 0, 0, 0, 30.4552612304688, 0, 0, 0, 14.090537071228]},"content": {"uri": "aa/Tile_+003_+030/Tile_+003_+030.json"},"geometricError": 60.5573157368986}, {"boundingVolume": {"box": [-3749.26013183594, 352.109008789063, 19.1447021961212, 26.1177978515625, 0, 0, 0, 46.5369567871094, 0, 0, 0, 15.1629683971405]},"content": {"uri": "aa/Tile_+004_+027/Tile_+004_+027.json"},"geometricError": 55.4774127211521}, {"boundingVolume": {"box": [-3740.12866210938, 448.188674926758, 9.04387199878693, 17.607421875, 0, 0, 0, 50.3167572021484, 0, 0, 0, 5.57954967021942]},"content": {"uri": "aa/Tile_+004_+028/Tile_+004_+028.json"},"geometricError": 53.5997083475893}, {"boundingVolume": {"box": [-3772.3740234375, 548.456268310547, 19.1229840517044, 50.480712890625, 0, 0, 0, 50.5904846191406, 0, 0, 0, 15.4035738706589]},"content": {"uri": "aa/Tile_+004_+029/Tile_+004_+029.json"},"geometricError": 73.1092989703366}, {"boundingVolume": {"box": [-3772.05346679688, 619.552154541016, 18.2076432704926, 50.41162109375, 0, 0, 0, 21.6935119628906, 0, 0, 0, 14.1500952243805]},"content": {"uri": "aa/Tile_+004_+030/Tile_+004_+030.json"},"geometricError": 56.6759666652712}, {"boundingVolume": {"box": [-3689.02783203125, 297.003692626953, 10.0964844226837, 5.725341796875, 0, 0, 0, 1.25363159179688, 0, 0, 0, 4.35963416099548]},"content": {"uri": "aa/Tile_+005_+026/Tile_+005_+026.json"},"geometricError": 7.30462462257396}, {"boundingVolume": {"box": [-3673.70959472656, 348.031799316406, 12.3951093554497, 50.5650634765625, 0, 0, 0, 50.4035339355469, 0, 0, 0, 10.4135625958443]},"content": {"uri": "aa/Tile_+005_+027/Tile_+005_+027.json"},"geometricError": 72.1511203206034}, {"boundingVolume": {"box": [-3673.11413574219, 447.839309692383, 6.34941649436951, 50.5919189453125, 0, 0, 0, 50.5899505615234, 0, 0, 0, 10.5448610782623]},"content": {"uri": "aa/Tile_+005_+028/Tile_+005_+028.json"},"geometricError": 72.3192882676973}, {"boundingVolume": {"box": [-3672.49230957031, 547.832534790039, 18.5858655571938, 50.5924072265625, 0, 0, 0, 50.5895843505859, 0, 0, 0, 16.6763414740562]},"content": {"uri": "aa/Tile_+005_+029/Tile_+005_+029.json"},"geometricError": 73.4642639567206}, {"boundingVolume": {"box": [-3671.8740234375, 647.7919921875, 11.636326789856, 50.582763671875, 0, 0, 0, 50.5528564453125, 0, 0, 0, 21.4873533248901]},"content": {"uri": "aa/Tile_+005_+030/Tile_+005_+030.json"},"geometricError": 74.6720404728155}, {"boundingVolume": {"box": [-3665.76831054688, 730.397674560547, 12.528514623642, 44.778076171875, 0, 0, 0, 33.1688537597656, 0, 0, 0, 19.6651880741119]},"content": {"uri": "aa/Tile_+005_+031/Tile_+005_+031.json"},"geometricError": 59.0928810211615}, {"boundingVolume": {"box": [-3622.38244628906, 395.646423339844, 5.87387609481812, 1.3489990234375, 0, 0, 0, 2.1663818359375, 0, 0, 0, 0.234408378601074]},"content": {"uri": "aa/Tile_+006_+027/Tile_+006_+027.json"},"geometricError": 2.56280235528877}, {"boundingVolume": {"box": [-3591.23608398438, 447.522384643555, 11.8303036689758, 32.471923828125, 0, 0, 0, 50.2840118408203, 0, 0, 0, 7.67854261398315]},"content": {"uri": "aa/Tile_+006_+028/Tile_+006_+028.json"},"geometricError": 60.3478889488445}, {"boundingVolume": {"box": [-3572.49584960938, 547.324279785156, 11.0218200683594, 50.58984375, 0, 0, 0, 50.475830078125, 0, 0, 0, 21.2449989318848]},"content": {"uri": "aa/Tile_+006_+029/Tile_+006_+029.json"},"geometricError": 74.5552928526268}, {"boundingVolume": {"box": [-3571.88171386719, 647.205322265625, 10.7785501480103, 50.5970458984375, 0, 0, 0, 50.5909423828125, 0, 0, 0, 22.133563041687]},"content": {"uri": "aa/Tile_+006_+030/Tile_+006_+030.json"},"geometricError": 74.8959219033318}, {"boundingVolume": {"box": [-3571.29382324219, 746.071563720703, 18.3907251358032, 50.5609130859375, 0, 0, 0, 49.4609680175781, 0, 0, 0, 14.5039548873901]},"content": {"uri": "aa/Tile_+006_+031/Tile_+006_+031.json"},"geometricError": 72.2022021595952}, {"boundingVolume": {"box": [-3509.61206054688, 576.114654541016, 6.37169981002808, 13.11669921875, 0, 0, 0, 21.0632019042969, 0, 0, 0, 1.91424798965454]},"content": {"uri": "aa/Tile_+007_+029/Tile_+007_+029.json"},"geometricError": 24.8871576967365}, {"boundingVolume": {"box": [-3478.34790039063, 646.816314697266, 16.745255947113, 44.12158203125, 0, 0, 0, 50.3578186035156, 0, 0, 0, 12.6729989051819]},"content": {"uri": "aa/Tile_+007_+030/Tile_+007_+030.json"},"geometricError": 68.1412415259338}, {"boundingVolume": {"box": [-3471.40478515625, 741.000762939453, 17.6509721279144, 50.4560546875, 0, 0, 0, 44.9321594238281, 0, 0, 0, 13.3580210208893]},"content": {"uri": "aa/Tile_+007_+031/Tile_+007_+031.json"},"geometricError": 68.8705243969495}, {"boundingVolume": {"box": [-3412.68273925781, 734.155242919922, 10.6947717666626, 9.0433349609375, 0, 0, 0, 17.5325012207031, 0, 0, 0, 5.41533184051514]},"content": {"uri": "aa/Tile_+008_+031/Tile_+008_+031.json"},"geometricError": 20.4571827291191}],"geometricError": 740.579323830987,"transform": [1, 0, 0, 0, 1.2432017357571995e-17, 1, -5.551115123125783e-17, 0, 1.1741393048713246e-17, 5.551115123125783e-17, 0.9999999999999998, 0, -2.7755747368212224e-10, 2.3283064365386963e-10, 0, 1]}, {"boundingVolume": {"box": [1678.00695800781, -167.3508644104, 14.9421647787094, 237.2333984375, 0, 0, 0, 257.251705169678, 0, 0, 0, 13.2210794687271]},"children": [{"boundingVolume": {"box": [1456.77575683594, -283.401695251465, 9.57817316055298, 16.002197265625, 0, 0, 0, 49.5448379516602, 0, 0, 0, 5.28457307815552]},"content": {"uri": "bb/Tile_+056_+021/Tile_+056_+021.json"},"geometricError": 52.3324755539293}, {"boundingVolume": {"box": [1471.31585693359, -229.578811645508, 4.45599508285522, 1.51898193359375, 0, 0, 0, 4.85548400878906, 0, 0, 0, 0.0174999237060547]},"content": {"uri": "bb/Tile_+056_+022/Tile_+056_+022.json"},"geometricError": 5.08756693533562}, {"boundingVolume": {"box": [1531.82299804688, -348.998123168945, 10.2060108184814, 40.3277587890625, 0, 0, 0, 14.9526214599609, 0, 0, 0, 6.00887680053711]},"content": {"uri": "bb/Tile_+057_+020/Tile_+057_+020.json"},"geometricError": 43.4282813138826}, {"boundingVolume": {"box": [1522.18682861328, -284.460159301758, 9.90673196315765, 50.5840454101563, 0, 0, 0, 50.5893402099609, 0, 0, 0, 8.18564665317535]},"content": {"uri": "bb/Tile_+057_+021/Tile_+057_+021.json"},"geometricError": 72.0071649495143}, {"boundingVolume": {"box": [1522.80364990234, -184.549896240234, 9.43511211872101, 50.5891723632813, 0, 0, 0, 50.506591796875, 0, 0, 0, 5.92474162578583]},"content": {"uri": "bb/Tile_+057_+022/Tile_+057_+022.json"},"geometricError": 71.7306262252761}, {"boundingVolume": {"box": [1536.63287353516, -84.6287059783936, 10.7433174848557, 37.3843383789063, 0, 0, 0, 50.4350147247314, 0, 0, 0, 7.403111577034]},"content": {"uri": "bb/Tile_+057_+023/Tile_+057_+023.json"},"geometricError": 63.2145990047746}, {"boundingVolume": {"box": [1548.78259277344, 15.3128070831299, 11.0693670511246, 25.8543701171875, 0, 0, 0, 50.38356590271, 0, 0, 0, 7.47109162807465]},"content": {"uri": "bb/Tile_+057_+024/Tile_+057_+024.json"},"geometricError": 57.120656310518}, {"boundingVolume": {"box": [1557.44226074219, 77.4114685058594, 8.79704344272614, 17.3408203125, 0, 0, 0, 12.489372253418, 0, 0, 0, 5.12078511714935]},"content": {"uri": "bb/Tile_+057_+025/Tile_+057_+025.json"},"geometricError": 21.9752339830746}, {"boundingVolume": {"box": [1621.77416992188, -364.557540893555, 10.4570751190186, 50.3675537109375, 0, 0, 0, 30.0714874267578, 0, 0, 0, 6.32948684692383]},"content": {"uri": "bb/Tile_+058_+020/Tile_+058_+020.json"},"geometricError": 59.0020951037097}, {"boundingVolume": {"box": [1622.17553710938, -285.081962585449, 12.8714859485626, 50.5882568359375, 0, 0, 0, 50.5891189575195, 0, 0, 0, 8.59081149101257]},"content": {"uri": "bb/Tile_+058_+021/Tile_+058_+021.json"},"geometricError": 72.0571490462324}, {"boundingVolume": {"box": [1622.79650878906, -185.08927154541, 13.1854486465454, 50.589111328125, 0, 0, 0, 50.5890426635742, 0, 0, 0, 8.58977794647217]},"content": {"uri": "bb/Tile_+058_+022/Tile_+058_+022.json"},"geometricError": 72.057572175005}, {"boundingVolume": {"box": [1623.42102050781, -85.0964012145996, 10.2867512702942, 50.5892333984375, 0, 0, 0, 50.5891151428223, 0, 0, 0, 5.54497861862183]},"content": {"uri": "bb/Tile_+058_+023/Tile_+058_+023.json"},"geometricError": 71.7584552136979}, {"boundingVolume": {"box": [1624.04296875, 14.8963890075684, 10.8929178714752, 50.5892333984375, 0, 0, 0, 50.5891761779785, 0, 0, 0, 6.47345900535583]},"content": {"uri": "bb/Tile_+058_+024/Tile_+058_+024.json"},"geometricError": 71.8362092102733}, {"boundingVolume": {"box": [1624.42224121094, 76.6347541809082, 9.87600064277649, 50.348876953125, 0, 0, 0, 12.3346061706543, 0, 0, 0, 5.74333453178406]},"content": {"uri": "bb/Tile_+058_+025/Tile_+058_+025.json"},"geometricError": 52.1549404310852}, {"boundingVolume": {"box": [1721.67340087891, -379.611175537109, 16.0873470306396, 50.4609985351563, 0, 0, 0, 44.5035400390625, 0, 0, 0, 12.0758972167969]},"content": {"uri": "bb/Tile_+059_+020/Tile_+059_+020.json"},"geometricError": 68.3571850119951}, {"boundingVolume": {"box": [1722.16735839844, -285.70393371582, 5.40806865692139, 50.589111328125, 0, 0, 0, 50.5890960693359, 0, 0, 0, 0.90021276473999]},"content": {"uri": "bb/Tile_+059_+021/Tile_+059_+021.json"},"geometricError": 71.5494598798882}, {"boundingVolume": {"box": [1722.79113769531, -185.71117401123, 12.7560157775879, 50.5909423828125, 0, 0, 0, 50.5891342163086, 0, 0, 0, 8.14298439025879]},"content": {"uri": "bb/Tile_+059_+022/Tile_+059_+022.json"},"geometricError": 72.0070284535943}, {"boundingVolume": {"box": [1723.41357421875, -85.7185573577881, 12.8922352790833, 50.5914306640625, 0, 0, 0, 50.5892429351807, 0, 0, 0, 8.30024099349976]},"content": {"uri": "bb/Tile_+059_+023/Tile_+059_+023.json"},"geometricError": 72.025400782929}, {"boundingVolume": {"box": [1724.03527832031, 14.2743854522705, 13.8084480762482, 50.5885009765625, 0, 0, 0, 50.5892391204834, 0, 0, 0, 9.1709201335907]},"content": {"uri": "bb/Tile_+059_+024/Tile_+059_+024.json"},"geometricError": 72.1288660796897}, {"boundingVolume": {"box": [1724.40911865234, 75.4231605529785, 11.6732699871063, 50.3403930664063, 0, 0, 0, 11.7451057434082, 0, 0, 0, 7.08151745796204]},"content": {"uri": "bb/Tile_+059_+025/Tile_+059_+025.json"},"geometricError": 52.1751911593196}, {"boundingVolume": {"box": [1797.44390869141, -380.166076660156, 13.3256312608719, 26.4188842773438, 0, 0, 0, 44.4364929199219, 0, 0, 0, 9.40558898448944]},"content": {"uri": "bb/Tile_+060_+020/Tile_+060_+020.json"},"geometricError": 52.5454513124314}, {"boundingVolume": {"box": [1812.28704833984, -286.175262451172, 11.5870990753174, 40.7161254882813, 0, 0, 0, 50.4384155273438, 0, 0, 0, 7.63290023803711]},"content": {"uri": "bb/Tile_+060_+021/Tile_+060_+021.json"},"geometricError": 65.2694247081303}, {"boundingVolume": {"box": [1822.78210449219, -186.271453857422, 15.3006939888, 50.5889892578125, 0, 0, 0, 50.5271301269531, 0, 0, 0, 11.2427039146423]},"content": {"uri": "bb/Tile_+060_+022/Tile_+060_+022.json"},"geometricError": 72.3784160113043}, {"boundingVolume": {"box": [1823.40588378906, -86.3404502868652, 12.5961084365845, 50.58740234375, 0, 0, 0, 50.5890693664551, 0, 0, 0, 8.5899076461792]},"content": {"uri": "bb/Tile_+060_+023/Tile_+060_+023.json"},"geometricError": 72.0564065758371}, {"boundingVolume": {"box": [1824.02978515625, 13.6523685455322, 15.3824796676636, 50.5882568359375, 0, 0, 0, 50.5891551971436, 0, 0, 0, 11.0295190811157]},"content": {"uri": "bb/Tile_+060_+024/Tile_+060_+024.json"},"geometricError": 72.3884289401293}, {"boundingVolume": {"box": [1824.38507080078, 73.7163772583008, 9.60402154922485, 50.3248901367188, 0, 0, 0, 10.6603164672852, 0, 0, 0, 5.04884958267212]},"content": {"uri": "bb/Tile_+060_+025/Tile_+060_+025.json"},"geometricError": 51.6887588994351}, {"boundingVolume": {"box": [1873.77648925781, -141.348236083984, 4.44181227684021, 1.0274658203125, 0, 0, 0, 4.982177734375, 0, 0, 0, 0.262368440628052]},"content": {"uri": "bb/Tile_+061_+022/Tile_+061_+022.json"},"geometricError": 5.09378230664111}, {"boundingVolume": {"box": [1883.65350341797, -86.6555309295654, 9.82255268096924, 10.8458862304688, 0, 0, 0, 50.2822132110596, 0, 0, 0, 5.70098972320557]},"content": {"uri": "bb/Tile_+061_+023/Tile_+061_+023.json"},"geometricError": 51.7536037136625}, {"boundingVolume": {"box": [1893.34643554688, 13.2779121398926, 10.3329606056213, 19.9166259765625, 0, 0, 0, 50.3416175842285, 0, 0, 0, 6.1720118522644]},"content": {"uri": "bb/Tile_+061_+024/Tile_+061_+024.json"},"geometricError": 54.4889363228122}, {"boundingVolume": {"box": [1894.64739990234, 70.7054080963135, 9.54776215553284, 20.5929565429688, 0, 0, 0, 7.8891658782959, 0, 0, 0, 5.28816103935242]},"content": {"uri": "bb/Tile_+061_+025/Tile_+061_+025.json"},"geometricError": 22.6775978581064}],"geometricError": 700.379674431607,"transform": [1, 0, 0, 0, 1.2432017357571995e-17, 1, -5.551115123125783e-17, 0, 1.1741393048713246e-17, 5.551115123125783e-17, 0.9999999999999998, 0, -2.7755747368212224e-10, 2.3283064365386963e-10, 0, 1]}, {"boundingVolume": {"box": [1399.13610839844, -98.4928131103516, 17.3625670671463, 113.360473632813, 0, 0, 0, 188.134658813477, 0, 0, 0, 14.1362904310226]},"children": [{"boundingVolume": {"box": [1329.28283691406, -251.359550476074, 16.0720038414001, 43.5072021484375, 0, 0, 0, 18.6329727172852, 0, 0, 0, 11.7183384895325]},"content": {"uri": "cc/Tile_+055_+021/Tile_+055_+021.json"},"geometricError": 48.7584225341977}, {"boundingVolume": {"box": [1330.76959228516, -183.34806060791, 17.4266179800034, 42.6410522460938, 0, 0, 0, 50.4650802612305, 0, 0, 0, 14.0722395181656]},"content": {"uri": "cc/Tile_+055_+022/Tile_+055_+022.json"},"geometricError": 67.5500672648307}, {"boundingVolume": {"box": [1343.38549804688, -83.4295806884766, 13.3076241016388, 30.647216796875, 0, 0, 0, 50.3902435302734, 0, 0, 0, 8.86118960380554]},"content": {"uri": "cc/Tile_+055_+023/Tile_+055_+023.json"},"geometricError": 59.6401645003559}, {"boundingVolume": {"box": [1355.99951171875, 16.4887676239014, 12.5251359939575, 18.6517333984375, 0, 0, 0, 50.3155078887939, 0, 0, 0, 8.38973331451416]},"content": {"uri": "cc/Tile_+055_+024/Tile_+055_+024.json"},"geometricError": 54.3132131065945}, {"boundingVolume": {"box": [1368.37573242188, 77.9040107727051, 6.60480356216431, 6.41845703125, 0, 0, 0, 11.7378349304199, 0, 0, 0, 2.24518442153931]},"content": {"uri": "cc/Tile_+055_+025/Tile_+055_+025.json"},"geometricError": 13.5651838396135}, {"boundingVolume": {"box": [1407.76196289063, -259.938575744629, 15.907214641571, 35.7642822265625, 0, 0, 0, 26.6888961791992, 0, 0, 0, 11.5050873756409]},"content": {"uri": "cc/Tile_+056_+021/Tile_+056_+021.json"},"geometricError": 46.0841415018922}, {"boundingVolume": {"box": [1421.63781738281, -183.753875732422, 17.1668101549149, 49.4112548828125, 0, 0, 0, 50.4975280761719, 0, 0, 0, 13.9405335187912]},"content": {"uri": "cc/Tile_+056_+022/Tile_+056_+022.json"},"geometricError": 72.0125747747334}, {"boundingVolume": {"box": [1423.4345703125, -83.8446617126465, 13.146103978157, 50.58740234375, 0, 0, 0, 50.5813941955566, 0, 0, 0, 9.23278701305389]},"content": {"uri": "cc/Tile_+056_+023/Tile_+056_+023.json"},"geometricError": 72.1304864165157}, {"boundingVolume": {"box": [1424.056640625, 16.1404838562012, 14.5895075798035, 50.58740234375, 0, 0, 0, 50.5891609191895, 0, 0, 0, 10.2280697822571]},"content": {"uri": "cc/Tile_+056_+024/Tile_+056_+024.json"},"geometricError": 72.2700621963674}, {"boundingVolume": {"box": [1424.43774414063, 77.5803565979004, 13.805157661438, 50.35009765625, 0, 0, 0, 12.0362205505371, 0, 0, 0, 9.49176692962646]},"content": {"uri": "cc/Tile_+056_+025/Tile_+056_+025.json"},"geometricError": 52.6317069700521}, {"boundingVolume": {"box": [1482.11926269531, -79.1935214996338, 5.75612854957581, 9.2208251953125, 0, 0, 0, 45.3083171844482, 0, 0, 0, 1.68560910224915]},"content": {"uri": "cc/Tile_+057_+023/Tile_+057_+023.json"},"geometricError": 46.2677911879815}, {"boundingVolume": {"box": [1490.83251953125, 15.7759399414063, 12.0768136978149, 17.3740234375, 0, 0, 0, 50.3316650390625, 0, 0, 0, 8.07517910003662]},"content": {"uri": "cc/Tile_+057_+024/Tile_+057_+024.json"},"geometricError": 53.8548207081674}, {"boundingVolume": {"box": [1493.28857421875, 77.2821998596191, 9.15342235565186, 19.2080078125, 0, 0, 0, 11.946231842041, 0, 0, 0, 4.94451904296875]},"content": {"uri": "cc/Tile_+057_+025/Tile_+057_+025.json"},"geometricError": 23.1540123502415}],"geometricError": 440.204868379572,"transform": [1, 0, 0, 0, 1.2432017357571995e-17, 1, -5.551115123125783e-17, 0, 1.1741393048713246e-17, 5.551115123125783e-17, 0.9999999999999998, 0, -2.7755747368212224e-10, 2.3283064365386963e-10, 0, 1]}, {"boundingVolume": {"box": [-1300.84271240234, -886.116760253906, -6.17444896697998, 139.575012207031, 0, 0, 0, 116.933471679688, 0, 0, 0, 37.8926019668579]},"children": [{"boundingVolume": {"box": [-1391.99407958984, -933.559753417969, 14.0356489419937, 48.4236450195313, 0, 0, 0, 48.149169921875, 0, 0, 0, 11.1117585897446]},"content": {"uri": "dd/Tile_+025_+004/Tile_+025_+004.json"},"geometricError": 69.1857148557412}, {"boundingVolume": {"box": [-1369.02563476563, -852.159057617188, 2.13443279266357, 25.9090576171875, 0, 0, 0, 34.1532592773438, 0, 0, 0, 21.7199869155884]},"content": {"uri": "dd/Tile_+025_+005/Tile_+025_+005.json"},"geometricError": 48.0570725022815}, {"boundingVolume": {"box": [-1299.24267578125, -994.438171386719, 9.6319876909256, 32.385498046875, 0, 0, 0, 8.612060546875, 0, 0, 0, 5.9280823469162]},"content": {"uri": "dd/Tile_+026_+003/Tile_+026_+003.json"},"geometricError": 34.0313125065579}, {"boundingVolume": {"box": [-1294.17193603516, -936.282165527344, 16.2041157484055, 50.5923461914063, 0, 0, 0, 50.5336303710938, 0, 0, 0, 12.6391478776932]},"content": {"uri": "dd/Tile_+026_+004/Tile_+026_+004.json"},"geometricError": 72.6152969470457}, {"boundingVolume": {"box": [-1293.55456542969, -836.444793701172, 6.14014911651611, 50.57958984375, 0, 0, 0, 50.5338439941406, 0, 0, 0, 25.3308382034302]},"content": {"uri": "dd/Tile_+026_+005/Tile_+026_+005.json"},"geometricError": 75.852591660895}, {"boundingVolume": {"box": [-1292.90478515625, -778.007720947266, 15.3367151618004, 27.361083984375, 0, 0, 0, 8.82443237304688, 0, 0, 0, 13.8531003594398]},"content": {"uri": "dd/Tile_+026_+006/Tile_+026_+006.json"},"geometricError": 31.9125040238965}, {"boundingVolume": {"box": [-1219.70953369141, -920.958221435547, 15.8824429512024, 24.8853149414063, 0, 0, 0, 34.5433654785156, 0, 0, 0, 12.3139815330505]},"content": {"uri": "dd/Tile_+027_+004/Tile_+027_+004.json"},"geometricError": 44.3188124785806}, {"boundingVolume": {"box": [-1202.70550537109, -841.645172119141, -6.17444896697998, 41.4378051757813, 0, 0, 0, 45.6526794433594, 0, 0, 0, 37.8926019668579]},"content": {"uri": "dd/Tile_+027_+005/Tile_+027_+005.json"},"geometricError": 72.3678666395718}],"geometricError": 371.970268249901,"transform": [0.9999996554194588, 0.0004363781417063284, -0.0007062117813477209, 0, -0.0004361717010063091, 0.9999998621139483, 0.0002924488538288972, 0, 0.000706339302258286, -0.00029214072346267494, 0.9999997078692504, 0, 4509.297381684372, -1855.9799298739526, -1.8636501030996442, 1]}, {"boundingVolume": {"box": [24.9149742126465, 458.556976318359, 5.52865505218506, 97.6052131652832, 0, 0, 0, 49.4085388183594, 0, 0, 0, 18.3740262985229]},"children": [{"boundingVolume": {"box": [-53.5235767364502, 460.995025634766, 4.8595757484436, 19.1666622161865, 0, 0, 0, 44.6980590820313, 0, 0, 0, 17.1172251701355]},"content": {"uri": "ee/Tile_+038_+018/Tile_+038_+018.json"},"geometricError": 51.5584796491835}, {"boundingVolume": {"box": [-49.5933418273926, 506.448089599609, 3.60871529579163, 15.2364234924316, 0, 0, 0, 1.51742553710938, 0, 0, 0, 0.110045909881592]},"content": {"uri": "ee/Tile_+038_+019/Tile_+038_+019.json"},"geometricError": 15.3121941995155}, {"boundingVolume": {"box": [15.0548553466797, 457.191497802734, 5.52865505218506, 50.5630187988281, 0, 0, 0, 48.0430603027344, 0, 0, 0, 18.3740262985229]},"content": {"uri": "ee/Tile_+039_+018/Tile_+039_+018.json"},"geometricError": 72.1273828425906}, {"boundingVolume": {"box": [-33.1613292694092, 505.072769165039, 3.53735184669495, 1.75724983215332, 0, 0, 0, 0.161758422851563, 0, 0, 0, 0.157356977462769]},"content": {"uri": "ee/Tile_+039_+019/Tile_+039_+019.json"},"geometricError": 1.77168111643222}, {"boundingVolume": {"box": [93.4946136474609, 456.362838745117, 5.13061237335205, 29.0255737304688, 0, 0, 0, 45.5960540771484, 0, 0, 0, 17.7045965194702]},"content": {"uri": "ee/Tile_+040_+018/Tile_+040_+018.json"},"geometricError": 56.8765049533316}],"geometricError": 221.861093368121,"transform": [0.9999996554194588, 0.0004363781417063284, -0.0007062117813477209, 0, -0.0004361717010063091, 0.9999998621139483, 0.0002924488538288972, 0, 0.000706339302258286, -0.00029214072346267494, 0.9999997078692504, 0, 4509.297381684372, -1855.9799298739526, -1.8636501030996442, 1]}],"geometricError": 9325.869057604898,"transform": [-0.860048066843865, -0.510213017001851, 0, 0, 0.268197168561964, -0.452090496848062, 0.850696456695934, 0, -0.434036405723617, 0.731639843052264, 0.525657244376012, 0, -2770907.60361716, 4670821.10507043, 3333353.96012987, 1]}
}
java源码:
Matrix.java
package org.example.threedtiles;import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.RealMatrix;import java.util.ArrayList;public class Matrix {/*** 一维转二维** @param ms* @return*/public static double[][] dConver(double[] ms) {double[][] matrix;int n = (int) Math.sqrt(ms.length);matrix = new double[n][n];for (int i = 0; i < ms.length; i++) {int row = i % n;int col = (int) Math.floor(i / n);matrix[row][col] = ms[i];}return matrix;}/*** 二维转一维** @param* @return*/public static double[] converttwotoone(double[][] ms) {// 计算二维数组的元素个数int totalElements = 0;for (double[] row : ms) {totalElements += row.length;}double matrix[] = new double[totalElements];for (int i = 0; i < ms.length; i++) {double[] rows = ms[i];for (int j = 0; j < rows.length; j++)matrix[i + j * rows.length] = rows[j];}return matrix;}static double det(double[][] ms) {// 矩阵阶数int n = ms.length;double detVal = 0;// n阶矩阵求行列式if (n > 3) {for (int column = 0; column < n; column++) // 去掉第 0行第column列的矩阵{double[][] matrix = new double[n - 1][n - 1];for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1; j++) {if (j < column) {matrix[i][j] = ms[i + 1][j];} else {matrix[i][j] = ms[i + 1][j + 1];}}}detVal += ms[0][column] * Math.pow(-1, 0 + column) * det(matrix);}}// 3阶矩阵求行列式else if (n == 3)detVal = ms[0][0] * ms[1][1] * ms[2][2] + ms[0][1] * ms[1][2] * ms[2][0] //+ ms[0][2] * ms[1][0] * ms[2][1] - ms[0][2] * ms[1][1] * ms[2][0] //- ms[0][1] * ms[1][0] * ms[2][2] - ms[0][0] * ms[1][2] * ms[2][1];// 2阶矩阵求行列式else if (n == 2)detVal = ms[0][0] * ms[1][1] - ms[0][1] * ms[1][0];// 1阶矩阵求行列式else if (n == 1)detVal = ms[0][0];return detVal;}/*** 伴随矩阵** @param* @return*/public static double[][] adjoint(double[][] ms) {double[][] adjM = new double[ms.length][ms.length];for (int row = 0; row < ms.length; row++) {for (int column = 0; column < ms.length; column++) { // 去掉第 row 行第 column 列的矩阵ArrayList matrix = new ArrayList();for (int i = 0; i < ms.length; i++) {if (i != row) {//double[] arr = new double[ms.length];ArrayList arr = new ArrayList();for (int j = 0; j < ms.length; j++) {if (j != column) {arr.add(ms[i][j]);}}matrix.add(arr);}}// 将arraylist转化为二维矩阵double[][] matrix2 = new double[ms.length - 1][ms.length - 1];matrix2 = convertArrayToTwo(matrix);double a = Matrix.det(matrix2);adjM[row][column] = (Math.pow(-1, row + column) * Matrix.det(matrix2));}}// 转置并返回结果return Matrix.transpose(adjM);}public static double[][] transpose(double[][] ms) {double[][] transM = new double[ms.length][ms[0].length];for (int i = 0; i < transM.length; i++) {for (int j = 0; j < transM[0].length; j++) {transM[i][j] = ms[j][i];}}return transM;}/*** 逆矩阵** @param ms* @return*/public static double[][] inv(double[][] ms) {System.out.println("进入inv方法---");RealMatrix a = new Array2DRowRealMatrix(ms);double detVal = (int) (Matrix.det(a.getData()) + 0.5);double[][] invM = Matrix.adjoint(ms);for (int i = 0; i < invM.length; i++) {for (int j = 0; j < invM.length; j++)invM[i][j] /= detVal;}System.out.println("inv方法结束---");return invM;}/*** // ********************** 【矩阵相乘】 ************************ @param m1* @param m2* @return*/public static double[][] mul(double[][] m1, double[][] m2) {RealMatrix a = new Array2DRowRealMatrix(m1);RealMatrix b = new Array2DRowRealMatrix(m2);RealMatrix actual = a.multiply(b);return actual.getData();}private static double[][] convertArrayToTwo(ArrayList matrix) {// 将arraylist转化为一维数组double tra[][] = new double[matrix.size()][((ArrayList) matrix.get(0)).size()];for (int i = 0; i < matrix.size(); i++) {for (int j = 0; j < ((ArrayList) matrix.get(0)).size(); j++) {tra[i][j] = (double) ((ArrayList) matrix.get(i)).get(j);}}return tra;}}
ThreeDTilesJoin2.java
package org.example.threedtiles;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Scanner;public class ThreeDTilesJoin2 {public static void main(String[] args) throws IOException {// 取参数:是否追加合并Scanner scanner = new Scanner(System.in); // 创建Scanner对象// System.out.println("请输入追加合并参数0/1:");//int isAppendInt = scanner.nextInt(); // 接受用户输入的一行文本int isAppendInt = 0; // 接受用户输入的一行文本Boolean isAppend = isAppendInt == 1 ? true : isAppendInt == 0 ? false : null;// 取参数:合并图层目录System.out.println("请输入合并图层目标目录(绝对目录):");// String joinLayerPath = scanner.next();String joinLayerPath = "D:\\JAVA\\3dtiles\\java_test";// 取参数:源图层目录System.out.println("请输入源图层目录(多个目录用‘,’隔开):");
//        String srcLayerPaths = scanner.next();String srcLayerPaths = "D:\\JAVA\\3dtiles\\data\\aa,D:\\JAVA\\3dtiles\\data\\bb,D:\\JAVA\\3dtiles\\data\\cc,D:\\JAVA\\3dtiles\\data\\dd,D:\\JAVA\\3dtiles\\data\\ee";// ================== 新建合并图层目录 ==================// 合并图层目录已存在且非追加:确认后清空File joinLayerFile = new File(joinLayerPath);if (joinLayerFile.exists() && !isAppend) {joinLayer(joinLayerPath, srcLayerPaths.split(","), isAppend);} else {// 合并图层目录不存在:创建if (!joinLayerFile.exists()) {joinLayerFile.mkdirs();}isAppend = Boolean.FALSE;joinLayer(joinLayerPath, srcLayerPaths.split(","), isAppend);}scanner.close(); // 关闭scanner对象}public static JSONObject readJsonFile(String path) throws IOException {String jsonString = "";jsonString = new String(Files.readAllBytes(Paths.get(path)));return JSON.parseObject(jsonString);}// 将jsonarray转化为一维数组public static double[] converttoone(JSONArray jsonArray) {// 将arraylist转化为一维数组double tra[] = new double[jsonArray.size()];for (int i = 0; i < jsonArray.size(); i++) {tra[i] = jsonArray.getDoubleValue(i);}return tra;}// 函数:合并图层public static void joinLayer(String joinLayerPath, String[] srcLayerPaths, Boolean isAppend) throws IOException {JSONObject joinCfgo = new JSONObject();double[][] joinTrsfInv = new double[4][4];System.out.println("开始合并..." + joinLayerPath);// 依次合并源图层目录ArrayList srcRtChoList = new ArrayList();for (int i = 0; i < srcLayerPaths.length; i++) {String srcLayerPath = srcLayerPaths[i];System.out.println("开始合并目录" + srcLayerPath);// 读取源图层的配置文件JSONObject srcCfgo = readJsonFile(srcLayerPath + "\\" + "tileset.json");if (srcCfgo == null) {continue; // 读取失败:继续下一个}// 首次:生成合并图层配置对象、取合并图层转换矩阵的逆矩阵if (i == 0) {JSONObject asset = new JSONObject();asset.put("asset", srcCfgo.get("asset"));asset.put("geometricError", 0.0);JSONObject root = new JSONObject();JSONObject boundingVolume = new JSONObject();boundingVolume.put("box", new JSONArray());root.put("boundingVolume", boundingVolume);root.put("children", new JSONArray());root.put("geometricError", 0.0);root.put("transform", srcCfgo.getJSONObject("root").getJSONArray("transform"));asset.put("root", root);joinCfgo = !isAppend ? // 非追加:初始化配置对象asset: readJsonFile(joinLayerPath + "\\" + "tileset.json"); // 追加:从合并图层中读取// 取合并图层转换矩阵的逆矩阵double[] a = converttoone(joinCfgo.getJSONObject("root").getJSONArray("transform"));double[][] a2 = Matrix.dConver(a);joinTrsfInv = Matrix.inv(a2); // 取合并图层转换矩阵的逆矩阵}// 计算子对象的转换矩阵double[] b = converttoone(srcCfgo.getJSONObject("root").getJSONArray("transform"));double[] srcTrsf = Matrix.converttwotoone(Matrix.mul(joinTrsfInv, Matrix.dConver(b)));// 设置源图层子对象的转换矩阵JSONArray srcRtChos = srcCfgo.getJSONObject("root").getJSONArray("children");for (int l = 0; l < srcRtChos.size(); l++) {JSONObject srcRtCho = srcRtChos.getJSONObject(l);//JSONObject srcRtCho = new JSONObject();srcRtCho.put("transform", srcTrsf);// 替换uri开头为源图层目录名if (srcRtCho.getString("content") != null) {srcRtCho.getJSONObject("content").put("uri", srcLayerPath + "/" + srcRtCho.getJSONObject("content").getString("uri"));}for (int j = 0; j < srcRtCho.getJSONArray("children").size(); j++) {srcRtCho.getJSONArray("children").getJSONObject(j).getJSONObject("content").put("uri", srcLayerPath + "/" + srcRtCho.getJSONArray("children").getJSONObject(j).getJSONObject("content").getString("uri"));}// 合并源图层子对象int chIdx = -1;for (int j = 0; j < joinCfgo.getJSONObject("root").getJSONArray("children").size() && chIdx == -1; j++) {JSONObject joinRtCh = joinCfgo.getJSONObject("root").getJSONArray("children").getJSONObject(j);// 子对象无内层对象if (joinRtCh.getJSONObject("content") != null && srcRtCho.getJSONObject("content") != null && joinRtCh.getJSONObject("content").getString("uri").equals(srcRtCho.getJSONObject("content").getString("uri"))) {chIdx = j;continue;}// 子对象有内存对象if (joinRtCh.getJSONArray("children") != null && srcRtCho.getJSONArray("children") != null) {Boolean found = false;for (int k = 0; k < joinRtCh.getJSONArray("children").size() && !found; k++) {if (!joinRtCh.getJSONArray("children").getJSONObject(k).getJSONObject("content").getString("uri").equals(srcRtCho.getJSONArray("children").getJSONObject(k).getJSONObject("content").getString("uri"))) {found = true;}}if (!found) {chIdx = j;}}}if (isAppend && chIdx >= 0) {joinCfgo.getJSONObject("root").getJSONArray("children").get(chIdx); // 追加合并已存在源图层:覆盖}srcRtChoList.add(srcRtCho);}System.out.println(srcLayerPath + " 已合并。");}joinCfgo.getJSONObject("root").put("children", srcRtChoList);System.out.println("全部已合并。");// 计算合并图层配置对象外围框属性数值JSONArray joinRtChs = joinCfgo.getJSONObject("root").getJSONArray("children");// 最大的x坐标、最小的x坐标、最大的y坐标、最小的y坐标、最大的z坐标、最小的z坐标、最大的z轴半长double maxX = 0.0, minX = 0.0, maxY = 0.0, minY = 0.0, maxZ = 0.0, minZ = 0.0;for (int i = 0; i < joinRtChs.size(); i++) {JSONObject joinRtCh = joinRtChs.getJSONObject(i);double[] o = new double[]{((BigDecimal) joinRtCh.getJSONObject("boundingVolume").getJSONArray("box").get(0)).doubleValue() +((double) (joinRtCh.getJSONArray("transform").get(12))),((BigDecimal) joinRtCh.getJSONObject("boundingVolume").getJSONArray("box").get(1)).doubleValue() +((double) (joinRtCh.getJSONArray("transform").get(13))),((BigDecimal) joinRtCh.getJSONObject("boundingVolume").getJSONArray("box").get(2)).doubleValue()+ ((double) joinRtCh.getJSONArray("transform").get(14))};double[] r = new double[]{((BigDecimal) joinRtCh.getJSONObject("boundingVolume").getJSONArray("box").get(3)).doubleValue(),((BigDecimal) joinRtCh.getJSONObject("boundingVolume").getJSONArray("box").get(7)).doubleValue(),((BigDecimal) joinRtCh.getJSONObject("boundingVolume").getJSONArray("box").get(11)).doubleValue()};double[] xa = new double[]{o[0] - r[0], o[0] + r[0]};double[] ya = new double[]{o[1] - r[1], o[1] + r[1]};double[] za = new double[]{o[2] - r[2], o[2] + r[2]};if (i == 0) {minX = xa[0];maxX = xa[1];minY = ya[0];maxY = ya[1];minZ = za[0];maxZ = za[1];} else {minX = Math.min(xa[0], minX);maxX = Math.max(xa[1], maxX);minY = Math.min(ya[0], minY);maxY = Math.max(ya[1], maxY);minZ = Math.min(za[0], minZ);maxZ = Math.max(za[1], maxZ);}}// 计算:最外层包围盒x轴坐标、最外层包围盒y轴坐标、最外层包围盒z轴坐标double[] boxs = new double[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};boxs[0] = (maxX + minX) / 2;boxs[1] = (maxY + minY) / 2;boxs[2] = (maxZ + minZ) / 2;// 计算:最外层包围盒x轴半长、最外层包围盒y轴半长、最外层包围盒z轴半长boxs[3] = (maxX - minX) / 2;boxs[7] = (maxY - minY) / 2;boxs[11] = (maxZ - minZ) / 2;joinCfgo.getJSONObject("root").getJSONObject("boundingVolume").put("box", boxs);// 计算:最外层包围盒几何误差值double geometricError = (double) Math.sqrt(Math.pow(boxs[3], 2) + Math.pow(boxs[7], 2)) * 2;joinCfgo.put("geometricError", geometricError);joinCfgo.getJSONObject("root").put("geometricError", geometricError);// 保存tileset文件try (FileWriter writer = new FileWriter(joinLayerPath + "\\" + "tileset.json")) {if (new File(joinLayerPath + "\\" + "tileset.json").exists()) {new File(joinLayerPath + "\\" + "tileset.json").delete();}writer.write(String.valueOf(joinCfgo));} catch (IOException e) {e.printStackTrace();}// 提示完成System.out.println("图层合并完成。");}
}
pom文件
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-math3</artifactId><version>3.6.1</version>
</dependency>
运行程序:

D:\JAVA\3dtiles\java_test

D:\JAVA\3dtiles\data\aa,D:\JAVA\3dtiles\data\bb,D:\JAVA\3dtiles\data\cc,D:\JAVA\3dtiles\data\dd,D:\JAVA\3dtiles\data\ee

生成合成文件
{"geometricError": 9325.869057604898,"root": {"geometricError": 9325.869057604898,"transform": [-0.860048066843865, -0.510213017001851, 0.0, 0.0, 0.268197168561964, -0.452090496848062, 0.850696456695934, 0.0, -0.434036405723617, 0.731639843052264, 0.525657244376012, 0.0, -2770907.60361716, 4670821.10507043, 3333353.96012987, 1.0],"children": [{"geometricError": 740.579323830987,"transform": [1.0, 0.0, 0.0, 0.0, 1.2432017357571995E-17, 1.0, -5.551115123125783E-17, 0.0, 1.1741393048713246E-17, 5.551115123125783E-17, 0.9999999999999998, 0.0, -2.7755747368212224E-10, 2.3283064365386963E-10, 0.0, 1.0],"children": [{"geometricError": 30.8405098086856,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+002_+029/Tile_+002_+029.json"},"boundingVolume": {"box": [-3935.02001953125, 574.504516601563, 15.7210890054703, 13.139404296875, 0, 0, 0, 25.2759399414063, 0, 0, 0, 11.8160890340805]}}, {"geometricError": 32.4810451438208,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+002_+030/Tile_+002_+030.json"},"boundingVolume": {"box": [-3931.19152832031, 630.064575195313, 5.76587748527527, 9.6800537109375, 0, 0, 0, 30.9617309570313, 0, 0, 0, 1.63892340660095]}}, {"geometricError": 62.1966519849389,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+003_+029/Tile_+003_+029.json"},"boundingVolume": {"box": [-3872.32775878906, 566.557830810547, 15.5438475459814, 50.4261474609375, 0, 0, 0, 33.1085510253906, 0, 0, 0, 15.1476407200098]}}, {"geometricError": 60.5573157368986,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+003_+030/Tile_+003_+030.json"},"boundingVolume": {"box": [-3872.03454589844, 628.938293457031, 18.1283311843872, 50.4095458984375, 0, 0, 0, 30.4552612304688, 0, 0, 0, 14.090537071228]}}, {"geometricError": 55.4774127211521,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+004_+027/Tile_+004_+027.json"},"boundingVolume": {"box": [-3749.26013183594, 352.109008789063, 19.1447021961212, 26.1177978515625, 0, 0, 0, 46.5369567871094, 0, 0, 0, 15.1629683971405]}}, {"geometricError": 53.5997083475893,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+004_+028/Tile_+004_+028.json"},"boundingVolume": {"box": [-3740.12866210938, 448.188674926758, 9.04387199878693, 17.607421875, 0, 0, 0, 50.3167572021484, 0, 0, 0, 5.57954967021942]}}, {"geometricError": 73.1092989703366,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+004_+029/Tile_+004_+029.json"},"boundingVolume": {"box": [-3772.3740234375, 548.456268310547, 19.1229840517044, 50.480712890625, 0, 0, 0, 50.5904846191406, 0, 0, 0, 15.4035738706589]}}, {"geometricError": 56.6759666652712,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+004_+030/Tile_+004_+030.json"},"boundingVolume": {"box": [-3772.05346679688, 619.552154541016, 18.2076432704926, 50.41162109375, 0, 0, 0, 21.6935119628906, 0, 0, 0, 14.1500952243805]}}, {"geometricError": 7.30462462257396,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+005_+026/Tile_+005_+026.json"},"boundingVolume": {"box": [-3689.02783203125, 297.003692626953, 10.0964844226837, 5.725341796875, 0, 0, 0, 1.25363159179688, 0, 0, 0, 4.35963416099548]}}, {"geometricError": 72.1511203206034,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+005_+027/Tile_+005_+027.json"},"boundingVolume": {"box": [-3673.70959472656, 348.031799316406, 12.3951093554497, 50.5650634765625, 0, 0, 0, 50.4035339355469, 0, 0, 0, 10.4135625958443]}}, {"geometricError": 72.3192882676973,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+005_+028/Tile_+005_+028.json"},"boundingVolume": {"box": [-3673.11413574219, 447.839309692383, 6.34941649436951, 50.5919189453125, 0, 0, 0, 50.5899505615234, 0, 0, 0, 10.5448610782623]}}, {"geometricError": 73.4642639567206,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+005_+029/Tile_+005_+029.json"},"boundingVolume": {"box": [-3672.49230957031, 547.832534790039, 18.5858655571938, 50.5924072265625, 0, 0, 0, 50.5895843505859, 0, 0, 0, 16.6763414740562]}}, {"geometricError": 74.6720404728155,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+005_+030/Tile_+005_+030.json"},"boundingVolume": {"box": [-3671.8740234375, 647.7919921875, 11.636326789856, 50.582763671875, 0, 0, 0, 50.5528564453125, 0, 0, 0, 21.4873533248901]}}, {"geometricError": 59.0928810211615,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+005_+031/Tile_+005_+031.json"},"boundingVolume": {"box": [-3665.76831054688, 730.397674560547, 12.528514623642, 44.778076171875, 0, 0, 0, 33.1688537597656, 0, 0, 0, 19.6651880741119]}}, {"geometricError": 2.56280235528877,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+006_+027/Tile_+006_+027.json"},"boundingVolume": {"box": [-3622.38244628906, 395.646423339844, 5.87387609481812, 1.3489990234375, 0, 0, 0, 2.1663818359375, 0, 0, 0, 0.234408378601074]}}, {"geometricError": 60.3478889488445,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+006_+028/Tile_+006_+028.json"},"boundingVolume": {"box": [-3591.23608398438, 447.522384643555, 11.8303036689758, 32.471923828125, 0, 0, 0, 50.2840118408203, 0, 0, 0, 7.67854261398315]}}, {"geometricError": 74.5552928526268,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+006_+029/Tile_+006_+029.json"},"boundingVolume": {"box": [-3572.49584960938, 547.324279785156, 11.0218200683594, 50.58984375, 0, 0, 0, 50.475830078125, 0, 0, 0, 21.2449989318848]}}, {"geometricError": 74.8959219033318,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+006_+030/Tile_+006_+030.json"},"boundingVolume": {"box": [-3571.88171386719, 647.205322265625, 10.7785501480103, 50.5970458984375, 0, 0, 0, 50.5909423828125, 0, 0, 0, 22.133563041687]}}, {"geometricError": 72.2022021595952,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+006_+031/Tile_+006_+031.json"},"boundingVolume": {"box": [-3571.29382324219, 746.071563720703, 18.3907251358032, 50.5609130859375, 0, 0, 0, 49.4609680175781, 0, 0, 0, 14.5039548873901]}}, {"geometricError": 24.8871576967365,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+007_+029/Tile_+007_+029.json"},"boundingVolume": {"box": [-3509.61206054688, 576.114654541016, 6.37169981002808, 13.11669921875, 0, 0, 0, 21.0632019042969, 0, 0, 0, 1.91424798965454]}}, {"geometricError": 68.1412415259338,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+007_+030/Tile_+007_+030.json"},"boundingVolume": {"box": [-3478.34790039063, 646.816314697266, 16.745255947113, 44.12158203125, 0, 0, 0, 50.3578186035156, 0, 0, 0, 12.6729989051819]}}, {"geometricError": 68.8705243969495,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+007_+031/Tile_+007_+031.json"},"boundingVolume": {"box": [-3471.40478515625, 741.000762939453, 17.6509721279144, 50.4560546875, 0, 0, 0, 44.9321594238281, 0, 0, 0, 13.3580210208893]}}, {"geometricError": 20.4571827291191,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\aa/Tile_+008_+031/Tile_+008_+031.json"},"boundingVolume": {"box": [-3412.68273925781, 734.155242919922, 10.6947717666626, 9.0433349609375, 0, 0, 0, 17.5325012207031, 0, 0, 0, 5.41533184051514]}}],"boundingVolume": {"box": [-3675.8994140625, 545.641296386719, 11.9535970687866, 272.260009765625, 0, 0, 0, 249.891235351563, 0, 0, 0, 23.3086099624634]}}, {"geometricError": 700.379674431607,"transform": [1.0, 0.0, 0.0, 0.0, 1.2432017357571995E-17, 1.0, -5.551115123125783E-17, 0.0, 1.1741393048713246E-17, 5.551115123125783E-17, 0.9999999999999998, 0.0, -2.7755747368212224E-10, 2.3283064365386963E-10, 0.0, 1.0],"children": [{"geometricError": 52.3324755539293,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+056_+021/Tile_+056_+021.json"},"boundingVolume": {"box": [1456.77575683594, -283.401695251465, 9.57817316055298, 16.002197265625, 0, 0, 0, 49.5448379516602, 0, 0, 0, 5.28457307815552]}}, {"geometricError": 5.08756693533562,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+056_+022/Tile_+056_+022.json"},"boundingVolume": {"box": [1471.31585693359, -229.578811645508, 4.45599508285522, 1.51898193359375, 0, 0, 0, 4.85548400878906, 0, 0, 0, 0.0174999237060547]}}, {"geometricError": 43.4282813138826,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+057_+020/Tile_+057_+020.json"},"boundingVolume": {"box": [1531.82299804688, -348.998123168945, 10.2060108184814, 40.3277587890625, 0, 0, 0, 14.9526214599609, 0, 0, 0, 6.00887680053711]}}, {"geometricError": 72.0071649495143,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+057_+021/Tile_+057_+021.json"},"boundingVolume": {"box": [1522.18682861328, -284.460159301758, 9.90673196315765, 50.5840454101563, 0, 0, 0, 50.5893402099609, 0, 0, 0, 8.18564665317535]}}, {"geometricError": 71.7306262252761,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+057_+022/Tile_+057_+022.json"},"boundingVolume": {"box": [1522.80364990234, -184.549896240234, 9.43511211872101, 50.5891723632813, 0, 0, 0, 50.506591796875, 0, 0, 0, 5.92474162578583]}}, {"geometricError": 63.2145990047746,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+057_+023/Tile_+057_+023.json"},"boundingVolume": {"box": [1536.63287353516, -84.6287059783936, 10.7433174848557, 37.3843383789063, 0, 0, 0, 50.4350147247314, 0, 0, 0, 7.403111577034]}}, {"geometricError": 57.120656310518,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+057_+024/Tile_+057_+024.json"},"boundingVolume": {"box": [1548.78259277344, 15.3128070831299, 11.0693670511246, 25.8543701171875, 0, 0, 0, 50.38356590271, 0, 0, 0, 7.47109162807465]}}, {"geometricError": 21.9752339830746,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+057_+025/Tile_+057_+025.json"},"boundingVolume": {"box": [1557.44226074219, 77.4114685058594, 8.79704344272614, 17.3408203125, 0, 0, 0, 12.489372253418, 0, 0, 0, 5.12078511714935]}}, {"geometricError": 59.0020951037097,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+058_+020/Tile_+058_+020.json"},"boundingVolume": {"box": [1621.77416992188, -364.557540893555, 10.4570751190186, 50.3675537109375, 0, 0, 0, 30.0714874267578, 0, 0, 0, 6.32948684692383]}}, {"geometricError": 72.0571490462324,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+058_+021/Tile_+058_+021.json"},"boundingVolume": {"box": [1622.17553710938, -285.081962585449, 12.8714859485626, 50.5882568359375, 0, 0, 0, 50.5891189575195, 0, 0, 0, 8.59081149101257]}}, {"geometricError": 72.057572175005,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+058_+022/Tile_+058_+022.json"},"boundingVolume": {"box": [1622.79650878906, -185.08927154541, 13.1854486465454, 50.589111328125, 0, 0, 0, 50.5890426635742, 0, 0, 0, 8.58977794647217]}}, {"geometricError": 71.7584552136979,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+058_+023/Tile_+058_+023.json"},"boundingVolume": {"box": [1623.42102050781, -85.0964012145996, 10.2867512702942, 50.5892333984375, 0, 0, 0, 50.5891151428223, 0, 0, 0, 5.54497861862183]}}, {"geometricError": 71.8362092102733,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+058_+024/Tile_+058_+024.json"},"boundingVolume": {"box": [1624.04296875, 14.8963890075684, 10.8929178714752, 50.5892333984375, 0, 0, 0, 50.5891761779785, 0, 0, 0, 6.47345900535583]}}, {"geometricError": 52.1549404310852,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+058_+025/Tile_+058_+025.json"},"boundingVolume": {"box": [1624.42224121094, 76.6347541809082, 9.87600064277649, 50.348876953125, 0, 0, 0, 12.3346061706543, 0, 0, 0, 5.74333453178406]}}, {"geometricError": 68.3571850119951,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+059_+020/Tile_+059_+020.json"},"boundingVolume": {"box": [1721.67340087891, -379.611175537109, 16.0873470306396, 50.4609985351563, 0, 0, 0, 44.5035400390625, 0, 0, 0, 12.0758972167969]}}, {"geometricError": 71.5494598798882,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+059_+021/Tile_+059_+021.json"},"boundingVolume": {"box": [1722.16735839844, -285.70393371582, 5.40806865692139, 50.589111328125, 0, 0, 0, 50.5890960693359, 0, 0, 0, 0.90021276473999]}}, {"geometricError": 72.0070284535943,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+059_+022/Tile_+059_+022.json"},"boundingVolume": {"box": [1722.79113769531, -185.71117401123, 12.7560157775879, 50.5909423828125, 0, 0, 0, 50.5891342163086, 0, 0, 0, 8.14298439025879]}}, {"geometricError": 72.025400782929,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+059_+023/Tile_+059_+023.json"},"boundingVolume": {"box": [1723.41357421875, -85.7185573577881, 12.8922352790833, 50.5914306640625, 0, 0, 0, 50.5892429351807, 0, 0, 0, 8.30024099349976]}}, {"geometricError": 72.1288660796897,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+059_+024/Tile_+059_+024.json"},"boundingVolume": {"box": [1724.03527832031, 14.2743854522705, 13.8084480762482, 50.5885009765625, 0, 0, 0, 50.5892391204834, 0, 0, 0, 9.1709201335907]}}, {"geometricError": 52.1751911593196,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+059_+025/Tile_+059_+025.json"},"boundingVolume": {"box": [1724.40911865234, 75.4231605529785, 11.6732699871063, 50.3403930664063, 0, 0, 0, 11.7451057434082, 0, 0, 0, 7.08151745796204]}}, {"geometricError": 52.5454513124314,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+060_+020/Tile_+060_+020.json"},"boundingVolume": {"box": [1797.44390869141, -380.166076660156, 13.3256312608719, 26.4188842773438, 0, 0, 0, 44.4364929199219, 0, 0, 0, 9.40558898448944]}}, {"geometricError": 65.2694247081303,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+060_+021/Tile_+060_+021.json"},"boundingVolume": {"box": [1812.28704833984, -286.175262451172, 11.5870990753174, 40.7161254882813, 0, 0, 0, 50.4384155273438, 0, 0, 0, 7.63290023803711]}}, {"geometricError": 72.3784160113043,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+060_+022/Tile_+060_+022.json"},"boundingVolume": {"box": [1822.78210449219, -186.271453857422, 15.3006939888, 50.5889892578125, 0, 0, 0, 50.5271301269531, 0, 0, 0, 11.2427039146423]}}, {"geometricError": 72.0564065758371,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+060_+023/Tile_+060_+023.json"},"boundingVolume": {"box": [1823.40588378906, -86.3404502868652, 12.5961084365845, 50.58740234375, 0, 0, 0, 50.5890693664551, 0, 0, 0, 8.5899076461792]}}, {"geometricError": 72.3884289401293,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+060_+024/Tile_+060_+024.json"},"boundingVolume": {"box": [1824.02978515625, 13.6523685455322, 15.3824796676636, 50.5882568359375, 0, 0, 0, 50.5891551971436, 0, 0, 0, 11.0295190811157]}}, {"geometricError": 51.6887588994351,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+060_+025/Tile_+060_+025.json"},"boundingVolume": {"box": [1824.38507080078, 73.7163772583008, 9.60402154922485, 50.3248901367188, 0, 0, 0, 10.6603164672852, 0, 0, 0, 5.04884958267212]}}, {"geometricError": 5.09378230664111,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+061_+022/Tile_+061_+022.json"},"boundingVolume": {"box": [1873.77648925781, -141.348236083984, 4.44181227684021, 1.0274658203125, 0, 0, 0, 4.982177734375, 0, 0, 0, 0.262368440628052]}}, {"geometricError": 51.7536037136625,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+061_+023/Tile_+061_+023.json"},"boundingVolume": {"box": [1883.65350341797, -86.6555309295654, 9.82255268096924, 10.8458862304688, 0, 0, 0, 50.2822132110596, 0, 0, 0, 5.70098972320557]}}, {"geometricError": 54.4889363228122,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+061_+024/Tile_+061_+024.json"},"boundingVolume": {"box": [1893.34643554688, 13.2779121398926, 10.3329606056213, 19.9166259765625, 0, 0, 0, 50.3416175842285, 0, 0, 0, 6.1720118522644]}}, {"geometricError": 22.6775978581064,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\bb/Tile_+061_+025/Tile_+061_+025.json"},"boundingVolume": {"box": [1894.64739990234, 70.7054080963135, 9.54776215553284, 20.5929565429688, 0, 0, 0, 7.8891658782959, 0, 0, 0, 5.28816103935242]}}],"boundingVolume": {"box": [1678.00695800781, -167.3508644104, 14.9421647787094, 237.2333984375, 0, 0, 0, 257.251705169678, 0, 0, 0, 13.2210794687271]}}, {"geometricError": 440.204868379572,"transform": [1.0, 0.0, 0.0, 0.0, 1.2432017357571995E-17, 1.0, -5.551115123125783E-17, 0.0, 1.1741393048713246E-17, 5.551115123125783E-17, 0.9999999999999998, 0.0, -2.7755747368212224E-10, 2.3283064365386963E-10, 0.0, 1.0],"children": [{"geometricError": 48.7584225341977,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+055_+021/Tile_+055_+021.json"},"boundingVolume": {"box": [1329.28283691406, -251.359550476074, 16.0720038414001, 43.5072021484375, 0, 0, 0, 18.6329727172852, 0, 0, 0, 11.7183384895325]}}, {"geometricError": 67.5500672648307,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+055_+022/Tile_+055_+022.json"},"boundingVolume": {"box": [1330.76959228516, -183.34806060791, 17.4266179800034, 42.6410522460938, 0, 0, 0, 50.4650802612305, 0, 0, 0, 14.0722395181656]}}, {"geometricError": 59.6401645003559,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+055_+023/Tile_+055_+023.json"},"boundingVolume": {"box": [1343.38549804688, -83.4295806884766, 13.3076241016388, 30.647216796875, 0, 0, 0, 50.3902435302734, 0, 0, 0, 8.86118960380554]}}, {"geometricError": 54.3132131065945,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+055_+024/Tile_+055_+024.json"},"boundingVolume": {"box": [1355.99951171875, 16.4887676239014, 12.5251359939575, 18.6517333984375, 0, 0, 0, 50.3155078887939, 0, 0, 0, 8.38973331451416]}}, {"geometricError": 13.5651838396135,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+055_+025/Tile_+055_+025.json"},"boundingVolume": {"box": [1368.37573242188, 77.9040107727051, 6.60480356216431, 6.41845703125, 0, 0, 0, 11.7378349304199, 0, 0, 0, 2.24518442153931]}}, {"geometricError": 46.0841415018922,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+056_+021/Tile_+056_+021.json"},"boundingVolume": {"box": [1407.76196289063, -259.938575744629, 15.907214641571, 35.7642822265625, 0, 0, 0, 26.6888961791992, 0, 0, 0, 11.5050873756409]}}, {"geometricError": 72.0125747747334,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+056_+022/Tile_+056_+022.json"},"boundingVolume": {"box": [1421.63781738281, -183.753875732422, 17.1668101549149, 49.4112548828125, 0, 0, 0, 50.4975280761719, 0, 0, 0, 13.9405335187912]}}, {"geometricError": 72.1304864165157,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+056_+023/Tile_+056_+023.json"},"boundingVolume": {"box": [1423.4345703125, -83.8446617126465, 13.146103978157, 50.58740234375, 0, 0, 0, 50.5813941955566, 0, 0, 0, 9.23278701305389]}}, {"geometricError": 72.2700621963674,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+056_+024/Tile_+056_+024.json"},"boundingVolume": {"box": [1424.056640625, 16.1404838562012, 14.5895075798035, 50.58740234375, 0, 0, 0, 50.5891609191895, 0, 0, 0, 10.2280697822571]}}, {"geometricError": 52.6317069700521,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+056_+025/Tile_+056_+025.json"},"boundingVolume": {"box": [1424.43774414063, 77.5803565979004, 13.805157661438, 50.35009765625, 0, 0, 0, 12.0362205505371, 0, 0, 0, 9.49176692962646]}}, {"geometricError": 46.2677911879815,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+057_+023/Tile_+057_+023.json"},"boundingVolume": {"box": [1482.11926269531, -79.1935214996338, 5.75612854957581, 9.2208251953125, 0, 0, 0, 45.3083171844482, 0, 0, 0, 1.68560910224915]}}, {"geometricError": 53.8548207081674,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+057_+024/Tile_+057_+024.json"},"boundingVolume": {"box": [1490.83251953125, 15.7759399414063, 12.0768136978149, 17.3740234375, 0, 0, 0, 50.3316650390625, 0, 0, 0, 8.07517910003662]}}, {"geometricError": 23.1540123502415,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\cc/Tile_+057_+025/Tile_+057_+025.json"},"boundingVolume": {"box": [1493.28857421875, 77.2821998596191, 9.15342235565186, 19.2080078125, 0, 0, 0, 11.946231842041, 0, 0, 0, 4.94451904296875]}}],"boundingVolume": {"box": [1399.13610839844, -98.4928131103516, 17.3625670671463, 113.360473632813, 0, 0, 0, 188.134658813477, 0, 0, 0, 14.1362904310226]}}, {"geometricError": 371.970268249901,"transform": [0.9999996554194588, 4.363781417063284E-4, -7.062117813477209E-4, 0.0, -4.361717010063091E-4, 0.9999998621139483, 2.924488538288972E-4, 0.0, 7.06339302258286E-4, -2.9214072346267494E-4, 0.9999997078692504, 0.0, 4509.297381684372, -1855.9799298739526, -1.8636501030996442, 1.0],"children": [{"geometricError": 69.1857148557412,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\dd/Tile_+025_+004/Tile_+025_+004.json"},"boundingVolume": {"box": [-1391.99407958984, -933.559753417969, 14.0356489419937, 48.4236450195313, 0, 0, 0, 48.149169921875, 0, 0, 0, 11.1117585897446]}}, {"geometricError": 48.0570725022815,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\dd/Tile_+025_+005/Tile_+025_+005.json"},"boundingVolume": {"box": [-1369.02563476563, -852.159057617188, 2.13443279266357, 25.9090576171875, 0, 0, 0, 34.1532592773438, 0, 0, 0, 21.7199869155884]}}, {"geometricError": 34.0313125065579,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\dd/Tile_+026_+003/Tile_+026_+003.json"},"boundingVolume": {"box": [-1299.24267578125, -994.438171386719, 9.6319876909256, 32.385498046875, 0, 0, 0, 8.612060546875, 0, 0, 0, 5.9280823469162]}}, {"geometricError": 72.6152969470457,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\dd/Tile_+026_+004/Tile_+026_+004.json"},"boundingVolume": {"box": [-1294.17193603516, -936.282165527344, 16.2041157484055, 50.5923461914063, 0, 0, 0, 50.5336303710938, 0, 0, 0, 12.6391478776932]}}, {"geometricError": 75.852591660895,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\dd/Tile_+026_+005/Tile_+026_+005.json"},"boundingVolume": {"box": [-1293.55456542969, -836.444793701172, 6.14014911651611, 50.57958984375, 0, 0, 0, 50.5338439941406, 0, 0, 0, 25.3308382034302]}}, {"geometricError": 31.9125040238965,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\dd/Tile_+026_+006/Tile_+026_+006.json"},"boundingVolume": {"box": [-1292.90478515625, -778.007720947266, 15.3367151618004, 27.361083984375, 0, 0, 0, 8.82443237304688, 0, 0, 0, 13.8531003594398]}}, {"geometricError": 44.3188124785806,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\dd/Tile_+027_+004/Tile_+027_+004.json"},"boundingVolume": {"box": [-1219.70953369141, -920.958221435547, 15.8824429512024, 24.8853149414063, 0, 0, 0, 34.5433654785156, 0, 0, 0, 12.3139815330505]}}, {"geometricError": 72.3678666395718,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\dd/Tile_+027_+005/Tile_+027_+005.json"},"boundingVolume": {"box": [-1202.70550537109, -841.645172119141, -6.17444896697998, 41.4378051757813, 0, 0, 0, 45.6526794433594, 0, 0, 0, 37.8926019668579]}}],"boundingVolume": {"box": [-1300.84271240234, -886.116760253906, -6.17444896697998, 139.575012207031, 0, 0, 0, 116.933471679688, 0, 0, 0, 37.8926019668579]}}, {"geometricError": 221.861093368121,"transform": [0.9999996554194588, 4.363781417063284E-4, -7.062117813477209E-4, 0.0, -4.361717010063091E-4, 0.9999998621139483, 2.924488538288972E-4, 0.0, 7.06339302258286E-4, -2.9214072346267494E-4, 0.9999997078692504, 0.0, 4509.297381684372, -1855.9799298739526, -1.8636501030996442, 1.0],"children": [{"geometricError": 51.5584796491835,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\ee/Tile_+038_+018/Tile_+038_+018.json"},"boundingVolume": {"box": [-53.5235767364502, 460.995025634766, 4.8595757484436, 19.1666622161865, 0, 0, 0, 44.6980590820313, 0, 0, 0, 17.1172251701355]}}, {"geometricError": 15.3121941995155,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\ee/Tile_+038_+019/Tile_+038_+019.json"},"boundingVolume": {"box": [-49.5933418273926, 506.448089599609, 3.60871529579163, 15.2364234924316, 0, 0, 0, 1.51742553710938, 0, 0, 0, 0.110045909881592]}}, {"geometricError": 72.1273828425906,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\ee/Tile_+039_+018/Tile_+039_+018.json"},"boundingVolume": {"box": [15.0548553466797, 457.191497802734, 5.52865505218506, 50.5630187988281, 0, 0, 0, 48.0430603027344, 0, 0, 0, 18.3740262985229]}}, {"geometricError": 1.77168111643222,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\ee/Tile_+039_+019/Tile_+039_+019.json"},"boundingVolume": {"box": [-33.1613292694092, 505.072769165039, 3.53735184669495, 1.75724983215332, 0, 0, 0, 0.161758422851563, 0, 0, 0, 0.157356977462769]}}, {"geometricError": 56.8765049533316,"content": {"uri": "D:\\JAVA\\3dtiles\\data\\ee/Tile_+040_+018/Tile_+040_+018.json"},"boundingVolume": {"box": [93.4946136474609, 456.362838745117, 5.13061237335205, 29.0255737304688, 0, 0, 0, 45.5960540771484, 0, 0, 0, 17.7045965194702]}}],"boundingVolume": {"box": [24.9149742126465, 458.556976318359, 5.52865505218506, 97.6052131652832, 0, 0, 0, 49.4085388183594, 0, 0, 0, 18.3740262985229]}}],"boundingVolume": {"box": [341.8290726169498, -1031.7488150345162, -5.334247002843764, 4289.988496445352, 0.0, 0.0, 0.0, 1827.2813467730307, 0.0, 0.0, 0.0, 40.59645403409377]}},"asset": {"generatetool": "cesiumlab2@www.cesiumlab.com/osgb2tiles3","version": "1.0"}
}
遇到的问题:

求矩阵行列式时,使用工具包LUDecomposition计算时,以下矩阵结果为0,和js中相同矩阵计算结果(-8.326672684688674e-17)不同,原矩阵:0.268197168561964,-0.434036405723617,-2770907.60361716,

-0.452090496848062,0.731639843052264,4670821.10507043,

0,0,1

    static double det(double[][] ms) {RealMatrix matrix = new Array2DRowRealMatrix(ms);LUDecomposition lu1 = new LUDecomposition(matrix);System.out.println("det方法结束");}

求矩阵运算的jar包:Apache Commons Math
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-math3</artifactId><version>3.6.1</version>
</dependency>
计算代数余子式
import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealMatrix;
import org.apache.commons.math3.linear.SingularValueDecomposition;public class MatrixExample {public static void main(String[] args) {double[][] matrixData = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};RealMatrix matrix = MatrixUtils.createRealMatrix(matrixData);// 获取子矩阵RealMatrix subMatrix = matrix.getSubMatrix(0, 1, 0, 1);// 计算子矩阵的行列式值double minorDeterminant = subMatrix.getDeterminant();System.out.println("代数余子式的行列式值为: " + minorDeterminant);}
}
计算行列式
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.LUDecomposition;
import org.apache.commons.math3.linear.RealMatrix;public class Main {public static void main(String[] args) {// 创建一个二维数组表示矩阵double[][] matrixData = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};// 将二维数组转换为实数矩阵对象RealMatrix matrix = new Array2DRowRealMatrix(matrixData);// 创建LUDecomposition对象LUDecomposition luDecomposition = new LUDecomposition(matrix);// 获取行列式的值double determinant = luDecomposition.getDeterminant();// 打印行列式的值System.out.println("Determinant of the matrix: " + determinant);}
}
转置矩阵
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.RealMatrix;public class Main {public static void main(String[] args) {// 创建一个二维数组表示矩阵double[][] matrixData = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};// 将二维数组转换为实数矩阵对象RealMatrix matrix = new Array2DRowRealMatrix(matrixData);// 计算矩阵的转置RealMatrix transposedMatrix = matrix.transpose();// 打印转置后的矩阵System.out.println("Original Matrix:");printMatrix(matrix);System.out.println("\nTransposed Matrix:");printMatrix(transposedMatrix);}// 辅助方法:打印矩阵public static void printMatrix(RealMatrix matrix) {int rows = matrix.getRowDimension();int columns = matrix.getColumnDimension();for (int i = 0; i < rows; i++) {for (int j = 0; j < columns; j++) {System.out.print(matrix.getEntry(i, j) + "\t");}System.out.println();}}
}
计算逆矩阵
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.DecompositionSolver;
import org.apache.commons.math3.linear.LUDecomposition;
import org.apache.commons.math3.linear.RealMatrix;public class Main {public static void main(String[] args) {// 创建一个二维数组表示矩阵double[][] matrixData = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};// 将二维数组转换为实数矩阵对象RealMatrix matrix = new Array2DRowRealMatrix(matrixData);// 创建LUDecomposition对象LUDecomposition luDecomposition = new LUDecomposition(matrix);// 获取分解求解器DecompositionSolver solver = luDecomposition.getSolver();// 计算逆矩阵RealMatrix inverseMatrix = solver.getInverse();// 打印逆矩阵System.out.println("Original Matrix:");printMatrix(matrix);System.out.println("\nInverse Matrix:");printMatrix(inverseMatrix);}// 辅助方法:打印矩阵public static void printMatrix(RealMatrix matrix) {int rows = matrix.getRowDimension();int columns = matrix.getColumnDimension();for (int i = 0; i < rows; i++) {for (int j = 0; j < columns; j++) {System.out.print(matrix.getEntry(i, j) + "\t");}System.out.println();}}
}
矩阵相乘
public static double[][] mul(double[][] m1, double[][] m2) {RealMatrix a = new Array2DRowRealMatrix(m1);RealMatrix b = new Array2DRowRealMatrix(m2);RealMatrix actual = a.multiply(b);return actual.getData();
}
需要注意

这个uri需要是相对目录,需要能从当前合并后的tileset目录下,找到top目录下的某个json,所以如果要直接使用上述java代码,还需要修改下uri的赋值

这篇关于使用js/java合并3dtiles的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973383

相关文章

测试服务搭建之centos7下安装java

一 安装Java 1 创建普通用户 useradd userNameTest passwd userNameTest 提示输入密码:【输入wujian的密码】 user:userNameTest group:root passwd:123456789   2 给“userNameTest”分配root权限 vi /etc/sudoers 在文件中找到 # %wheel ALL=(

selenium +java 多个类公用driver问题

问题点:太久没有写selenium代码,居然把driver公用的问题忘记了,即:每写一个测试类,执行过程中都会新建一个窗口,这样应该说是非常不专业的。 大概想了一个方法,虽然看起来也不怎么专业,但感觉能用就很开心了。 解决步骤:                1 创建一个获取获取driver的方法getDriver()                2 创建成员变量,将 getDriver()赋值

[SCF+wetest+jmeter]云性能压测工具使用方案

前言 压测太难?局域网压力无法判断服务器网络指标?无法产生非常大的并发量?云性能太贵? 也许我们可以把各种简单的工具拼起来进行压力测试! 准备 https://cloud.tencent.com/product/scf https://cloud.tencent.com/product/lm 云压测背景 常规压测工具,所有请求均从本地出发,走局域网可能导致网络请求的实际效果不够真实

IDEA中使用maven配置mybatis-------mybatis(一)

IDEA下通过maven配置mybatis 创建maven项目,路径为:file–setting-maven–maven-archetye-webapp; 创建mybatis目录,按箭头所示依次点击,创建一个mybatis的文件编写目录 修改pom.xml配置文件,刚开始可能红框中的字体为红色,等待maven自动下载完成之后即可 mysql客户端配置 添加log4j <

IDEA +maven git tomcat database数据库 调试 插件 log4j Spring junit

前言 idea优化配置、常规配置、配置maven、git、tomcat、database数据库、调试配置、插件配置、log4j配置、Spring配置等等,稍后一一更新! 优化配置(#item1 “item1”) 打开文件 :“idea – > bin – >idea64.exe.vmoptions” -Xms: 初始内存;-Xmx : 最大内存;-ReservedCodeCache

4-Springboot集成FLOWABLE之流程驳回

目录标题 演示地址效果功能后端代码补充 演示地址 效果 功能 默认驳回到上一节点 后端代码 flowable自带驳回功能, 在源码ProcessInstanceResource.class下已有该功能,不需要自己额外去写 @ApiOperation(value = "Change the state a process instance", tags = { "Pr

vue3.0 v-model 的使用

前言 组件功能:把 el-switch 的值 false/true, 动态绑定输出为 0, 1 组件代码 封装el-switch组件,当el-switch的值为false,输出值为0;当el-switch的值为true,输出值为1; <template><el-switch v-model="switchValue" @change="changeEvent"></el-switch

bimface 模型集成-后端(java)上传、发起转换、获取转换状态

目录 前言后端架构流程存储表结构全局工具类先根据appid, appsecret 生成accesstoken, 保存到自己的存储服务器。利用保存的 accesstoken 上传模型发起转换获取转换状态根据bimface文件ID获取模型viewtoken, 获取到viewtoken就可以利用前端浏览模型或图纸了 前言 之前没有注意官方有个sdk,然后自己就实现了这么个逻辑。建议

sublime text ctags使用心得

ctags文件需要另行下载,然后添加到Windows的Path路径下面。 ctags -R -f .tags生成  .tags文件,然后在sublime下就可以用ctrl+t ctrl+t来跳转,用ctrl+t ctrl+b来返回到原来位置 使用ctrl+t、ctrl+r 两个连续组合键,创建.tags工程符号索引文件(此时Sublime Text 2会自动调用第一步安装的ctag

vimperator的使用

Vimium 其实是一款 Chrome 浏览器中的插件,而 Vimperator 则是 FireFox 火狐浏览器的插件     j:向下细微滚动窗口   k:向上细微滚动窗口          ctrl+d:向下滚动半个屏幕   ctrl+u:向上移动半个屏幕     g+g(连续按两下g):回到顶部     G:到达页面底部     H:后退   L: 前进