当前位置:网站首页>Cesium knows the longitude and latitude of one point and the distance to find the longitude and latitude of another point

Cesium knows the longitude and latitude of one point and the distance to find the longitude and latitude of another point

2022-07-07 14:04:00 The most ferocious little seal

The whole article refers to :GIS Algorithm – Know a little latitude and longitude , azimuth , Find another point from distance

The algorithm used by the great God :
Great circle algorithm :http://www.movable-type.co.uk/scripts/latlong.html

Usage method : Direct value transfer , What you return is the longitude and latitude of another point .

explain : Elevation is not considered in this method .

/** * * @param {*} lon  longitude  * @param {*} lat  latitude  * @param {*} angle  angle  (0~360 degree ) * @param {*} distance  distance  ( rice ) * */
function get_another_point(lon, lat, angle, distance) {
    
	// WGS84 Coordinate system 
	var a = 6378137;	//  Equatorial radius 
	var b = 6356752.3142;	//  Short radius 
	var f = 1 / 298.257223563;	//  Oblateness 

	var alpha1 = angle * (Math.PI / 180)
	var sinAlpha1 = Math.sin(alpha1);
	var cosAlpha1 = Math.cos(alpha1);
	var tanU1 = (1 - f) * Math.tan(lat * (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 = distance / (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 = distance / (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

	return {
     lon: Number(lon) + L * (180 / Math.PI), lat: lat2 * (180 / Math.PI) };
}
原网站

版权声明
本文为[The most ferocious little seal]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207071159349652.html