需求说明:
CC 算出来的 Cesium 3dtiles,导入到Cesium 之后,需要将CAD的一些图覆盖上去,并且坐标、高程一致。
1、先将3d Tiles导入 Cesium
Ce.Load3dTiles.TilesetScene.url = "/resource/Scene/Production_2.json";
Ce.Load3dTiles.TilesetScene.OBJ = Ce.Viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url: Ce.Load3dTiles.TilesetScene.url,
show: true,
debugHeatmapTilePropertyName: "",
baseLayerPicker: true,
maximumScreenSpaceError: 2,//最大的屏幕空间误差
maximumNumberOfLoadedTiles: 5000, //最大加载瓦片个数
luminanceAtZenith: 0.2,
modelMatrix: Cesium.Matrix4.IDENTITY,
}));
2、导入 KML 到 3dTiles 上
Ce.Load3dTiles.TilesetScene.OBJ.readyPromise.then(function (argument) {
let tileset = Ce.Load3dTiles.TilesetScene.OBJ;
var boundingSphere = tileset.boundingSphere;
var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 40.05);//40.05 为调整Tiles的高程,有时候高程不一致时需要用得到。如果是一致的,则为0.可以与参照点进行对比。
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
let kmlFileUrl = "/resource/kml/5d.kml";//5d.kml 这里为CAD转换成的KML
let options = {
camera: Ce.Viewer.scene.camera,
canvas: Ce.Viewer.scene.canvas,
};
Ce.Viewer.dataSources.add(
Cesium.KmlDataSource.load(
kmlFileUrl,
options
)
);
}
3、打开CAD 并编辑
如果需要高程也一致,那么需要将CAD里所有的点与线的Z轴都赋予正确的高程值,将CAD的工作空间设置为:三维建模会方便一些,如果不需要高程一致,那么平面的就可以了。
如果是平面的话,则需要在CAD导出工具中,将全贴地面勾上再导出,并且需要保证KML的高程比tiles的要高。
4、找到参照中心点
参照点用于对比 调整 高程、坐标的。
在Google地图中找到参照点,并记下坐标
在CAD的图纸中,也找到同一个参照点,并将CAD的整个图纸移动,以这个参照点移动,移动到0,0的位置。
5、使用CAD转KML工具
下载这个工具,并解压,并拖动到CAD窗口
使用acad2kml命令
将刚才在Google 地图中记下的参照点坐标,填上。
然后选择保存的位置,再接着在CAD中选择要导出的对象,鼠标右键确定,既可导出KML。