其他分享
首页 > 其他分享> > cesium根据输入角度设置中心点(俯视角度)

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,如有侵权,请联系删除。

标签:uSq,var,角度,sinSigma,中心点,cesium,cos2SigmaM,sigma,Math
来源: https://www.cnblogs.com/hustshu/p/16184635.html