基于matlab的大地坐标与直角坐标间的转换精编版
导航中直角坐标转换为地理坐标的matlab程序
迭代次数:
误差:
18000个点中,发散点个数为:convergenum =0
主程序:
R=6378.173*1000;
r=6356.7523142*1000;
f=(R-r)/R;
w=linspace(-90,90,30); %纬度i
flag=1; %标志位,判断是否收敛
while flag==1
kk=kk+1; %step5迭代次数加1
ff=A*t^4+(B+C)*t^3+(B-C)*t-A;
df=4*A*t^3+3*(B+C)*t^2+(B-C);
tnew=t-ff/df; %step6 t值的更新
oldt=t; %存储旧的t
for k=1:length(xxe(1,1,:)) %高度k
x0=sqrt(xxe(i,j,k)^2+yye(i,j,k)^2);%根据直角坐标系求x0.z0
z0=zze(i,j,k); %step2
A=r*z0; %系数A,在求牛顿迭代算法时使用
B=2*R*x0;
C=2*(R^2-r^2);
if z0==0 %step3 z0=0的情况,
%经纬高wlh转换为直角坐标系xyz
function [xxe,yye,zze]=wlh_change_xyz(w,l,h)
R=6378.173*1000;
r=6356.7523142*1000;
f=(R-r)/R;
hhj=pi/180; %角度换算成弧度需乘的量
w=w*hhj; %纬度换算成弧度
l=l*hhj; %经度换算成弧度
matlab直角坐标和经纬度的换算
matlab直角坐标和经纬度的换算摘要:I.引言- 介绍MATLAB 软件- 说明直角坐标和经纬度换算的重要性II.MATLAB 中直角坐标和经纬度的转换方法- 利用MATLAB 内置函数进行转换- 利用MATLAB 进行手动计算转换III.实际应用案例- 使用MATLAB 进行经纬度换算的实际案例- MATLAB 在地理信息系统中的应用IV.结论- 总结MATLAB 在直角坐标和经纬度换算中的作用- 展望MATLAB 在地理科学领域的未来发展正文:MATLAB 是一种功能强大的数学软件,被广泛应用于科学计算、数据分析、图像处理等领域。
在地理科学领域,MATLAB 也具有重要的应用价值,可以用于进行直角坐标和经纬度的换算。
在MATLAB 中,经纬度和直角坐标之间的转换可以通过使用MATLAB 内置的函数来实现。
具体来说,可以使用MATLAB 中的`geocode`函数将经纬度转换为直角坐标,使用`reverse`函数将直角坐标转换为经纬度。
这些函数的使用方法简单,易于操作,可以帮助用户快速完成坐标转换。
除了使用MATLAB 内置函数进行转换外,用户也可以手动计算经纬度和直角坐标之间的转换。
这种方法需要用户掌握一定的数学知识,例如地理坐标系和直角坐标系之间的转换公式。
通过手动计算,用户可以更深刻地理解坐标转换的原理,更好地掌握MATLAB 的使用方法。
在实际应用中,MATLAB 的经纬度和直角坐标换算功能被广泛应用于地理信息系统(GIS) 中。
GIS 是一种以采集、存储、管理、分析和应用地理信息为主要任务的技术系统,可以用于制作地图、分析地理数据、规划城市等方面。
MATLAB 可以与GIS 软件相结合,帮助用户更好地完成地理数据的处理和分析。
综上所述,MATLAB 在直角坐标和经纬度的换算中发挥着重要作用。
通过使用MATLAB,用户可以方便地进行地理数据的处理和分析,更好地理解和应用地理科学知识。
基于MATLAB的七参数坐标系统转换问题分析(精)
基于 MATLAB 的七参数法坐标系统转换问题分析 1张鲜妮 21, ,王磊 21,1、中国矿业大学环境与测绘学院,江苏徐州 (2210082、江苏省资源环境信息工程重点实验室,江苏徐州 (221008E-mail:摘要:GPS 测量的坐标是基于 WGS-84坐标系下的,而我国实用的测量成果大多都是基于北京 54坐标系下的。
随着 GPS 测量技术的广泛使用,由 WGS-84坐标向北京 54坐标系下坐标的转换问题一直是一个可探讨的问题, 坐标系统转换的现有模型很多, 但常用的还是经典的七参数转换模型。
随着不断的实践研究, 发现七参数在进行坐标系统转换时有一定的局限性。
本文采用 MATLAB 语言编写了七参数法坐标系统转换程序,并对七参数坐标系统转换的若干问题进行了分析讨论。
分析结果表明, 小区域范围内用正常高代替大地高对坐标转换精度影响很小; 公共点分布情况对坐标转换精度影响显著; 合适的公共点密度有利于提高坐标转换精度。
关键词:七参数法;坐标系统; MATLAB ;转换问题1. 引言随着 GPS 空间定位技术的发展, GPS 技术以其快速、精确、全天候在测量中的应用变的越来越广泛, GPS 成为建立基础控制网的首选手段 ]1[,由于 GPS 系统采用的是 WGS-84坐标系, 是一种地心坐标系, 而我国目前常用的两个坐标系 1954年北京坐标系 (以下称 BJ54 和 1980年国家大地坐标系,是一种参心坐标系,采用克拉所夫斯基椭球为参考椭球,并采用高斯克吕格投影方式进行投影, 我国的国土测量成果和在进行工程施工时大都是基于这两个坐标系下的。
所以在利用 GPS 技术进行测量过程中必然存在由 WGS-84坐标向北京 54坐标系下的转换问题。
现有的转换模型已经成熟,归纳起来主要有布尔莎 -沃尔夫模型(七参数法、莫洛登斯基 -巴代卡斯模型和范士模型 ]2[。
本文主要分析讨论是基于七参数转换模型, 分析工具是MATLAB 软件。
基于MATLAB的坐标转换程序设计
文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。
2008届毕业生毕业论文(设计)题目:基于MATLAB的坐标转换程序设计摘要本文主要阐述了基于MATLAB的坐标转换程序设计与实现的问题。
论述以MATLAB为开发平台和编程语言,设计出解决工程测量中常见的坐标转换问题的程序。
坐标转换一直是专业性强且不易解决的问题,针对目前坐标转换软件功能单一、操作不方便等问题,采用窗口、菜单、控件的操作方式,实现了所见即所得的人性化界面设计。
程序的设计主要从两个方面进行,其一保证程序有较高的转换精度,其二是友好的界面设计。
程序的运行能满足工程测量人员对坐标转换运算和坐标数据分析的需要,程序实现了不同参考椭球情况下七参数和四参数的计算过程、不同坐标系统的坐标转换和换带计算程序化。
论文还诠释了测量坐标转换的含义和内容,针对坐标转换基本模型的选用、转换参数的解算、转换计算的方法、转换计算中值得注意的问题加以研究和探讨,以便实现在测量实践和理论中各类不同坐标之间的转换计算。
关键词:坐标转换,换带,参考椭球,MATLAB,图形用户界面AbstractThis article expatiates the design and implementation of a computing program for coordinate conversion, operation of MATLAB. With programmed language, the article designs the program of solving the common coordinate conversion problems in the engineering survey, which regards MATLAB as an exploitation basis. coordinate conversion is a professional problem which is difficult to solve, to solve the existed problems , the operating modes of windows, menus and widgets are adopted. Moreover, the WYSWYG humanized program designs are realized. The program designs come from two aspects. Firstly, the powerful operation function of the program is guaranteed. Secondly, the visualization is designed. The program operation meets the needs which engineering survey personnel need to have the coordinate conversion operation and data analysis. Meanwhile, the program designs the coordinate conversion function, including coordinate conversion among different coordinate systems and between two projection zones, realizing the computation of 4 parameters as well as 7 parameters under the coordinates among different coordinate systems. Above all, the article includes the meaning and content of transformation, basic model selection of coordinates transformation, calcu1ation of transformation parameters, calculation method of transformation and problems existing in transformation. Calculation are researched and discussed in this paper in order to measure transformation calculation of different coordinate in practice and theory.Key words:Coordinate conversion, Stripe exchange, Reference ellipsoid, MATLAB,GUI目录前言..................................................... 错误!未定义书签。
基于matlab的大地坐标与直角坐标间的转换
基于matlab的大地坐标与直角坐标间的转换LT编写大地坐标与空间直角坐标相互转换的程序,并对格式化文件数据进行计算,验证程序。
二、实验内容:1、大地坐标向空间直角坐标换算转换公式:B h e N z LB h N y LB h N x sin ])1([sin cos )(cos cos )(2+-=+=+= (1)其中:L 为经度,B 为纬度,h 为大地高,B e aN 22sin 1-=为卯酉圈曲率半径,a b a e 22-=为第一偏心率,a 为旋转椭球长半轴,b 为短半轴。
WGS84椭球参数:长半轴 a = 6378137 扁率 f =1/298.257223563根据上式创建以geo 2xyz 命名的函数,函数输入输出格式为[x, y, z] = geo 2xyz (L, B, h)2、空间直角坐标向大地坐标换算根据式(1)推导大地坐标向空间直角坐标转换公式:N By x h yx B Ne z B x y L -+=++==cos )sin arctan()/arctan(22222 注意计算纬度时需要用到迭代,可用)arctan(22yx b az B +=作为初始值。
创建以xyz2geo 命名的函数,函数输入输出格式为[L, B, h] = xyz 2geo (x, y, z)三、实验步骤1、大地坐标向空间直角坐标换算主程序:%%大地坐标向空间直角坐标换算%函数的输入输出格式为[x,y,z]=geo2xyz(L,B,h)[filename,pathname] = uigetfile('*.txt','请选择打开的数据文件'); file = [pathname, filename];data = importdata(file);L=data.data(:,1);B=data.data(:,2);h=data.data(:,3);[x,y,z]=geo2xyz(L,B,h);A=[x,y,z];A=A';[filename_out,pathname_out] = uiputfile('*.txt','请选择要输出数据文件');fileout = [pathname_out, filename_out];fid = fopen(fileout,'wt');fprintf(fid,' x y z\n'); fprintf(fid,'%15.7f %15.7f %15.7f\n',A);close('all');函数:function [x,y,z]=geo2xyz(L,B,h)%大地坐标经纬度转换成空间直角坐标B=dms2rad(B);L=dms2rad(L);a=6378137;%a是长半轴f=1/298.257223563;%f是扁率b=a-a*f;e=sqrt(a^2-b^2)/a;N=a./(sqrt(1-e^2.*(sin(B)).^2));%N为卯酉圈半径率,e为第一偏心率x=(N+h).*cos(B).*cos(L);y=(N+h).*cos(B).*sin(L);z=(N*(1-e^2)+h).*sin(B);endfunction rad=dms2rad(jiaodu)%度分秒->弧度(rad)degree = fix(jiaodu);mimute = fix((jiaodu-degree)*100);second = (jiaodu-degree-mimute/100)*10000;degree = degree+mimute/60+second/3600;rad=degree/180*pi;end2、空间直角坐标向大地坐标换算主程序:%% 将文件data.2.txt中的空间直角坐标系转换为大地坐标,并将计算结果按照格式存储在文件data3.txt中%data3.txt格式为:经度(ddmmss)纬度(ddmmss)大地高[filename,pathname]=uigetfile('*.txt','请选择打开的数据文件');file=[pathname,filename];data=importdata(file);x=data.data(:,1);y=data.data(:,2);z=data.data(:,3);[L,B,H]=xyz2geo(x,y,z);[filename_out,pathname_out] = uiputfile('*.txt','请选择要输出数据文件');fileout = [pathname_out, filename_out];fid = fopen(fileout,'wt');fprintf(fid,' 经度(ddmmss)纬度(ddmmss)大地高\n');fprintf(fid,'%10.7f %10.7f %7.3f\n',[L,B,H]'); fclose('all');函数:function [L,B,H]=xyz2geo(x,y,z)%将直角坐标转换为大地坐标%% 已知:WGS-84椭球参数f=1/298.257223563;%扁率f=(a-b)/aa=6378137; %长半轴b=a*(1-f); %短半轴e=(sqrt(a^2-b^2))/a; %第一偏心率%% 经度L的计算L=atan2(y,x);L=rad2dms(L);%% 纬度B的计算B0=atan2((a*z),(b.*sqrt(x.^2+y.^2))); % B初始值while 1N=a./(sqrt(1-(e^2).*(sin(B0).^2))); %卯酉圈曲率半径NB=atan2(z+N.*(e^2).*sin(B0),(sqrt(x.^2+y.^2)));if abs(B0-B)<10^-6break;endabs(B0-B)B0=B;end%% 大地高H的计算H=(sqrt(x.^2+y.^2))./cos(B)-N;B=degree2dms(B.*180/pi);%纬度BEndfunction dms= degree2dms(jiaodu)%度->度分秒(dd.mmss)degree = fix(jiaodu);mimute = fix((jiaodu-degree)*60); second = ((jiaodu-degree)*60-mimute)*60; dms = degree+mimute/100+second/10000;。
基于MATLAB的坐标转换方法研究
( 国家测绘地理信息局 大地 测量数据处理中心 , 陕西 西安 7 1 0 0 5 4 )
摘 要 : 利用 M A T L A B强大矩 阵计算功能 , 精确地计算不 同坐标 系之 间的转换参数 , 实现 不 同坐标 系之 间的 坐标 快速 转换 。实践 结果表 明 , 该方法使 用方便 , 结果准确 , 转换精度 高, 可满足不 同坐标转换精度需求。 关键词 : MA T L A B; 坐标转换 ; 转换参数 ; 重合 点
HAN Ma i —x i a ,C HENG Ch u a n—l u,W ANG Xi a—l i
( Ge o d e t i c D a t a P r o c e s s i n g Ce n t e r o f S B S M, X i h n 7 1 0 0 5 4 , C h i n a )
中图分类号 : P 2 2 6 . 3 文献标识码 : B 文章编号 : 1 6 7 2 — 5 8 6 7 ( 2 0 1 3 ) 0 9— 0 1 8 3— 0 4
Th e Re s e a r c h o f Co o r d i n a t e Tr a n s f o r ma t i o n Me t ho d s Ba s e d o n M ATLAB
l 0 l
O l 0
Ab s t r a c t :Us i n g MAT L AB p o we r f u l c o mp u t e s Ma t i r x f u n c t i o n s t o p r e c i s i o n c o mp u t e t r a n s f o r ma t i o n p a r a me t e r o f d i f f e r e n t c o o r d i n a t e s y s t e ms f o r C o o r d i n a t e o f d i f f e r e n t c o o r d i n a t e s y s t e ms f a s t t r a n s f o m a r t i o n .Th e r e s u l t s o f t h i s e x p e ime r n t i n d i c a t e d t h a t t h e me t h o d i s u s e a b l e a n d w e g e t t h e e x a c t r e s u l t .I t C n a b e s a t i s f i e d or f t r a n s f o r ma t i o n o f d i f f e r e n t c o o r d i n a t e p r e c i s i o n r e q u i r e me n t . Ke y wo r d s : MAT L AB; c o o r d i n a t e t r a n s f o r ma t i o n ; t r ns a f o r ma t i o n p a r a me t e r ; c o i n c i d e n t p o i n t
基于MATLAB的坐标系统转换程序设计
在实践中,由于不同时期、不同目的而采用了 不同的坐标系,因此坐标转换是不可避免的,且计 算过程复杂。笔者主要研究利用 MATLAB 语言实 现两类坐标转换:一类是同一坐标系统下大地坐 标、空间直角坐标和高斯平面直角坐标之间的转 换;另一类是不同坐标系统下空间直角坐标之间的 转换和平面直角坐标之间的转换。
=
-
35 96
e'6
+
735 1 024
e'8,
茁8 =
315 1 024
e'8;l =
(L - L0)"/籽";N 为卯酉圈曲率半
径,N = a姨1 - e2sin2B ,t = tanB,浊 = e'cosB。
1.2.2 高斯投影坐标反算
扇缮设设XY
= =
蓸N+H 蓸N+H
蔀 cosBcosL, 蔀 cosBsinL,
墒设设Z= 蓘 N 蓸 1 - e2 蔀 + H 蓡 sinB .
(1)
地球坐标转换与matlab应用
地球坐标转换与matlab应用地球坐标转换与Matlab应用1. 引言地球坐标转换是地理信息系统中重要的一部分,它涉及到将地球上的点的位置从一种坐标系统转换成另一种坐标系统。
在时间和空间领域中,地球坐标转换具有广泛的应用,包括导航系统、地图制图、地图投影等。
而Matlab作为一款功能强大的数学软件,可以用于处理和分析地理空间数据,被广泛应用于地球坐标转换中。
本文将以地球坐标转换与Matlab应用为主题,介绍地球坐标转换的基本概念、常用的转换方法和Matlab在地球坐标转换中的应用案例。
2. 地球坐标系统简介地球坐标系统是用于描述地球上点的位置的一种坐标系统。
常用的地球坐标系统主要包括经纬度坐标系统和投影坐标系统。
经纬度坐标系统使用经度和纬度来确定地球上某个点的位置,经度表示东西方向的位置,纬度表示南北方向的位置。
投影坐标系统是经纬度坐标系统的扁平化表示,它使用投影方式将地球上的曲面投影到平面上,以方便地图制图等应用。
3. 地球坐标转换方法地球坐标转换可以通过多种方法进行,根据不同的需求和应用场景选择合适的方法进行转换。
常用的地球坐标转换方法包括经纬度与投影坐标的相互转换、不同投影坐标系之间的转换等。
3.1 经纬度与投影坐标的转换经纬度与投影坐标之间的转换是地球坐标转换中常见的任务。
其中,经纬度转投影坐标可以利用地图投影算法实现,常见的投影算法包括墨卡托投影、UTM投影等。
而投影坐标转经纬度则需要进行反投影计算,将投影坐标转换回经纬度。
3.2 不同投影坐标系的转换在地理信息系统中,常常需要将数据由一个投影坐标系转换到另一个投影坐标系,以适应不同的应用需求。
这种转换可以在Matlab中使用相关的函数进行处理,例如Matlab中的`projfwd`和`projinv`函数可以实现不同投影坐标系之间的相互转换。
4. Matlab中的地球坐标转换应用Matlab是一款功能强大的数学软件,它提供了丰富的工具箱和函数,可以用于处理地理空间数据以及进行地球坐标转换。
大地坐标与空间直角坐标的转换程序代码
#include "stdio、h"#include "math、h"#include "stdlib、h"#include "iostream"#define PI 3、14323double a,b,c,e2,ep2;int main(){int m,n,t;double RAD(double d,double f,double m);void RBD(double hd);void BLH_XYZ();void XYZ_BLH();void B_ZS();void B_FS();void GUS_ZS();void GUS_FS();printf(" 大地测量学\n");sp1:printf("请选择功能:\n");printf("1、大地坐标系到大地空间直角坐标的转换\n");printf("2、大地空间直角坐标到大地坐标系的转换\n");printf("3、贝塞尔大地问题正算\n");printf("4、贝塞尔大地问题反算\n");printf("5、高斯投影正算\n");printf("6、高斯投影反算\n");printf("0、退出程序\n");scanf("%d",&m);if(m==0)exit(0);sp2:printf("请选择椭球参数(输入椭球序号):\n");printf("1、克拉索夫斯基椭球参数\n");printf("2、IUGG_1975椭球参数\n");printf("3、CGCS_2000椭球参数\n");printf("0、其她椭球参数(自行输入)\n");scanf("%d",&n);switch(n){case 1:a=6378245、0;b=6356863、0188;c=6399698、9018;e2=0、297;ep2=0、468;break;case 2:a=6378140、0;b=6356755、2882;c=6399596、6520;e2=0、959;ep2=0、947;break;case 3:a=6378137、0;b=6356752、3141;c=6399593、6259;e2=0、290;ep2=0、547;break;case 0:{printf("请输入椭球参数:\n");printf("长半径a=");scanf("%lf",&a);printf("短半径b=");scanf("%lf",&b);c=a*a/b;ep2=(a*a-b*b)/(b*b);e2=(a*a-b*b)/(a*a);break;}default:printf("\n\n输入错误!\n请重新输入!\n\n");goto sp2 ;}while(1){switch(m){case 1:BLH_XYZ();break;case 2:XYZ_BLH();break;case 3:B_ZS();break;case 4:B_FS();break;case 5:GUS_ZS();break;case 6:GUS_FS();break;default:printf("\n\n输入错误!\n请重新输入!\n\n");goto sp1 ;}printf("就是否继续进行此功能计算? \n\n");printf("( 若继续进行此功能计算,则输入1;\n 若选择其她功能进行计算,则输入2;\n 若退出, 则输入0、)\n");scanf("%d",&t);switch(t){case 1:break;case 2:goto sp1;case 0:exit(0);}}}double RAD(double d,double f,double m) {double e;double sign=(d<0、0)?-1、0:1、0;if(d==0){sign=(f<0、0)?-1、0:1、0;if(f==0){sign=(m<0、0)?-1、0:1、0;}}if(d<0)d=d*(-1、0);if(f<0)f=f*(-1、0);if(m<0)m=m*(-1、0);e=sign*(d*3600+f*60+m)*PI/(3600*180);return e;}void RBD(double hd){int t;int d,f;double m;double sign=(hd<0、0)?-1、0:1、0;if(hd<0)hd=fabs(hd);hd=hd*3600*180/PI;t=int(hd/3600);d=sign*t;hd=hd-t*3600;f=int(hd/60);m=hd-f*60;printf("%d'%d'%lf'\n",d,f,m);}void BLH_XYZ(){double B,L,H,N,W;double d,f,m;double X,Y,Z;printf(" 请输入大地坐标(输入格式为角度(例如:30'40'50')):\n");printf(" 大地经度L=");scanf("%lf'%lf'%lf'",&d,&f,&m);L=RAD(d,f,m);printf(" 大地纬度B=");scanf("%lf'%lf'%lf'",&d,&f,&m);B=RAD(d,f,m);printf(" 大地高H=");scanf("%lf",&H);W=sqrt(1-e2*sin(B)*sin(B));N=a/W;X=(N+H)*cos(B)*cos(L);Y=(N+H)*cos(B)*sin(L);Z=(N*(1-e2)+H)*sin(B);printf("\n\n 转换后得到大地空间直角坐标为:\n\n");printf("X=%lf\nY=%lf\nZ=%lf\n\n",X,Y,Z);}void XYZ_BLH(){double B,L,H,N,W;double X,Y,Z;double tgB0,tgB1;printf(" 请输入大地空间直角坐标:\n");printf(" X=");scanf("%lf",&X);printf(" Y=");scanf("%lf",&Y);printf(" Z=");scanf("%lf",&Z);printf("\n\n 转换后得到大地坐标为:\n\n");L=atan(Y/X);printf(" 大地经度为: L=");RBD(L);printf("\n");tgB0=Z/sqrt(X*X+Y*Y);tgB1=(1/sqrt(X*X+Y*Y))*(Z+a*e2*tgB0/sqrt(1+tgB0*tgB0-e2*tgB0*tgB0));while(fabs(tgB0-tgB1)>5*pow(10,-10)){tgB0=tgB1;tgB1=(1/sqrt(X*X+Y*Y))*(Z+a*e2*tgB0/sqrt(1+tgB0*tgB0-e2*tgB0*tgB0));}B=atan(tgB1);printf(" 大地纬度为:B=");RBD(B);printf("\n");W=sqrt(1-e2*sin(B)*sin(B));N=a/W;H=sqrt(X*X+Y*Y)/cos(B)-N;printf(" 大地高为:H=%lf\n\n",H);}void B_ZS(){double L1,B1,A1,s,d,f,mi;double u1,u2,m,M,k2,alfa,bt,r,kp2,alfap,btp,rp;double sgm0,sgm1,lmd,lmd1,lmd2,A2,B2,l,L2;printf("请输入已知点的大地坐标(输入格式为角度(例如:30'40'50'),下同):\nL1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);L1=RAD(d,f,mi);printf("\nB1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);B1=RAD(d,f,mi);printf("请输入大地方位角:\nA1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);A1=RAD(d,f,mi);printf("请输入该点至另一点的大地线长:\ns=");scanf("%lf",&s);u1=atan(sqrt(1-e2)*tan(B1));m=asin(cos(u1)*sin(A1));M=atan(tan(u1)/cos(A1));m=(m>0)?m:m+2*PI;M=(M>0)?M:M+PI;k2=ep2*cos(m)*cos(m);alfa=(1-k2/4+7*k2*k2/64-15*k2*k2*k2/256)/b;bt=k2/4-k2*k2/8+37*k2*k2*k2/512;r=k2*k2/128-k2*k2*k2/128;sgm0=alfa*s;sgm1=alfa*s+bt*sin(sgm0)*cos(2*M+sgm0)+r*sin(2*sgm0)*cos(4*M+2*sgm0); while(fabs(sgm0-sgm1)>2、8*PI/180*pow(10,-7)){sgm0=sgm1;sgm1=alfa*s+bt*sin(sgm0)*cos(2*M+sgm0)+r*sin(2*sgm0)*cos(4*M+2*sgm0); }sgm0=sgm1;A2=atan(tan(m)/cos(M+sgm0));A2=(A2>0)?A2:A2+PI;A2=(A1>PI)?A2:A2+PI;u2=atan(-cos(A2)*tan(M+sgm0));lmd1=atan(sin(u1)*tan(A1));lmd1=(lmd1>0)?lmd1:lmd1+PI;lmd1=(m<PI)?lmd1:lmd1+PI;lmd2=atan(sin(u2)*tan(A2));lmd2=(lmd2>0)?lmd2:lmd2+PI;lmd2=(m<PI)?(((M+sgm0)<PI)?lmd2:lmd2+PI):(((M+sgm0)>PI)?lmd2:lmd2+PI);lmd=lmd2-lmd1;B2=atan(sqrt(1+ep2)*tan(u2));kp2=e2*cos(m)*cos(m);alfap=(e2/2+e2*e2/8+e2*e2*e2/16)-e2/16*(1+e2)*kp2+3*e2*kp2*kp2/128;btp=e2*(1+e2)*kp2/16-e2*kp2*kp2/32;rp=e2*kp2*kp2/256;l=lmd-sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos(2*M+sgm0)+rp*sin(2*sgm0)*cos(4*M+2*sg m0));L2=L1+l;printf("\n\n得到另一点的大地坐标与大地线在该点的大地方位角为:\n\n");printf("L2=");RBD(L2);printf("\n");printf("B2=");RBD(B2);printf("\n");printf("A2=");RBD(A2);printf("\n");}void B_FS(){double L1,B1,L2,B2,s,A1,A2,du,f,mi,m0,m,M;double l,u1,u2,alfa,bt,r,lmd0,dit_lmd,lmd,sgm,dit_sgm,sgm0,sgm1,alfap,btp,rp,k2,kp2;printf("请输入第一个点大地坐标(输入格式为角度(例如:30'40'50'),下同):\n大地经度L1=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L1=RAD(du,f,mi);printf("大地纬度B1=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B1=RAD(du,f,mi);printf("\n请输入第二个点大地坐标:\n大地经度:L2=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L2=RAD(du,f,mi);printf("大地纬度:B2=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B2=RAD(du,f,mi);l=L2-L1;u1=atan(sqrt(1-e2)*tan(B1));u2=atan(sqrt(1-e2)*tan(B2));sgm0=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l));m0=asin(cos(u1)*cos(u2)*sin(l)/sin(sgm0));dit_lmd=0、003351831*sgm0*sin(m0);lmd0=l+dit_lmd;dit_sgm=sin(m0)*dit_lmd;sgm1=sgm0+dit_sgm;m=asin(cos(u1)*cos(u2)*sin(lmd0)/sin(sgm1));A1=atan(sin(lmd0)/(cos(u1)*tan(u2)-sin(u1)*cos(lmd0)));A1=(A1>0)?A1:A1+PI;A1=(m>0)?A1:A1+PI;M=atan(sin(u1)*tan(A1)/sin(m));M=(M>0)?M:M+PI;k2=ep2*cos(m)*cos(m);alfa=(1-k2/4+7*k2*k2/64-15*k2*k2*k2/256)/b;bt=k2/4-k2*k2/8+37*k2*k2*k2/512;r=k2*k2/128-k2*k2*k2/128;kp2=e2*cos(m)*cos(m);alfap=(e2/2+e2*e2/8+e2*e2*e2/16)-e2/16*(1+e2)*kp2+3*e2*kp2*kp2/128;btp=e2*(1+e2)*kp2/16-e2*kp2*kp2/32;rp=e2*kp2*kp2/256;sgm0=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l));sgm1=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l+sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos( 2*M+sgm0))));while(fabs(sgm0-sgm1)>1*PI/180*pow(10,-8)){sgm0=sgm1;sgm1=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l+sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos( 2*M+sgm0))));}sgm=sgm1;lmd=l+sin(m)*(alfap*sgm+btp*sin(sgm)*cos(2*M+sgm));s=(sgm-bt*sin(sgm)*cos(2*M+sgm)-r*sin(2*sgm)*cos(4*M+2*sgm))/alfa;A1=atan(sin(lmd)/(cos(u1)*tan(u2)-sin(u1)*cos(lmd)));A1=(A1>0)?A1:A1+PI;A1=(m>0)?A1:A1+PI;A2=atan(sin(lmd)/(sin(u2)*cos(lmd)-tan(u1)*cos(u2)));A2=(A2>0)?A2:A2+PI;A2=(m<0)?A2:A2+PI;printf("\n\n得到两点间大地线长S与大地正反方位角A1、A2如下:\n\n");printf("s=%lf\n",s);printf("A1=");RBD(A1);printf("\n");printf("A2=");RBD(A2);printf("\n");}void GUS_ZS(){double B,L,x3,x6,y3,y6,Y3,Y6,du,f,mi,X,N,n,t;double At,Bt,Ct,Dt,m3,m6,l3,l6,W,L03,L06;int DH3,DH6;printf("请输入大地坐标(输入格式为角度(例如:30'40'50')):\n大地经度L=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L=RAD(du,f,mi);printf("\n大地纬度B=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B=RAD(du,f,mi);At=1+3*e2/4+45*e2*e2/64+175*e2*e2*e2/256;Bt=3*e2/4+15*e2*e2/16+525*e2*e2*e2/512;Ct=15*e2*e2/64+105*e2*e2*e2/256;Dt=35*e2*e2*e2/512;X=a*(1-e2)*(At*B-Bt*sin(2*B)/2+Ct*sin(4*B)/4-Dt*sin(6*B)/6);W=sqrt(1-e2*sin(B)*sin(B));N=a/W;n=sqrt(ep2)*cos(B);t=tan(B);DH3=(L-(1、5*PI/180))/(3*PI/180)+1;DH6=L/(6*PI/180)+1;L03=DH3*(3*PI/180);L06=DH6*(6*PI/180)-(3*PI/180);l3=L-L03;l6=L-L06;m3=cos(B)*l3;m6=cos(B)*l6;x3=X+N*t*(m3*m3/2+(5-t*t+9*n*n+4*n*n*n*n)*m3*m3*m3*m3/24+(61-58*t*t+t*t*t*t)* m3*m3*m3*m3*m3*m3/720);x6=X+N*t*(m6*m6/2+(5-t*t+9*n*n+4*n*n*n*n)*m6*m6*m6*m6/24+(61-58*t*t+t*t*t*t)* m6*m6*m6*m6*m6*m6/720);y3=N*(m3+(1-t*t+n*n)*m3*m3*m3/6+(5-18*t*t+t*t*t*t+14*n*n-58*n*n*t*t)*m3*m3*m3 *m3*m3/120);y6=N*(m6+(1-t*t+n*n)*m6*m6*m6/6+(5-18*t*t+t*t*t*t+14*n*n-58*n*n*t*t)*m6*m6*m6 *m6*m6/120);Y3=DH3*1000000+500000+y3;Y6=DH6*1000000+500000+y6;printf("\n\n 得到的高斯平面坐标为:\n\n");printf(" 对于3度带:\n 纵坐标x=%、3lf\n 横坐标y=%、3lf(通用坐标Y=%、3lf)\n\n",x3,y3,Y3);printf(" 对于6度带:\n 纵坐标x=%、3lf\n 横坐标y=%、3lf(通用坐标Y=%、3lf)\n\n",x6,y6,Y6);}void GUS_FS(){double x,y,Y,B,B0,B1,Bf,Vf,tf,Nf,nf,L,At,Bt,Ct,Dt,L3,L6;long DH;printf(" 请输入高斯平面坐标:\n\n");printf(" 纵坐标X=");scanf("%lf",&x);printf("\n");printf(" 自然坐标y=");scanf("%lf",&y);printf("\n");printf(" 通用坐标Y=");scanf("%lf",&Y);printf("\n");At=1+3*e2/4+45*e2*e2/64+175*e2*e2*e2/256;Bt=3*e2/4+15*e2*e2/16+525*e2*e2*e2/512;Ct=15*e2*e2/64+105*e2*e2*e2/256;Dt=35*e2*e2*e2/512;B0=x/(a*(1-e2)*At);B1=(x-a*(1-e2)*(-Bt*sin(2*B0)/2+Ct*sin(4*B0)/4-Dt*sin(6*B0)/6))/(a*(1-e2)*At);while(fabs(B1-B0)>1*pow(10,-8)){B0=B1;B1=(x-a*(1-e2)*(-Bt*sin(2*B0)/2+Ct*sin(4*B0)/4-Dt*sin(6*B0)/6))/(a*(1-e2)*At);}Bf=B1;nf=sqrt(ep2)*cos(Bf);tf=tan(Bf);Vf=sqrt(1+ep2*cos(Bf)*cos(Bf));Nf=c/Vf;B=Bf-Vf*Vf*tf/2*((y/Nf)*(y/Nf)-(5+3*tf*tf+nf*nf-9*nf*nf*tf*tf)*pow((y/Nf),4)/12+(61+90*tf *tf+45*tf*tf)*pow((y/Nf),6)/360);L=((y/Nf)-(1+2*tf*tf+nf*nf)*(y/Nf)*(y/Nf)*(y/Nf)/6+(5+28*tf*tf+24*pow(tf,4)+6*nf*nf+8*nf *nf*tf*tf)*pow((y/Nf),5)/120)/cos(Bf);DH=Y/1000000;L3=3*PI/180*double(DH)+L;L6=6*PI/180*double(DH)-3*PI/180+L;printf("\n\n 得到的大地坐标为:\n\n");printf(" 大地纬度B=");RBD(B);printf("\n");printf(" 若为6度带,大地经度L=");RBD(L6);printf("\n");printf(" 若为3度带,大地经度L=");RBD(L3);printf("\n"); }。
matlab大地测量空间直角坐标转换程序设计
一、实验目的 不同坐标系下空间直角坐标转换是测量工程中经常会遇到的问题,本实验 通过编写空间直角坐标七参数转换的程序,并对格式化文件数据进行计算,验 证程序,从而掌握空间直角转换的基本原理和方法。 二、实验内容: 1、空间直角坐标转换七参数模型(布尔莎模型) 布尔莎 -沃尔夫模型(在我国通常被简称为布尔莎模型 )又被称为七参数转换 (7-Parameter Transformation)或七参数赫尔墨特变换(7-Parameter Helmert Transformation) ,其数学公式为:
0 1 R1 ( X ) 0 cos X 0 sin X
cos Y 0 sin X R2 ( Y ) 0 cos X sin Y
0 sin Y 1 0 0 cos Y
cos Z R3 ( Z ) sin Z 0
七参数计算函数 TtransParam7_Comp 如下:
%由空间直角坐标求解七参数 x0,y0,z0,a1,a2,a3,a4 function Param7 = TtransParam7_Comp (x1,y1,z1,x2,y2,z2)
A=[x1,y1,z1,x2,y2,z2]; [m,n]=size(A); B=zeros(3*m,7);%创建一个 3m 行, 7 列的零矩阵 B L=zeros(3*m,1);%创建一个 3m 行, 1 列的零矩阵 L for i=1:m
-2-
B(3*i-2:3*i,:)=[1 0 0 x1(i) 0 -z1(i) y1(i); 0 1 0 y1(i) z1(i) 0 -x1(i); 0 0 1 z1(i) -y1(i) x1(i) 0] %for 循环组成 B 矩阵 L(3*i-2:3*i,:)=[x2(i),y2(i),z2(i)] %for 循环组成 L 矩阵 end gX=(inv(B'*B))*B'*L %计算误差方程的系数 %由 WGS-84 空间直角坐标和 BJ-54 空间直角坐标列方程组, %根据最小二乘法 VTPV=min 的原则,可列出法方程为求得布尔莎七参数 %根据求得的七参数通过反算,可将 WGS-84 空间直角坐标转化为 BJ-54 空间直角坐标 m=gX(4)-1; ex=(gX(5)/gX(4))*180/pi*3600; ey=(gX(6)/gX(4))*180/pi*3600; ez=(gX(7)/gX(4))*180/pi*3600; Param7=[gX(1),gX(2),gX(3),ex,ey,ez,m];%组成布尔莎七参数矩阵 End
matlab直角坐标和经纬度的换算
文章标题:从matlab直角坐标到经纬度:详细解析与应用在现代科学技术领域中,地理空间信息处理是一个非常重要的方面。
而在处理地理空间信息时,经常需要进行直角坐标和经纬度之间的相互转换。
本文将以matlab编程语言为工具,深入探讨直角坐标和经纬度的换算,帮助读者全面理解这一重要的地理空间信息处理技术。
一、基本概念及原理我们需要了解直角坐标和经纬度的基本概念。
直角坐标是一种描述平面上点位置的坐标系统,通过x、y坐标轴来定位点的位置。
而经纬度则是地球表面上任意一点的位置,其中经度表示在东西方向上的位置,纬度表示在南北方向上的位置。
在进行直角坐标和经纬度之间的转换时,涉及到一些数学和地理知识。
具体原理包括数学中的三角学知识,以及地理上的大地测量知识。
当我们了解了这些基本概念和原理之后,就能更好地进行直角坐标和经纬度的换算。
二、matlab中的直角坐标和经纬度换算函数在matlab编程语言中,有许多内置函数可以用来进行直角坐标和经纬度的转换。
通过使用`cart2sph`函数,我们可以将直角坐标转换为球面坐标,其中包括经度和纬度。
而`geodetic2ned`函数则可以将经纬度坐标转换为局部的东北天 (NED) 坐标系。
这些函数的使用方法和参数设置都会对转换结果产生影响,因此我们需要了解这些函数的具体使用方法和注意事项。
matlab还提供了一些额外的工具箱,比如Mapping Toolbox和Navigation Toolbox,这些工具箱中包含了更多用于地理空间数据处理的函数和工具,可以帮助我们更好地进行直角坐标和经纬度的换算。
三、实际案例分析与应用在实际的地理空间信息处理工作中,直角坐标和经纬度的换算经常被广泛应用。
比如在航空航天领域,飞行器的导航和定位工作就需要利用直角坐标和经纬度之间的转换。
在地理信息系统(GIS) 和遥感领域,地图的制作和地物的识别也需要进行直角坐标和经纬度的转换。
这些实际案例可以帮助我们更好地理解直角坐标和经纬度的换算在现实生活中的重要性和应用价值。
大地坐标系和空间直角坐标系转换
aa[3][0]=6378137.000; aa[3][1]=6356752.314;
cout<<"请选择椭球体"<<endl;
cout<<"0:克拉索夫斯基椭球体"<<endl; //选择椭球体
cout<<"1: 1975年国际椭球体"<<endl;
return false;}
cout<<"谢谢您使用龚晓鹏编的程序,所有任务均已完成,欢迎下次使用,祝生活愉快"<<endl;
}
////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////空间直角坐标系换算到大地坐标系
Z=(N*(1-E1)+a.H)*sin(a.B);
cout<<"转换后的空间直角坐标是:"<<endl; //屏幕输出结果
cout<<"X "<<X<<endl;
cout<<"Y "<<Y<<endl;
cout<<"Z "<<Z<<endl;
cout<<"要保存数据吗?"<<endl;
cout<<"1:保存"<<endl;
基于Matlab的测量坐标系统转换
基于Matlab的测量坐标系统转换摘要:由于多种坐标系统的存在,在保存测量成果的过程中占用内存较大,资料管理混乱。
为保证测量成果统一和使用方便,必须进行相应的坐标转换。
坐标转换是一个复杂的数值计算过程,如果采用人工计算,不仅费时费力而且不能保证计算的精度。
Matlab软件为矩阵计算提供了平台,方便各种坐标转换模型的实现。
关键词:Matlab;测量坐标系统转换;测量系统中,通常会接触到多种坐标系统的相互转换。
以两台仪器精确互瞄法相对定向为例,测量系统中默认的测量坐标系为测站1 坐标系,即测站1为坐标系原点,测站1 与测站2 的连线在水平面内的投影为轴,轴在水平面内垂直于轴,再以右手准则确定轴。
测量系统所获取的物点坐标为空间三维直角坐标,实际应用中,需将测量坐标系中的坐标转换到其他坐标系中。
1测量坐标系简介(1)1954年北京坐标系。
1954 年北京坐标系(BJZ54)通常被称为北京54 坐标系,是通过局部平差之后所产生的坐标系。
该坐标系以克拉索夫斯基椭球为基础,大地上的任意一点均可由经度L54、纬度M54和大地高H54 进行定位描述,1954 年北京坐标系可以说是由前苏联1942 年坐标系发展延伸来的,所以它的原点不位于我国北京而位于前苏联的普尔科沃。
北京54 坐标系是我国使用较为广泛的一种参心大地坐标系。
(2)西安80坐标系。
大地原点设在位于我国中部的陕西省泾阳县永乐镇,距西安市西北方向大约60 公里。
所以被称为1980 年西安坐标系,也简称为西安大地原点。
基准面采用1985 国家高程基准,属于参心坐标系。
(3)WGS-84坐标系。
WGS-84 坐标系属于地心坐标系,是一种被国际所使用的坐标系,该坐标系原点是地球质心,其地心空间直角坐标系的Z 轴指向方向为协议地球极( 即CTP) 方向,X 轴指向与CGCS2000 X 轴指向相同,Y 轴垂直于Z 轴与X 轴所构成的平面,符合右手坐标系规律,通常被称为1984 年世界大地坐标系统。
空间直角坐标XYZ换算为经纬度BL的matlab编程
空间直角坐标XYZ换算为经纬度BL程序(matlab编程)度分秒转弧度函数代码:function hd=dzh(a)hh=sign(a);a=abs(a);hd=hh*(fix(a)+fix((a-fix(a))*100)/60+((a-fix(a))*100-...fix((a-fix(a))*100))*100/3600)*pi/180;%度分秒转化为弧度end弧度转度分秒函数代码:function jd=hzd(x)jd=fix(x*206264.8062470964/3600)+fix((x*206264.8062470964/3600-...fix(x*206264.8062470964/3600))*60)/100+((x*206264.8062470964/3600-...fix(x*206264.8062470964/3600))*60-fix((x*206264.8062470964/3600-...fix(x*206264.8062470964/3600))*60))*60/10000;%弧度转化为度分秒end主程序代码:fprintf('-----克拉索夫斯基椭球体请输入1;1975年国际椭球体请输入2;WGS 84椭球请输入3-----')kk=input('请输入:');if kk==1a=6378245;%长半轴克拉索夫斯基椭球体b=6356863.019;%短半轴elseif kk==2a=6378140; %长半轴 1975年国际椭球体b=6356755.288; %短半轴elsea=6378137;%长半轴 1975年国际椭球体b=6356752.314; %短半轴ende1=sqrt(a^2-b^2)/a; %第一偏心率c=a^2/b;X=input('请输入X:');Y=input('请输入Y:');Z=input('请输入Z:');L=atan(Y/X);%求大地经度LB1=atan(Z/sqrt(X^2+Y^2));%求纬度初值for i=1:+inf %设定循环,进行迭代yita=e1*cos(B1);V=sqrt(1+yita^2);N1=c/V ;%%卯酉圈曲率半径B2=atan((Z+N1*e1^2*sin(B1))/sqrt(X^2+Y^2));%迭代后的Bif abs(B2-B1)<0.00000001%如果两次相邻的B相差小于0.002秒则终止循环 breakendB1=B2;%用新的B替换旧BendB=hzd(B2)%将结果转化为度分秒L=hzd(L)。
大地坐标与空间直角坐标的转换程序代码
#include "stdio.h"#include "math.h"#include "stdlib.h"#include "iostream"#define PI 3.1415926535897323double a,b,c,e2,ep2;int main(){int m,n,t;double RAD(double d,double f,double m);void RBD(double hd);void BLH_XYZ();void XYZ_BLH();void B_ZS();void B_FS();void GUS_ZS();void GUS_FS();printf(" 大地测量学\n");sp1:printf("请选择功能:\n");printf("1.大地坐标系到大地空间直角坐标的转换\n");printf("2.大地空间直角坐标到大地坐标系的转换\n");printf("3.贝塞尔大地问题正算\n");printf("4.贝塞尔大地问题反算\n");printf("5.高斯投影正算\n");printf("6.高斯投影反算\n");printf("0.退出程序\n");scanf("%d",&m);if(m==0)exit(0);sp2:printf("请选择椭球参数(输入椭球序号):\n");printf("1.克拉索夫斯基椭球参数\n");printf("2.IUGG_1975椭球参数\n");printf("3.CGCS_2000椭球参数\n");printf("0.其他椭球参数(自行输入)\n");scanf("%d",&n);switch(n){case1:a=6378245.0;b=6356863.0188;c=6399698.9018;e2=0.00669342162297;ep2=0.0067385254146 8;break;case2:a=6378140.0;b=6356755.2882;c=6399596.6520;e2=0.00669438499959;ep2=0.0067395018194 7;break;case3:a=6378137.0;b=6356752.3141;c=6399593.6259;e2=0.00669438002290;ep2=0.0067394967754 7;break;case 0:{printf("请输入椭球参数:\n");printf("长半径a=");scanf("%lf",&a);printf("短半径b=");scanf("%lf",&b);c=a*a/b;ep2=(a*a-b*b)/(b*b);e2=(a*a-b*b)/(a*a);break;}default:printf("\n\n输入错误!\n请重新输入!\n\n");goto sp2 ;}while(1){switch(m){case 1:BLH_XYZ();break;case 2:XYZ_BLH();break;case 3:B_ZS();break;case 4:B_FS();break;case 5:GUS_ZS();break;case 6:GUS_FS();break;default:printf("\n\n输入错误!\n请重新输入!\n\n");goto sp1 ;}printf("是否继续进行此功能计算? \n\n");printf("(若继续进行此功能计算,则输入1;\n 若选择其他功能进行计算,则输入2;\n 若退出,则输入0. )\n");scanf("%d",&t);switch(t){case 1:break;case 2:goto sp1;case 0:exit(0);}}}double RAD(double d,double f,double m){double e;double sign=(d<0.0)?-1.0:1.0;if(d==0){sign=(f<0.0)?-1.0:1.0;if(f==0){sign=(m<0.0)?-1.0:1.0;}}if(d<0)d=d*(-1.0);if(f<0)f=f*(-1.0);if(m<0)m=m*(-1.0);e=sign*(d*3600+f*60+m)*PI/(3600*180);return e;}void RBD(double hd){int t;int d,f;double m;double sign=(hd<0.0)?-1.0:1.0;if(hd<0)hd=fabs(hd);hd=hd*3600*180/PI;t=int(hd/3600);d=sign*t;hd=hd-t*3600;f=int(hd/60);m=hd-f*60;printf("%d'%d'%lf'\n",d,f,m);}void BLH_XYZ(){double B,L,H,N,W;double d,f,m;double X,Y,Z;printf(" 请输入大地坐标(输入格式为角度(例如:30'40'50')):\n");printf(" 大地经度L=");scanf("%lf'%lf'%lf'",&d,&f,&m);L=RAD(d,f,m);printf(" 大地纬度B=");scanf("%lf'%lf'%lf'",&d,&f,&m);B=RAD(d,f,m);printf(" 大地高H=");scanf("%lf",&H);W=sqrt(1-e2*sin(B)*sin(B));N=a/W;X=(N+H)*cos(B)*cos(L);Y=(N+H)*cos(B)*sin(L);Z=(N*(1-e2)+H)*sin(B);printf("\n\n 转换后得到大地空间直角坐标为:\n\n");printf("X=%lf\nY=%lf\nZ=%lf\n\n",X,Y,Z);}void XYZ_BLH(){double B,L,H,N,W;double X,Y,Z;double tgB0,tgB1;printf(" 请输入大地空间直角坐标:\n");printf(" X=");scanf("%lf",&X);printf(" Y=");scanf("%lf",&Y);printf(" Z=");scanf("%lf",&Z);printf("\n\n 转换后得到大地坐标为:\n\n");L=atan(Y/X);printf(" 大地经度为:L=");RBD(L);printf("\n");tgB0=Z/sqrt(X*X+Y*Y);tgB1=(1/sqrt(X*X+Y*Y))*(Z+a*e2*tgB0/sqrt(1+tgB0*tgB0-e2*tgB0*tgB0));while(fabs(tgB0-tgB1)>5*pow(10,-10)){tgB0=tgB1;tgB1=(1/sqrt(X*X+Y*Y))*(Z+a*e2*tgB0/sqrt(1+tgB0*tgB0-e2*tgB0*tgB0));}B=atan(tgB1);printf(" 大地纬度为:B=");RBD(B);printf("\n");W=sqrt(1-e2*sin(B)*sin(B));N=a/W;H=sqrt(X*X+Y*Y)/cos(B)-N;printf(" 大地高为:H=%lf\n\n",H);}void B_ZS(){double L1,B1,A1,s,d,f,mi;double u1,u2,m,M,k2,alfa,bt,r,kp2,alfap,btp,rp;double sgm0,sgm1,lmd,lmd1,lmd2,A2,B2,l,L2;printf("请输入已知点的大地坐标(输入格式为角度(例如:30'40'50'),下同):\nL1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);L1=RAD(d,f,mi);printf("\nB1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);B1=RAD(d,f,mi);printf("请输入大地方位角:\nA1=");scanf("%lf'%lf'%lf'",&d,&f,&mi);A1=RAD(d,f,mi);printf("请输入该点至另一点的大地线长:\ns=");scanf("%lf",&s);u1=atan(sqrt(1-e2)*tan(B1));m=asin(cos(u1)*sin(A1));M=atan(tan(u1)/cos(A1));m=(m>0)?m:m+2*PI;M=(M>0)?M:M+PI;k2=ep2*cos(m)*cos(m);alfa=(1-k2/4+7*k2*k2/64-15*k2*k2*k2/256)/b;bt=k2/4-k2*k2/8+37*k2*k2*k2/512;r=k2*k2/128-k2*k2*k2/128;sgm0=alfa*s;sgm1=alfa*s+bt*sin(sgm0)*cos(2*M+sgm0)+r*sin(2*sgm0)*cos(4*M+2*sgm0);while(fabs(sgm0-sgm1)>2.8*PI/180*pow(10,-7)){sgm0=sgm1;sgm1=alfa*s+bt*sin(sgm0)*cos(2*M+sgm0)+r*sin(2*sgm0)*cos(4*M+2*sgm0);}sgm0=sgm1;A2=atan(tan(m)/cos(M+sgm0));A2=(A2>0)?A2:A2+PI;A2=(A1>PI)?A2:A2+PI;u2=atan(-cos(A2)*tan(M+sgm0));lmd1=atan(sin(u1)*tan(A1));lmd1=(lmd1>0)?lmd1:lmd1+PI;lmd1=(m<PI)?lmd1:lmd1+PI;lmd2=atan(sin(u2)*tan(A2));lmd2=(lmd2>0)?lmd2:lmd2+PI;lmd2=(m<PI)?(((M+sgm0)<PI)?lmd2:lmd2+PI):(((M+sgm0)>PI)?lmd2:lmd2+PI);lmd=lmd2-lmd1;B2=atan(sqrt(1+ep2)*tan(u2));kp2=e2*cos(m)*cos(m);alfap=(e2/2+e2*e2/8+e2*e2*e2/16)-e2/16*(1+e2)*kp2+3*e2*kp2*kp2/128;btp=e2*(1+e2)*kp2/16-e2*kp2*kp2/32;rp=e2*kp2*kp2/256;l=lmd-sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos(2*M+sgm0)+rp*sin(2*sgm0)*cos(4*M+2*sgm0));L2=L1+l;printf("\n\n得到另一点的大地坐标和大地线在该点的大地方位角为:\n\n");printf("L2=");RBD(L2);printf("\n");printf("B2=");RBD(B2);printf("\n");printf("A2=");RBD(A2);printf("\n");}void B_FS(){double L1,B1,L2,B2,s,A1,A2,du,f,mi,m0,m,M;double l,u1,u2,alfa,bt,r,lmd0,dit_lmd,lmd,sgm,dit_sgm,sgm0,sgm1,alfap,btp,rp,k2,kp2;printf("请输入第一个点大地坐标(输入格式为角度(例如:30'40'50'),下同):\n大地经度L1=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L1=RAD(du,f,mi);printf("大地纬度B1=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B1=RAD(du,f,mi);printf("\n请输入第二个点大地坐标:\n大地经度:L2=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L2=RAD(du,f,mi);printf("大地纬度:B2=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B2=RAD(du,f,mi);l=L2-L1;u1=atan(sqrt(1-e2)*tan(B1));u2=atan(sqrt(1-e2)*tan(B2));sgm0=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l));m0=asin(cos(u1)*cos(u2)*sin(l)/sin(sgm0));dit_lmd=0.003351831*sgm0*sin(m0);lmd0=l+dit_lmd;dit_sgm=sin(m0)*dit_lmd;sgm1=sgm0+dit_sgm;m=asin(cos(u1)*cos(u2)*sin(lmd0)/sin(sgm1));A1=atan(sin(lmd0)/(cos(u1)*tan(u2)-sin(u1)*cos(lmd0)));A1=(A1>0)?A1:A1+PI;A1=(m>0)?A1:A1+PI;M=atan(sin(u1)*tan(A1)/sin(m));M=(M>0)?M:M+PI;k2=ep2*cos(m)*cos(m);alfa=(1-k2/4+7*k2*k2/64-15*k2*k2*k2/256)/b;bt=k2/4-k2*k2/8+37*k2*k2*k2/512;r=k2*k2/128-k2*k2*k2/128;kp2=e2*cos(m)*cos(m);alfap=(e2/2+e2*e2/8+e2*e2*e2/16)-e2/16*(1+e2)*kp2+3*e2*kp2*kp2/128;btp=e2*(1+e2)*kp2/16-e2*kp2*kp2/32;rp=e2*kp2*kp2/256;sgm0=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l));sgm1=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l+sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos( 2*M+sgm0))));while(fabs(sgm0-sgm1)>1*PI/180*pow(10,-8)){sgm0=sgm1;sgm1=acos(sin(u1)*sin(u2)+cos(u1)*cos(u2)*cos(l+sin(m)*(alfap*sgm0+btp*sin(sgm0)*cos( 2*M+sgm0))));}sgm=sgm1;lmd=l+sin(m)*(alfap*sgm+btp*sin(sgm)*cos(2*M+sgm));s=(sgm-bt*sin(sgm)*cos(2*M+sgm)-r*sin(2*sgm)*cos(4*M+2*sgm))/alfa;A1=atan(sin(lmd)/(cos(u1)*tan(u2)-sin(u1)*cos(lmd)));A1=(A1>0)?A1:A1+PI;A1=(m>0)?A1:A1+PI;A2=atan(sin(lmd)/(sin(u2)*cos(lmd)-tan(u1)*cos(u2)));A2=(A2>0)?A2:A2+PI;A2=(m<0)?A2:A2+PI;printf("\n\n得到两点间大地线长S和大地正反方位角A1、A2如下:\n\n");printf("s=%lf\n",s);printf("A1=");RBD(A1);printf("\n");printf("A2=");RBD(A2);printf("\n");}void GUS_ZS(){double B,L,x3,x6,y3,y6,Y3,Y6,du,f,mi,X,N,n,t;double At,Bt,Ct,Dt,m3,m6,l3,l6,W,L03,L06;int DH3,DH6;printf("请输入大地坐标(输入格式为角度(例如:30'40'50')):\n大地经度L=");scanf("%lf'%lf'%lf'",&du,&f,&mi);L=RAD(du,f,mi);printf("\n大地纬度B=");scanf("%lf'%lf'%lf'",&du,&f,&mi);B=RAD(du,f,mi);At=1+3*e2/4+45*e2*e2/64+175*e2*e2*e2/256;Bt=3*e2/4+15*e2*e2/16+525*e2*e2*e2/512;Ct=15*e2*e2/64+105*e2*e2*e2/256;Dt=35*e2*e2*e2/512;X=a*(1-e2)*(At*B-Bt*sin(2*B)/2+Ct*sin(4*B)/4-Dt*sin(6*B)/6);W=sqrt(1-e2*sin(B)*sin(B));N=a/W;n=sqrt(ep2)*cos(B);t=tan(B);DH3=(L-(1.5*PI/180))/(3*PI/180)+1;DH6=L/(6*PI/180)+1;L03=DH3*(3*PI/180);L06=DH6*(6*PI/180)-(3*PI/180);l3=L-L03;l6=L-L06;m3=cos(B)*l3;m6=cos(B)*l6;x3=X+N*t*(m3*m3/2+(5-t*t+9*n*n+4*n*n*n*n)*m3*m3*m3*m3/24+(61-58*t*t+t*t*t*t)*m3*m3*m3*m3*m3*m3/720);x6=X+N*t*(m6*m6/2+(5-t*t+9*n*n+4*n*n*n*n)*m6*m6*m6*m6/24+(61-58*t*t+t*t*t*t)*m6*m6*m6*m6*m6*m6/720);y3=N*(m3+(1-t*t+n*n)*m3*m3*m3/6+(5-18*t*t+t*t*t*t+14*n*n-58*n*n*t*t)*m3*m3*m3*m3*m3/120);y6=N*(m6+(1-t*t+n*n)*m6*m6*m6/6+(5-18*t*t+t*t*t*t+14*n*n-58*n*n*t*t)*m6*m6*m6*m6*m6/120);Y3=DH3*1000000+500000+y3;Y6=DH6*1000000+500000+y6;printf("\n\n 得到的高斯平面坐标为:\n\n");printf(" 对于3度带:\n 纵坐标x=%.3lf\n 横坐标y=%.3lf(通用坐标Y=%.3lf)\n\n",x3,y3,Y3);printf(" 对于6度带:\n 纵坐标x=%.3lf\n 横坐标y=%.3lf(通用坐标Y=%.3lf)\n\n",x6,y6,Y6);}void GUS_FS(){double x,y,Y,B,B0,B1,Bf,Vf,tf,Nf,nf,L,At,Bt,Ct,Dt,L3,L6;long DH;printf(" 请输入高斯平面坐标:\n\n");printf(" 纵坐标X=");scanf("%lf",&x);printf("\n");printf(" 自然坐标y=");scanf("%lf",&y);printf("\n");printf(" 通用坐标Y=");scanf("%lf",&Y);printf("\n");At=1+3*e2/4+45*e2*e2/64+175*e2*e2*e2/256;Bt=3*e2/4+15*e2*e2/16+525*e2*e2*e2/512;Ct=15*e2*e2/64+105*e2*e2*e2/256;Dt=35*e2*e2*e2/512;B0=x/(a*(1-e2)*At);B1=(x-a*(1-e2)*(-Bt*sin(2*B0)/2+Ct*sin(4*B0)/4-Dt*sin(6*B0)/6))/(a*(1-e2)*At);while(fabs(B1-B0)>1*pow(10,-8)){B0=B1;B1=(x-a*(1-e2)*(-Bt*sin(2*B0)/2+Ct*sin(4*B0)/4-Dt*sin(6*B0)/6))/(a*(1-e2)*At);}Bf=B1;nf=sqrt(ep2)*cos(Bf);tf=tan(Bf);Vf=sqrt(1+ep2*cos(Bf)*cos(Bf));Nf=c/Vf;B=Bf-Vf*Vf*tf/2*((y/Nf)*(y/Nf)-(5+3*tf*tf+nf*nf-9*nf*nf*tf*tf)*pow((y/Nf),4)/12+(61+90*tf*tf+45*tf*tf)*pow((y/Nf),6)/360);L=((y/Nf)-(1+2*tf*tf+nf*nf)*(y/Nf)*(y/Nf)*(y/Nf)/6+(5+28*tf*tf+24*pow(tf,4)+6*nf*nf+8*nf*nf*tf*tf)*po w((y/Nf),5)/120)/cos(Bf);DH=Y/1000000;L3=3*PI/180*double(DH)+L;L6=6*PI/180*double(DH)-3*PI/180+L;printf("\n\n 得到的大地坐标为:\n\n");printf(" 大地纬度B=");RBD(B);printf("\n");printf(" 若为6度带,大地经度L=");RBD(L6);printf("\n");printf(" 若为3度带,大地经度L=");RBD(L3);printf("\n");}。
基于Matlab的测量坐标系统转换
基于Matlab的测量坐标系统转换李巍;徐爱功;赵亮;王昶;高良博【摘要】基于目前1954北京坐标系和1980西安坐标系成果转换到2000国家大地坐标系的重要性,为实现在测量实践和理论中各类不同坐标之间的转换计算,并能够将转换过程程序化,论述了测量坐标系统之间的转换原理及其转换模型,探讨了不同参考椭球和相同参考椭球的坐标系转换模型及方法,同时在Matlab软件平台上,研究并利用Matlab程序语言对不同坐标系统的转换模型进行程序的编写,实现了不同参考椭球和相同参考椭球的坐标系转换模型的程序化.结果表明:利用Matlab 程序语言能够很好的实现坐标系的转换,并且运算速度快,成果更实用.【期刊名称】《煤炭学报》【年(卷),期】2014(039)0z1【总页数】5页(P88-92)【关键词】坐标转换;Matlab语言;空间坐标;大地坐标;七参数【作者】李巍;徐爱功;赵亮;王昶;高良博【作者单位】辽宁科技大学土木工程学院,辽宁鞍山114051;辽宁工程技术大学测绘与地理科学学院,辽宁阜新123000;辽宁工程技术大学测绘与地理科学学院,辽宁阜新123000;辽宁科技大学土木工程学院,辽宁鞍山114051;辽宁科技大学土木工程学院,辽宁鞍山114051【正文语种】中文【中图分类】TD17随着测绘科学技术的发展,对测量基准的精度要求越来越高,坐标系以及坐标基准也相应的发生变化。
我国曾先后使用过1954北京坐标系,新54北京坐标系和1980西安坐标系,由于空间技术的发展,我国建立了原点位于地球质量中心的2000国家大地坐标系[1-3]作为国家大地坐标系。
然而,目前我国大量的测绘成果大都采用1954北京坐标系或者1980西安坐标系,这就急需将上述成果转换到2000国家大地坐标系,坐标系统的转换不可避免。
为了确保坐标转换的精度,需要研究各种坐标转换模型的理论方法。
对不同参考椭球基准、不同的坐标系、地图投影的坐标系统之间坐标的转换,需要涉及多方面的理论和技术[4-5],本文主要针对不同参考椭球基准的坐标系转换和同一参考椭球基准常用坐标形式之间的换算过程和方法进行研究。
大地坐标与空间直角坐标地转换程序代码
d=sign*t;
hd=hd-t*3600;
f=int(hd/60);
m=hd-f*60;
printf("%d'%d'%lf'\n",d,f,m);
}
void BLH_XYZ()
{
double B,L,H,N,W;
double d,f,m;
double X,Y,Z;
printf("请输入坐标(输入格式为角度(例如:30'40'50')):\n");
printf("2.空间直角坐标到坐标系的转换\n");
printf("3.贝塞尔问题正算\n");
printf("4.贝塞尔问题反算\n");
printf("5.高斯投影正算\n");
printf("6.高斯投影反算\n");
printf("0.退出程序\n");
scanf("%d",&m);
if(m==0)exit(0);
printf("\n\n转换后得到坐标为:\n\n");
c=a*a/b;
ep2=(a*a-b*b)/(b*b);
e2=(a*a-b*b)/(a*a);
break;
}
default:printf("\n\n输入错误!\n请重新输入!\n\n");goto sp2 ;
}
while(1)
{
switch;break;
case 2:XYZ_BLH();break;
#include "stdio.h"
经纬坐标投影为平面直角坐标的matlab代码-概述说明以及解释
经纬坐标投影为平面直角坐标的matlab代码-概述说明以及解释1.引言1.1 概述概述经纬坐标投影为平面直角坐标是一种常用的地图坐标转换方法,它通过将地球上的经纬度坐标投影到平面直角坐标系上,实现地理信息的可视化和分析。
在地理信息系统(GIS)和地图制图中,经纬度坐标是最常见的地理坐标表示方式,但在某些应用场景中,需要将经纬度坐标转换为平面直角坐标,以满足特定的需求和分析要求。
通过经纬坐标投影为平面直角坐标,我们可以更加直观地展现地理信息,并进行各种地理空间分析。
这种转换方法广泛应用于海图制图、城市规划、导航系统、地震研究等领域。
由于地球是一个近乎球体的椭球体,经纬度坐标的转换涉及到复杂的数学计算和映射方法,因此需要借助计算机软件进行具体的实现。
本文的目的是介绍如何使用MATLAB编写经纬坐标投影为平面直角坐标的代码。
我们将讨论不同的投影方法和相应的数学模型,以及如何在MATLAB环境下实现这些模型。
通过本文的学习,读者将能够理解经纬坐标投影的原理和实现方法,并且具备编写该转换代码的能力。
文章结构本文包含三个主要部分:引言、正文和结论。
在引言部分,我们将对经纬坐标投影为平面直角坐标进行概述,介绍其背景和应用价值,以及本文的目的和结构。
在正文部分,我们将详细讨论经纬坐标投影的概念和平面直角坐标的概念。
我们将介绍不同的投影方法,包括等积投影、等角投影和等距投影,并深入探讨它们的数学原理和转换公式。
同时,我们将介绍平面直角坐标的定义和转换方式,为后续的MATLAB代码实现做好准备。
在结论部分,我们将强调经纬坐标投影为平面直角坐标的重要性,并总结本文的主要内容。
我们还将展示如何使用MATLAB编写相应的代码,以实现经纬坐标投影为平面直角坐标的转换功能。
通过结论部分,读者将能够全面了解经纬坐标投影的实际应用和实现方法,并且具备在MATLAB 环境下进行相关编程的能力。
通过本文的阅读,读者将能够掌握经纬坐标投影为平面直角坐标的基本原理和实现方法,以及在MATLAB环境下编写相应代码的技巧和步骤。
基于matlab的空间大地坐标系与空间直角坐标系互换
基于matlab 的空间大地坐标系与空间直角坐标系互换
为了达到空间大地坐标系与空间直角坐标系互换的问题matlab 界面设计如下:
分两步分设两个pushbutton 进行:
1.BHL →XYZ
由
将BHL 的值由edittext 传入到表达式中,经计算再由edittext 传出。
2.XYZ →BHL a b a f /)(-=222f f e -=2222)(a b a e /-=22)
1(1f e -=-2()cos cos ()cos sin ((1))sin X N H B L Y N H B L Z e N H B +⎛⎫⎛⎫ ⎪ ⎪==+ ⎪ ⎪ ⎪ ⎪-+⎝⎭⎝⎭X B f f a B e a N 222sin )2(1sin 1--=-=
∵
又由于
由此B 由迭代而来。
具体方法为::
由此进行迭代,得到正确的B 即可。
补充说明:
1.为了使其在各个空间直角坐标系间转换,设立了
22
1222
cos arctan 1arctan X Y H N B Z N B e N H X Y Y L X -+=-⎛⎫=- ⎪+⎝⎭+=B
f f a B e a N 222sin )2(1sin 1--=-=
单选按钮,可实现多种坐标系的转换。
2.在转换过程中需要注意度分秒的转换,及matlab中度分秒的表达形式。
具体实现过程:
度=度+分/60+秒/3600
(即最后实现的BHL的输入给函数的值,以便输出XYZ)
程序运行:
1.BHL→XYZ
2.XYZ→BHL。
基于matlab的空间大地坐标系与空间直角坐标系互换
基于matlab 的空间大地坐标系与空间直角坐标系互换将BHL 的值由edittext 传入到表达式中,经计算再由 edittext 传出 2.XYZ f BHLf 二(a- b)/ a2 2 2 2d^(a 2-6)/孑e — 2f - f 21- e=(1- f)2a Ve ^sirnBa.1-f(2-f)sinBY(N + H)cosBsinL乙,((1—e 2)N + H)sinB 丿为了达到空间大地坐标系与空间直角坐标系互换的问题matlab 界面设计如下:分两步分设两个pushbutton 进行: 1.BHL f XYZ X (N H)cosBcosL/X2Ycos B工arctanL = arcta na aJ I—V S H B Jl—f(2- f)si6B由此B由迭代而来。
具体方法为::c = a * Sqr( 1 + <?22)p = ( c * e2)/Scp*( x*2 + y*2 )—1 + G22l t= tanSz二—Z________0_2Pu ------- fy%2 + y3k — 1 + e'2o由此进行迭代,得到正确的B即可补充说明:1.为了使其在各个空间直角坐标系间转换,设立了又由于2N + H丿一Button GroupCGCS2000寸WGS84e自定义a单选按钮,可实现多种坐标系的转换。
2.在转换过程中需要注意度分秒的转换,及matlab中度分秒的表达形式。
具体实现过程:度二度+分/60+秒/3600(即最后实现的BHL的输入给函数的值,以便输出XYZ程序运行:1.BHL — XYZ2.XYZ f BHL。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
测量程序设计
实验报告
实验名称:大地坐标与空间直角坐标的
换算
实验四 大地坐标与空间直角坐标的换算
一、实验目的
编写大地坐标与空间直角坐标相互转换的程序,并对格式化文件数据进
行计算,验证程序。
二、实验内容:
1、大地坐标向空间直角坐标换算
转换公式:
B
h e N z L B h N y L
B h N x sin ])1([sin cos )(cos cos )(2+-=+=+= (1)
其中:L 为经度,B 为纬度,h 为大地高,B e a
N 22sin 1-=为卯酉圈曲率半径,
a
b a e 2
2-=为第一偏心率,a 为旋转椭球长半轴,b 为短半轴。
WGS84椭球参数:长半轴 a = 6378137
扁率 f = 1/298.257223563
根据上式创建以geo 2xyz 命名的函数,函数输入输出格式为
[x, y, z] = geo 2xyz (L, B, h)
2、空间直角坐标向大地坐标换算
根据式(1)推导大地坐标向空间直角坐标转换公式: N B
y x h y
x B Ne z B x y L -+=++==cos )sin arctan()
/arctan(2
2222 注意计算纬度时需要用到迭代,可用)arctan(22y
x b az B +=作为初始值。
创建以xyz2geo 命名的函数,函数输入输出格式为
[L, B, h] = xyz 2geo (x, y, z)
三、实验步骤
1、大地坐标向空间直角坐标换算
主程序:
%%大地坐标向空间直角坐标换算
%函数的输入输出格式为[x,y,z]=geo2xyz(L,B,h)
[filename,pathname] = uigetfile('*.txt','请选择打开的数据文件');
file = [pathname, filename];
data = importdata(file);
L=data.data(:,1);
B=data.data(:,2);
h=data.data(:,3);
[x,y,z]=geo2xyz(L,B,h);
A=[x,y,z];
A=A';
[filename_out,pathname_out] = uiputfile('*.txt','请选择要输出数据文件');
fileout = [pathname_out, filename_out];
fid = fopen(fileout,'wt');
fprintf(fid,' x y z\n'); fprintf(fid,'%15.7f %15.7f %15.7f\n',A);
close('all');
函数:
function [x,y,z]=geo2xyz(L,B,h)
%大地坐标经纬度转换成空间直角坐标
B=dms2rad(B);
L=dms2rad(L);
a=6378137;
%a是长半轴
f=1/298.257223563;
%f是扁率
b=a-a*f;
e=sqrt(a^2-b^2)/a;
N=a./(sqrt(1-e^2.*(sin(B)).^2));
%N为卯酉圈半径率,e为第一偏心率
x=(N+h).*cos(B).*cos(L);
y=(N+h).*cos(B).*sin(L);
z=(N*(1-e^2)+h).*sin(B);
end
function rad=dms2rad(jiaodu)
%度分秒->弧度(rad)
degree = fix(jiaodu);
mimute = fix((jiaodu-degree)*100);
second = (jiaodu-degree-mimute/100)*10000;
degree = degree+mimute/60+second/3600;
rad=degree/180*pi;
end
2、空间直角坐标向大地坐标换算
主程序:
%% 将文件data.2.txt中的空间直角坐标系转换为大地坐标,并将计算结果按照格式存储在文件data3.txt中
%data3.txt格式为:经度(ddmmss)纬度(ddmmss)大地高[filename,pathname]=uigetfile('*.txt','请选择打开的数据文件');
file=[pathname,filename];
data=importdata(file);
x=data.data(:,1);
y=data.data(:,2);
z=data.data(:,3);
[L,B,H]=xyz2geo(x,y,z);
[filename_out,pathname_out] = uiputfile('*.txt','请选择要输出数据文件');
fileout = [pathname_out, filename_out];
fid = fopen(fileout,'wt');
fprintf(fid,' 经度(ddmmss)纬度(ddmmss)大地高\n'); fprintf(fid,'%10.7f %10.7f %7.3f\n',[L,B,H]'); fclose('all');
函数:
function [L,B,H]=xyz2geo(x,y,z)
%将直角坐标转换为大地坐标
%% 已知:WGS-84椭球参数
f=1/298.257223563;%扁率f=(a-b)/a
a=6378137; %长半轴
b=a*(1-f); %短半轴
e=(sqrt(a^2-b^2))/a; %第一偏心率
%% 经度L的计算
L=atan2(y,x);
L=rad2dms(L);
%% 纬度B的计算
B0=atan2((a*z),(b.*sqrt(x.^2+y.^2))); % B初始值
while 1
N=a./(sqrt(1-(e^2).*(sin(B0).^2))); %卯酉圈曲率半径N
B=atan2(z+N.*(e^2).*sin(B0),(sqrt(x.^2+y.^2)));
if abs(B0-B)<10^-6
break;
end
abs(B0-B)
B0=B;
end
%% 大地高H的计算
H=(sqrt(x.^2+y.^2))./cos(B)-N;
B=degree2dms(B.*180/pi);%纬度B
End
function dms= degree2dms(jiaodu)
%度->度分秒(dd.mmss)
degree = fix(jiaodu);
mimute = fix((jiaodu-degree)*60); second = ((jiaodu-degree)*60-mimute)*60; dms = degree+mimute/100+second/10000;。