在cesium加载并显示点云或者倾斜模型之前,需要将不同格式的数据转为3dtiles,具体参考倾斜、点云转3dtiles(osgb、las转3dtiles)切片
转换完成后就可以写代码将其加载到cesium地球上。
//定位到该地点
viewer.camera.flyTo({
destination : Cesium.Cartesian3.fromDegrees(112.96906,34.70736,5000.0)
});
qingxie = new Cesium.Cesium3DTileset({
url: "./models/tileset.json",
});
viewer.scene.primitives.add(qingxie);
有时候加载完成并不能贴地显示,或者贴地显示的具体位置和底图位置不一致,需要对模型位置进行调整。
qingxie.readyPromise.then(function(qingxie) {
//高度偏差,向上是正数,向下是负数
var heightOffset = -210;
//计算tileset的绑定范围
var boundingSphere = songlingqingxie1.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+0.000015, cartographic.latitude-0.000015, heightOffset);
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
//tileset.modelMatrix转换
qingxie.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
});
最后模型成功准确显示在地图上。
点云的代码基本一样。
dianyun =new Cesium.Cesium3DTileset({
url: "./models/ding/tileset.json",
});
viewer.scene.primitives.add(dianyun);
dianyun.readyPromise.then(function(dianyun) {
//高度偏差,向上是正数,向下是负数
var heightOffset = -210;
//计算tileset的绑定范围
var boundingSphere = songlingdianyun1.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, heightOffset);
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
//tileset.modelMatrix转换
dianyun.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
});
显示如下。点云是自己用python按高程进行渲染的,同样需要进行渲染的可以参考博客(点云按照高程进行渲染(可自定义颜色——python)内附RGB0-1间取值对应表)。