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