大地主题解算(深度干货-超精).doc_第1页
大地主题解算(深度干货-超精).doc_第2页
大地主题解算(深度干货-超精).doc_第3页
大地主题解算(深度干货-超精).doc_第4页
大地主题解算(深度干货-超精).doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大地主题解算(正算)代码与白塞尔大地主题解算大地主题解算(正算)代码:根据经纬度和方向角以及距离计算另外一点坐标新建模块-拷贝下面的大地主题(正算)代码,调用方法示例:起点经度:116.235(度)终点纬度:37.435(度)方向角:50(度)长度:500(米)终点经纬度(经度,纬度)=Computation(37.435,116.235,50,500) Const Pi = 3.1415926535898Private a, b, c, alpha, e, e2, W, V As Doublea 长轴半径b 短轴c 极曲率半径alpha 扁率e 第一偏心率e2 第二偏心率W 第一基本纬度函数V 第二基本纬度函数Private B1, L1, B2, L2 As DoubleB1 点1的纬度L1 点1的经度B2 点1的纬度L2 点2的经度Private S As Double 大地线长度Private A1, A2 As DoubleA1 点1到点2的方位角A2 点2到点1的方位角Function Computation(STARTLAT, STARTLONG, ANGLE1, DISTANCE As Double) As String B1 = STARTLAT L1 = STARTLONG A1 = ANGLE1 S = DISTANCE a = 6378245 b = 6356752.3142 c = a 2 / b alpha = (a - b) / a e = Sqr(a 2 - b 2) / a e2 = Sqr(a 2 - b 2) / b B1 = rad(B1) L1 = rad(L1) A1 = rad(A1) W = Sqr(1 - e 2 * (Sin(B1) 2) V = W * (a / b) Dim W1 As Double E1 = e 第一偏心率 / 计算起点的归化纬度 W1 = W Sqr(1 - e1 * e1 * Sin(B1 ) * Sin(B1 ) sinu1 = Sin(B1) * Sqr(1 - E1 * E1) / W1 cosu1 = Cos(B1) / W1 / 计算辅助函数值 sinA0 = cosu1 * Sin(A1) cotq1 = cosu1 * Cos(A1) sin2q1 = 2 * cotq1 / (cotq1 2 + 1) cos2q1 = (cotq1 2 - 1) / (cotq1 2 + 1) / 计算系数AA,BB,CC及AAlpha, BBeta的值。 cos2A0 = 1 - sinA0 2 e2 = Sqr(a 2 - b 2) / b k2 = e2 * e2 * cos2A0 Dim aa, BB, CC, EE22, AAlpha, BBeta As Double aa = b * (1 + k2 / 4 - 3 * k2 * k2 / 64 + 5 * k2 * k2 * k2 / 256) BB = b * (k2 / 8 - k2 * k2 / 32 + 15 * k2 * k2 * k2 / 1024) CC = b * (k2 * k2 / 128 - 3 * k2 * k2 * k2 / 512) e2 = E1 * E1 AAlpha = (e2 / 2 + e2 * e2 / 8 + e2 * e2 * e2 / 16) - (e2 * e2 / 16 + e2 * e2 * e2 / 16) * cos2A0 + (3 * e2 * e2 * e2 / 128) * cos2A0 * cos2A0 BBeta = (e2 * e2 / 32 + e2 * e2 * e2 / 32) * cos2A0 - (e2 * e2 * e2 / 64) * cos2A0 * cos2A0 / 计算球面长度 q0 = (S - (BB + CC * cos2q1) * sin2q1) / aa sin2q1q0 = sin2q1 * Cos(2 * q0) + cos2q1 * Sin(2 * q0) cos2q1q0 = cos2q1 * Cos(2 * q0) - sin2q1 * Sin(2 * q0) q = q0 + (BB + 5 * CC * cos2q1q0) * sin2q1q0 / aa / 计算经度差改正数 theta = (AAlpha * q + beta * (sin2q1q0 - sin2q1) * sinA0 / 计算终点大地坐标及大地方位角 sinu2 = sinu1 * Cos(q) + cosu1 * Cos(A1) * Sin(q) B2 = Atn(sinu2 / (Sqr(1 - E1 * E1) * Sqr(1 - sinu2 * sinu2) * 180 / Pi lamuda = Atn(Sin(A1) * Sin(q) / (cosu1 * Cos(q) - sinu1 * Sin(q) * Cos(A1) * 180 / Pi If (Sin(A1) 0) Then If (Sin(A1) * Sin(q) / (cosu1 * Cos(q) - sinu1 * Sin(q) * Cos(A1) 0) Then lamuda = Abs(lamuda) Else lamuda = 180 - Abs(lamuda) End If Else If (Sin(A1) * Sin(q) / (cosu1 * Cos(q) - sinu1 * Sin(q) * Cos(A1) 0) Then lamuda = Abs(lamuda) - 180 Else lamuda = -Abs(lamuda) End If End If L2 = L1 * 180 / Pi + lamuda - theta * 180 / Pi A2 = Atn(cosu1 * Sin(A1) / (cosu1 * Cos(q) * Cos(A1) - sinu1 * Sin(q) * 180 / Pi If (Sin(A1) 0) Then If (cosu1 * Sin(A1) / (cosu1 * Cos(q) * Cos(A1) - sinu1 * Sin(q) 0) Then A2 = 180 + Abs(A2) Else A2 = 360 - Abs(A2) End If Else If (cosu1 * Sin(A1) / (cosu1 * Cos(q) * Cos(A1) - sinu1 * Sin(q) 0) Then A2 = Abs(A2) Else A2 = 180 - Abs(A2) End If End If Computation = L2 & , & B2End FunctionPrivate Function rad(ByVal angle_d As Double) As Double rad = angle_d * Pi / 180End Function白塞尔大地主题解算一、 正算代码:#include#include#define ee 0.006693421622966#define I 3.141592653double F(double,double,double);void main(void) double A1,B1,L1,S,A2,B2,L2;double x1,x2,x3,y1,y2,y3,z1,z2,z3;double W1,sinu1,sinu2,cosu1,sinA0;double cota1,cos2a1,sin2a1,cosA0A0;double A,B,C,d,e,a0,a1,m;double n,a,Q,R;printf(请输入数据B1= );scanf(%lf %lf %lf,&x1,&x2,&x3);B1=F(x1,x2,x3);printf(请输入数据L1= );scanf(%lf %lf %lf,&y1,&y2,&y3);L1=F(y1,y2,y3);printf(请输入A1= );scanf(%lf %lf %lf,&z1,&z2,&z3); A1=F(z1,z2,z3);printf(请输入S= );scanf(%lf,&S); printf(B1=%.9fn,B1);printf(L1=%.9fn,L1);printf(A1=%.9fn,A1);printf(S=%fn,S);/*计算起点的规划纬度*/W1=sqrt(1-ee*sin(B1)*sin(B1); sinu1=sin(B1)*sqrt(1-ee)/W1;cosu1=cos(B1)/W1; printf(W1=%.9fn,W1);printf(sinu1=%.9fn,sinu1);printf(cosu1=%.9fn,cosu1);/*计算辅助函数值*/sinA0=cosu1*sin(A1); cota1=cosu1*cos(A1)/sinu1;sin2a1=2*cota1/(cota1*cota1+1);cos2a1=(cota1*cota1-1)/(cota1*cota1+1); printf(sinA0=%.9fn,sinA0);printf(cota1=%.9fn,cota1);printf(sin2a1=%.9fn,sin2a1);printf(cos2a1=%.9fn,cos2a1);/*计算系数ABC及de*/cosA0A0=1-sinA0*sinA0; A=6356755.288+(10710.341-(13.534*cosA0A0)*cosA0A0;B=(5355.171-9.023*cosA0A0)*cosA0A0;C=(2.256*(cosA0A0)*cosA0A0+0.006;d=691.46768-(0.58143-0.00144*cosA0A0)*cosA0A0;e=(0.2907-cosA0A0*0.0010)*cosA0A0;printf(cosA0A0=%.9fn,cosA0A0);printf(A=%.3fn,A);printf(B=%.6fn,B);printf(C=%.9fn,C);printf(d=%.7fn,d);printf(e=%.9fn,e);/*计算球面长度*/a0=(S-(B+C*cos2a1)*sin2a1)/A; m=sin2a1*cos(2*a0)+cos2a1*sin(2*a0);n=(cos2a1)*(cos(2*a0)-(sin2a1)*(sin(2*a0);a=a0+(B+5*C*n)*m/A;printf(a0=%.9fn,a0);printf(m=%.9fn,m);printf(n=%.9fn,n);printf(a=%.9fn,a);/*计算经度差改正数*/Q=(d*a+(e*(m-sin2a1)/3600/180*I)*sinA0;printf(Q=%.7fn,Q);/*计算终点大地坐标及大地方位角*/sinu2=sinu1*cos(a)+cosu1*cos(A1)*sin(a);B2=180*atan(sinu2/(sqrt(1-ee)*(sqrt(1-sinu2*sinu2)/I;R=180*atan(sin(A1)*sin(a)/(cosu1*cos(a)-sinu1*sin(a)*cos(A1)/I;printf(sinu2=%.9fn,sinu2);printf(B2=%fn,B2);printf(R=%fn,R*180/I);/*确定R的值*/if(sin(A1)0 & tan(R)0)R=abs(R);else if(sin(A1)0 & tan(R)0)R=I-abs(R);else if(sin(A1)0 & tan(R)0)R=-abs(R);elseR=abs(R)-I;/*确定L2A2的值*/L2=(L1*180/I+R-(Q/206265*180/I);A2=atan(cosu1*sin(A1)/(cosu1*cos(a)*cos(A1)-sinu1*sin(a);if(sin(A1)0)A2=(fabs(A2)*180/I;else if(sin(A1)0&tan(A2)0&tan(A2)0)A2=(I+fabs(A2)*180/I;elseA2=(2*I-fabs(A2)*180/I;printf(A2=%3fn B2=%3fn L2=%3fn,A2,B2,L2);double F(double a2,double b2,double c2)double d2;d2=(double)(a2+1.0*b2/60+1.0*c2/3600);d2=(d2/180)*I;return (d2);运行结果:二、 反算代码:#include#include#define ee 0.006693421622966#define I 3.141592653double F(double,double,double);void main(void) double B1,B2,L1,L2,A1,A2,S,Y;double W1,W2,L,Q,R,A,B,C;double x,y,z,p,q;double x1,x2,x3,y1,y2,y3,z1,z2,z3,w1,w2,w3;double a1,a2,b1,b2,m,n;double sinp,cosp,sinu1,sinu2,cosu1,cosu2,sinA0,cosA0;Q=0;q=0;printf(请输入起始数据B1= );scanf(%lf %lf %lf,&x1,&x2,&x3);B1=F(x1,x2,x3);printf(请输入起始数据L1= );scanf(%lf %lf %lf,&y1,&y2,&y3);L1=F(y1,y2,y3);printf(请输入起始数B2= );scanf(%lf %lf %lf,&z1,&z2,&z3);B2=F(z1,z2,z3);printf(请输入起始数据L2= );scanf(%lf %lf %lf,&w1,&w2,&w3);L2=F(w1,w2,w3);printf(B1=%fn,B1);printf(L1=%.9fn,L1);printf(B2=%.9fn,B2);printf(L2=%.9fn,L2);/*辅助计算*/W1=sqrt(1-ee*sin(B1)*sin(B1);W2=sqrt(1-ee*sin(B2)*sin(B2);sinu1=sin(B1)*sqrt(1-ee)/W1;sinu2=sin(B2)*(sqrt(1-ee)/W2;cosu1=cos(B1)/W1;cosu2=cos(B2)/W2;L=L2-L1;a1=sinu1*sinu2;a2=cosu1*cosu2;b1=cosu1*sinu2;b2=sinu1*cosu2;printf(W1=%.9fn,W1);printf(W2=%.9fn,W2);printf(sinu1=%.9fn,sinu1);printf(sinu2=%.9fn,sinu2);printf(cosu1=%.9fn,cosu2);printf(L=%.9fn,L);printf(a1=%.9fn,a1);printf(a2=%.9fn,a2);printf(b1=%.9fn,b1);printf(b2=%.9fn,b2);/*用逐次趋近法同时计算起点大地方位角、球面长度及经差R*/do R=L+Q; x=cosu2*sin(R); y=b1-b2*cos(R); A1=atan(x/y); if(x0&y0) A1=fabs(A1); else if(x0&y0) A1=I-fabs(A1); else i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论