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

一、前言

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

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

在相同的坐标基准下,将大地坐标系转换为大地空间直角坐标系的公式为:
在这里插入图片描述

上式中: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])
}

得到数据:
在这里插入图片描述

三、最后

在计算之后,我将第一条数据在matlab上也算了一次,没有太大的出入。
在这里插入图片描述

WGS84坐标系大地坐标转换空间直角坐标的C++代码如下: ``` #include <iostream> #include <cmath> using namespace std; const double PI = 3.14159265358979323846; const double a = 6378137.0; // WGS84椭球长半轴 const double b = 6356752.3142; // WGS84椭球短半轴 const double f = (a - b) / a; // WGS84椭球扁率 const double e2 = (a * a - b * b) / (a * a); // WGS84椭球第一偏心率的平方 double rad(double d) { return d * PI / 180.0; } double deg(double r) { return r * 180.0 / PI; } double N(double B) { return a / sqrt(1 - e2 * sin(rad(B)) * sin(rad(B))); } void BLH2XYZ(double B, double L, double H, double &X, double &Y, double &Z) { double N1 = N(B); X = (N1 + H) * cos(rad(B)) * cos(rad(L)); Y = (N1 + H) * cos(rad(B)) * sin(rad(L)); Z = (N1 * (1 - e2) + H) * sin(rad(B)); } void XYZ2BLH(double X, double Y, double Z, double &B, double &L, double &H) { double p = sqrt(X * X + Y * Y); double theta = atan2(Z * a, p * b); B = atan2(Z + e2 * b * pow(sin(theta), 3), p - e2 * a * pow(cos(theta), 3)); L = atan2(Y, X); double N1 = N(B); H = p / cos(B) - N1; } int main() { double B, L, H, X, Y, Z; cout << "请输入大地坐标系中的纬度、经度和大地高(单位:度、度、米):" << endl; cin >> B >> L >> H; BLH2XYZ(B, L, H, X, Y, Z); cout << "空间直角坐标中的X、Y、Z分别为:" << endl; cout << X << " " << Y << " " << Z << endl; cout << "请输入空间直角坐标中的X、Y、Z(单位:米):" << endl; cin >> X >> Y >> Z; XYZ2BLH(X, Y, Z, B, L, H); cout << "大地坐标系中的纬度、经度和大地高(单位:度、度、米)分别为:" << endl; cout << B << " " << L << " " << H << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值