JavaScript 实现大地坐标系转换为空间直角坐标系(BLH→XYZ)

一、前言

参考文章:使用Matlab对大地测量学中的大地坐标和大地空间直角坐标进行相互转换

相关文章:JavaScript 实现空间直角坐标系转换为大地坐标系(XYZ→BLH)

在相同的坐标基准下,将大地坐标系转换为大地空间直角坐标系的公式为:
JavaScript 实现大地坐标系转换为空间直角坐标系(BLH→XYZ)_第1张图片

上式中:N为卯酉圈曲率半径;a为地球椭球的长半轴;b为地球椭球的短半轴

二、实现代码

// 原始数据:B,L,H (角度制)
var mainData = [
    [23.10000000,113.1666667,10],
    [23.11666667,113.1833333,10],
    [23.13333333,113.2000000,10],
    [23.15000000,113.2166667,10],
    [23.16666667,113.2333333,10]
]
// 定义坐标系椭球参数对象
let wgs84 = {
    a: 6378137,                     //长半径,单位m
    b: 6356752.3142451795,          //短半径
    f: 1/298.257223563,             //扁率
}
var square = num => num*num         //快速计算平方
let d2r = Math.PI / 180;            //弧度 = 角度 * Math.PI / 180

/*  
*   RE:Reference Ellipsoid(参考椭球体)
*   data: 一个存放数据的对象
*/  
function BLHtoXYZ (RE,data){
    let B = data.B;
    let L = data.L;
    let H = data.H;

    let e2 = (square(RE.a)-square(RE.b))/(square(RE.a));
    let N = RE.a/Math.sqrt(1-e2*square(Math.sin(B*d2r)));
    let X = (N+H)*Math.cos(B*d2r)*Math.cos(L*d2r);
    let Y = (N+H)*Math.cos(B*d2r)*Math.sin(L*d2r);
    let Z = (N*(1-e2)+H)*Math.sin(B*d2r);
    let result = {X:X,Y:Y,Z:Z};     //将结果保存到result对象中
    return result;
}
// 读取、处理数据
var outputResult =[];
for (var i=0;i<mainData.length;i++){
    let BLH = {
        B: mainData[i][0],
        L: mainData[i][1],
        H: mainData[i][2],
    };
    let XYZ = BLHtoXYZ(wgs84,BLH);
    let opXYZ = [XYZ.X,XYZ.Y,XYZ.Z];
    outputResult.push(opXYZ);
}
// 将结果输出到控制台
for (let i=0;i<outputResult.length;i++){
    console.log(outputResult[i])
}

得到数据:
JavaScript 实现大地坐标系转换为空间直角坐标系(BLH→XYZ)_第2张图片

三、最后

在计算之后,我将第一条数据在matlab上也算了一次,没有太大的出入。
JavaScript 实现大地坐标系转换为空间直角坐标系(BLH→XYZ)_第3张图片

你可能感兴趣的:(javascript)