一、前言
在相同的坐标基准下,将大地坐标系转换为大地空间直角坐标系的公式为:
上式中: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上也算了一次,没有太大的出入。