• cesium根据输入角度设置中心点(俯视角度)


    
    //该经纬度为90度俯视角时的在地图中心点
    var latlng={lat:22.749373512,lng:114.58905555}
    var angle=90//俯视角度,默认90°,可手动更改
    //做计算
    let centerLatlng=getCenterLatlng(latlng.lng, latlng.lat,158,8000/Math.tan(angle*Math.PI/180))
    
    viewer.scene.camera.setView({
              destination : Cesium.Cartesian3.fromDegrees(centerLatlng.lng, centerLatlng.lat, 8000.0),
              orientation : {
                heading : Cesium.Math.toRadians(338),
                pitch : Cesium.Math.toRadians(-power.angle),
                roll : 0.0
              }
            });
    //参数 lng、lat为90俯视时的中心,bring为 heading 角度,取反方向
    //dist
    function getCenterLatlng(lng, lat, brng, dist) {
          var a = 6378137;
          var b = 6356752.3142;
          var f = 1 / 298.257223563;
    
          var lon1 = lng * 1;
          var lat1 = lat * 1;
          var s = dist;
          var alpha1 = brng * (Math.PI / 180)
          var sinAlpha1 = Math.sin(alpha1);
          var cosAlpha1 = Math.cos(alpha1);
          var tanU1 = (1 - f) * Math.tan(lat1 * (Math.PI / 180));
          var cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)), sinU1 = tanU1 * cosU1;
          var sigma1 = Math.atan2(tanU1, cosAlpha1);
          var sinAlpha = cosU1 * sinAlpha1;
          var cosSqAlpha = 1 - sinAlpha * sinAlpha;
          var uSq = cosSqAlpha * (a * a - b * b) / (b * b);
          var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
          var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
          var sigma = s / (b * A), sigmaP = 2 * Math.PI;
          while (Math.abs(sigma - sigmaP) > 1e-12) {
              var cos2SigmaM = Math.cos(2 * sigma1 + sigma);
              var sinSigma = Math.sin(sigma);
              var cosSigma = Math.cos(sigma);
              var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) -
                  B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM)));
              sigmaP = sigma;
              sigma = s / (b * A) + deltaSigma;
          }
    
          var tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1;
          var lat2 = Math.atan2(sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1,
              (1 - f) * Math.sqrt(sinAlpha * sinAlpha + tmp * tmp));
          var lambda = Math.atan2(sinSigma * sinAlpha1, cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1);
          var C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha));
          var L = lambda - (1 - C) * f * sinAlpha *
              (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
    
          var revAz = Math.atan2(sinAlpha, -tmp); // final bearing
    
          var lngLatObj = { lng: lon1 + L * (180 / Math.PI), lat: lat2 * (180 / Math.PI) }
          return lngLatObj;
        }
    
    //算法思路,
    /**cesium本身的摄像机位置时固定的,更改pitch时,更改的时摄像机的俯视角度,
    这种情况下就会导致,虽然角度改变了,但是试图的中心位置不是想要之前想要放置的位置了,
    不过只要经过计算即可得到转换后的经纬度,如下图所示
    当俯视角阿尔法改变后,摄像机视图的中心点看到的位置,相当于摄像机平移长度 a  后俯视的位置
    h为摄像机高度,可以求出 a 为  h/tan(α),这样求出的 a 为长度,单位为米,将其转换为经纬度即可
    */
    
    

    在这里插入图片描述

    本文转自 https://blog.csdn.net/qq_42751928/article/details/121698085,如有侵权,请联系删除。

  • 相关阅读:
    鲜牛奶与纯牛奶的区别 All In One
    Rough Notation Animation All In One
    java基础编程String及相关
    JDBC1
    java基础数据类型
    java基础编程
    JDBC3
    MYSQL1
    JDBC2
    JSP和Servlet的相同点和不同点,他们之间的联系
  • 原文地址:https://www.cnblogs.com/hustshu/p/16184635.html
Copyright © 2020-2023  润新知