首页 > 其他分享 >cesium教程9-加载倾斜摄影并解决高度问题

cesium教程9-加载倾斜摄影并解决高度问题

时间:2022-10-12 20:55:28浏览次数:58  
标签:教程 tileset cartographic viewer var Cesium cesium height 加载

无人机航拍的倾斜摄影,用照片和视频处理生成三维模型,一般照片都带有坐标信息,所以一般都能定位的比较准确,但是经常会出现高度偏差,这个时候就需要特殊处理了。

今天航拍建模的效果如下:

这个建模没有裁剪,一般周边其他东西都要裁剪和删除。 

然后直接上完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>天地图</title>
  <!-- 引用cesium的js和css,天地图的扩展js -->
 <script src="js/cesium1.97/Cesium.js"></script>
  <script src="js/cesiumTdt.js" ></script>
  <link rel="stylesheet" href="js/cesium1.97//Widgets/widgets.css"/>
  <style type="text/css">
    html, body, #tiandituContainer {
      width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
    }
  </style>
 
</head>
<body onl oad="loadData()">
<div id="tiandituContainer">
</div>
<script>
  var cesiumAsset='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5NjE1MDIwOC1jOGYxLTQzZWItYjNhOC1iNjZlMWM1OGYxMDIiLCJpZCI6MTAyODY5LCJpYXQiOjE2NTkwMDA3ODN9.Vy4hW4jpjbZs6ee4BcRl3-cCl-oRGn42e2_Hjbo5nas';
  var tiandituTk='4357fe5b6eab1e1bb57f99e68ae528f8';
  // 服务负载子域
  var subdomains=['0','1','2','3','4','5','6','7'];
  Cesium.Ion.defaultAccessToken = cesiumAsset;
  
  var viewer;
   function loadData()
   {
       //默认会调用微软virtualearth地图
        viewer = new Cesium.Viewer('tiandituContainer',{
          animation:false,       //是否显示动画控件
          homeButton:true,       //是否显示home键
          geocoder:true,         //是否显示地名查找控件,如果设置为true,则无法查询
          baseLayerPicker:true, //是否显示图层选择控件
          timeline:false,        //是否显示时间线控件
          fullscreenButton:true, //是否全屏显示
          infoBox:true,         //是否显示点击要素之后显示的信息
          sceneModePicker:true,  //是否显示投影方式控件  三维/二维
          navigationInstructionsInitiallyVisible:false, //导航指令
          navigationHelpButton:false,     //是否显示帮助信息控件
          selectionIndicator:false, //是否显示指示器组件
        });
        //默认的Cesium会加载一个bingMap底图,网络不太好,一般要先去掉这个默认的
        //viewer.imageryLayers.remove(viewer.imageryLayers.get(0));
        // 隐藏cesium ion
        viewer._cesiumWidget._creditContainer.style.display = "none";  
        
            //http://211.143.122.110:18062/3dtile/home_draco/tileset.json
            addSlope("http://211.143.122.110:18062/3dtile/home_draco/tileset.json",0);
            
            
             //getMousePosition();
       
}
        // cesium获取鼠标点击的位置坐标
        function getMousePosition()
        {
          // 首先需要注册cesium鼠标事件,通过cesium的ScreenSpaceEventHandler函数处理用户输入事件
          let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
          // 设置要在输入事件上执行的功能,官方文档查询ScreenSpaceEventType可以看到所有的cesium鼠标事件
          handler.setInputAction((event) => {
              //屏幕坐标=》迪卡尔空间直角坐标
            let cartesian3 = viewer.scene.camera.pickEllipsoid(event.position, viewer.scene.globe.ellipsoid)
            // 防止点击到地球之外报错,加个判断
            if (cartesian3 && Cesium.defined(cartesian3)) {
                //cartographic是地理坐标(弧度)
              let cartographic = Cesium.Cartographic.fromCartesian(cartesian3)
                //再转换成经纬度
              let lng = Cesium.Math.toDegrees(cartographic.longitude)
              let lat = Cesium.Math.toDegrees(cartographic.latitude)
              let height = cartographic.height;
              console.log(lng, lat, height);
            }
          }, Cesium.ScreenSpaceEventType.LEFT_CLICK)

        }
      
           function addSlope(url,height) {
                var tileset = viewer.scene.primitives.add(
                    new Cesium.Cesium3DTileset({
                        url:url,
                        maximumScreenSpaceError: 2,//默认16,最大屏幕空间错误
                        maximumNumberOfLoadedTiles: 1000,
                        maximumMemoryUsage:1024//默认512,内存MB的最大数量
                    }));
                tileset.readyPromise.then((tileset) => {
                    tileSet(tileset,height)
                        
                    viewer.zoomTo(tileset);//视野定位到模型处
                });
            }
            
            function tileSet(tileset, height)
            {
                //3dtile模型的边界球体
                var boundingSphere = tileset.boundingSphere;
                //迪卡尔空间直角坐标=>地理坐标(弧度制)
                var cartographic_original = Cesium.Cartographic.fromCartesian(boundingSphere.center);
                //地理坐标(弧度制)=>迪卡尔空间直角坐标
                var Cartesian3_original = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, cartographic_original.height);
                var Cartesian3_offset  = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, height);
                //获得地面和offset的转换
                var translation = Cesium.Cartesian3.subtract(Cartesian3_offset, Cartesian3_original, new Cesium.Cartesian3());
                //修改模型矩阵
                tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
            }
</script>
</body>
</html>

本案例中对模型高度调整,是参考教程3种的方法进行设置,具体全参数设置,可以参考教程3.

标签:教程,tileset,cartographic,viewer,var,Cesium,cesium,height,加载
From: https://www.cnblogs.com/tiandi/p/16785916.html

相关文章