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

一、概述

大地坐标系是以大地经度L,大地纬度B和大地高H表示空间一点几何位置的坐标系。其中大地经度由起始大地子午面起算,向东量度,由0°至360°;亦可向东向西量度,各由0°到180°,分别称为东经和西经,东经为正,西经为负。
某点的法线与赤道面夹角叫做该点的大地纬度,以B表示。大地纬度由赤道面起算,向南、向北两极量度,各由0°到90°,分别称为南纬和北纬,北纬为正,南纬为负。
地面点沿法线到参考椭球面的距离称为该点的大地高,以字母H表示。大地高从椭球面起算,向外为正,向内为负。
大地空间直角坐标系以椭球中心O为坐标原点,以起始大地子午面与赤道面交线为X轴,在赤道面上与X轴正交的方向为Y轴,椭球的旋转轴为Z轴,构成右手坐标系O-XYZ。

在这里插入图片描述
图1 大地坐标系与大地空间直角坐标系

二、已知点的大地坐标(B,L,H)计算点的空间直角坐标(X,Y,Z)

所需公式:
X=(N+H)cos(B)cos(L)
Y=(N+H)cos(B)sin(L)
Z= [ N(1-e2)+H ]*sin(B)
其中N为法线长N=a/W
W为一辅助公式W=sqrt((1-e2)sin2B)

计算要求:
本例中采用GRS80椭球参数进行计算,最终结果以米为单位输出到屏幕,保留3位小数
(首先编写了度分秒转弧度函数)

matlab源程序如下:

度分秒转弧度函数

function rad=d2r(deg,min,sec)
    %    角度转弧度
    rad=(deg+min/60+sec/3600)*pi/180;

主程序

clear
clc
b=d2r(33,44,55.666);
l=d2r(77,11,22.333);
h=5555.660;   %经纬度
a=6378137;f=1/298.257222101;e2=2*f-f^2;   %GRS80椭球参数
W=sqrt(1-e2*(sin(b))^2);
N=a/W;
X=(N+h)*cos(b)*cos(l);
Y=(N+h)*cos(b)*sin(l);
Z=(N*(1-e2)+h)*sin(b);
fprintf('\nX=%.3fm\nY=%.3fm\nZ=%.3fm\n',X,Y,Z);

二、已知大地空间直角坐标(X,Y,Z)计算大地坐标(B,L,H)

所需公式:
tan(L)=Y / X,则L=atan(Y / X)
tan(B)=1 / sqrt(X2 + Y2)*(Z + ae2tanB / sqrt(1+tan2B-e2tan2B))
此处需要使用迭代算法来计算B的值,首先取一个初值tan(B0)=Z/sqrt(X2+Y2
收敛条件为两次tanB的绝对值之差小于5×10-10(也就是两次计算的B的绝对值之差小于0.0001″),可停止迭代

H=Z/sinB - N(1 - e2)
其中N为法线长N=a/W
W为一辅助公式W=sqrt((1-e2)sin2B)

计算要求:
本例采用CGCS2000椭球参数进行计算,度数以小数形式显示出来,即
B=30°12′29″ 显示为 B=30.122900000(秒保留5位小数)
高程保留3位小数
(首先要编写弧度转角度函数)

matlab源程序如下:

弧度转角度并确定输出格式

扫描二维码关注公众号,回复: 10918838 查看本文章
function deg=r2d(rad)
    %   弧度转角度
    rad1=rad*180/pi;
    deg1=fix(rad1);
    min=fix((rad1-deg1)*60);
    sec=((rad1-deg1)*60-min)*60;
    deg=deg1+min/100+sec/10000;

主程序

clear
clc
X=-2109101.506+500*29;
Y=4843022.866+500*29;
Z=3562987.896+500*29;     %空间直角坐标
a=6378137;f=1/298.257222101;e2=2*f-f^2;    %CGCS2000椭球参数
l=atan(Y/X);
L=r2d(l);
tanb0=Z/(sqrt(X^2+Y^2));
tanb1=(1/sqrt(X^2+Y^2))*(Z+(a*e2*tanb0)/(sqrt(1+tanb0^2-e2*tanb0^2)));
while abs(tanb1-tanb0)>=1e-7
    tanb0=tanb1;
    tanb1=(1/sqrt(X*X+Y*Y))*(Z+(a*e2*tanb0)/(sqrt(1+tanb0^2-e2*tanb0^2)));
end
b=atan(tanb1);
B=r2d(b);
W=sqrt(1-e2*(sin(b)^2));
N=a/W;
H=(sqrt(X^2+Y^2)/cos(b))-N;
fprintf('\nB=%.9f\nL=%.9f\nH=%.3f\n',B,L,H);

如有错漏之处敬请指正

发布了13 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43637490/article/details/89371315