高斯正反算及换带计算matlab源代码_附截图
- 格式:pdf
- 大小:204.21 KB
- 文档页数:7
[转载]⾼斯正反算⼤地坐标向笛卡尔坐标转换⾼斯正反算采⽤不同椭球实现⾼斯克⾥格投影,将经纬度坐标转换为⾼斯平⾯坐标:正算⾼斯平⾯坐标转换为不同椭球下的经纬度坐标:反算1void GaussProjectDirect(double a,double efang,double B,double L,double L0,double& x,double &y,double& R)//⾼斯投影正算克⽒2 {34double b=aefangtob(a,efang);5double e2=seconde(a,b);6double W=sqrt(1-efang*sin(B)*sin(B));printf("W=%f",W);7double N=a/W;printf("N=%f",N);8double M=a*(1-efang)/pow(W,3);printf("M=%f",M);9double t=tee(B);10double eitef=eitefang(a,b,B);11double l=L-L0;12//主曲率半径计算13double m0,m2,m4,m6,m8,n0,n2,n4,n6,n8;14 m0=a*(1-efang); n0=a;15 m2=3.0/2.0*efang*m0; n2=1.0/2.0*efang*n0;16 m4=5.0/4.0*efang*m2; n4=3.0/4.0*efang*n2;17 m6=7.0/6.0*efang*m4; n6=5.0/6.0*efang*n4;18 m8=9.0/8.0*efang*m6; n8=7.0/8.0*efang*n6;19//⼦午线曲率半径20double a0,a2,a4,a6,a8;21 a0=m0+m2/2+3*m4/8+5*m6/16+35*m8/128;22 a2=m2/2+m4/2+15*m6/32+7.0/16.0*m8;23 a4=m4/8.0+3.0/16.0*m6+7.0/32.0*m8;24 a6=m6/32+m8/16;25 a8=m8/128;2627double X=a0*B-a2/2*sin(2*B)+a4/4*sin(4*B)-a6/6*sin(6*B)+a8/8*sin(8*B);28 x=X+N/2*t*cos(B)*cos(B)*l*l+N/24*t*(5-t*t+9*eitef+4*pow(eitef,2))*pow(cos(B),4)*pow(l,4)+N/720*t*(61-58*t*t+pow(t,4))*pow(cos(B),6)*pow(l,6);29 y=N*cos(B)*l+N/6*(1-t*t+eitef)*pow(cos(B),3)*pow(l,3)+N/120*(5-18*t*t+pow(t,4)+14*eitef-58*eitef*t*t)*pow(cos(B),5)*pow(l,5);30 R=sqrt(M*N);31 }323334//⾼斯投影反算353637void GaussProjectInvert(double a,double efang,double x,double y,double L0,double &B,double& L,double& R)38 {39double b=aefangtob(a,efang);404142double m0,m2,m4,m6,m8,n0,n2,n4,n6,n8;43 m0=a*(1-efang); n0=a;44 m2=3.0/2.0*efang*m0; n2=1.0/2.0*efang*n0;45 m4=5.0/4.0*efang*m2; n4=3.0/4.0*efang*n2;46 m6=7.0/6.0*efang*m4; n6=5.0/6.0*efang*n4;47 m8=9.0/8.0*efang*m6; n8=7.0/8.0*efang*n6;484950//⼦午线曲率半径51double a0,a2,a4,a6,a8;52 a0=m0+m2/2+3*m4/8+5*m6/16+35*m8/128;53 a2=m2/2+m4/2+15*m6/32+7.0/16.0*m8;54 a4=m4/8.0+3.0/16.0*m6+7.0/32.0*m8;55 a6=m6/32+m8/16;56 a8=m8/128;575859double X=x;60double FBf=0;61double Bf0=X/a0,Bf1=0;62while((Bf0-Bf1)>=0.0001)63 { Bf1=Bf0;64 FBf=a0*Bf0-a2/2*sin(2*Bf0)+a4/4*sin(4*Bf0)-a6/6*sin(6*Bf0)+a8/8*sin(8*Bf0);65 Bf0=(X-FBf)/a0;66 }67double Bf=Bf0;68double Vf=bigv(a,b,Bf);69double tf=tee(Bf);70double Nf=bign(a,b,Bf);71double eiteffang=eitefang(a,b,Bf);72double Bdu=rad_deg(Bf)-1/2.0*Vf*Vf*tf*(pow((y/Nf),2)-1.0/12*(5+3*tf*tf+eiteffang-9*eiteffang*tf*tf)*pow((y/Nf),4)+1.0/360.0*(61+90*tf*tf+45*tf*tf)*pow((y/Nf),6))*180/PI; 73double ldu=1.0/cos(Bf)*(y/Nf+1.0/6.0*(1+2*tf*tf+eiteffang)*pow((y/Nf),3)+1.0/120.0*(5+28*tf*tf+24*tf*tf+6*eiteffang+8*eiteffang*tf*tf)*pow((y/Nf),5))*180.0/PI;747576 B=deg_int(Bdu);77 L=L0+deg_int(ldu);78double W=sqrt(1-efang*sin(B)*sin(B));printf("W=%f\n",W); 79double N=a/W;printf("N=%f\n",N);80double M=a*(1-efang)/pow(W,3);printf("M=%f\n",M);81 R=sqrt(M*N);828384 }。
GAUSSLE坐标正反算fx-5800程序源程序1.正算主程序Lbi 0:“G”?K:“Z=-1,Q=0,Y=1”?AIf A=-1:Then Prog “ZX”:Prog “GSZS”:IfEnd If A=1:Then Prog “YX”:Prog “GSZS”:IfEnd If A=0:Then Prog “QX”:Prog “GSZS”:IfEnd “X=”:X◢”Y=”:Y◢Goto 0说明:K 正算时所求点的里程A 选择线路,左幅=-1,右幅=1,整体式=0 正算子程序GSZS((P-R)÷(2(H-O)PR))→D:“JIAODU”?M:”JULI(-Z +Y)” ?L(Abs(K-O)) →J:Prog"SUB1":(F-M) →FReturn2. 反算主程序 GSFSLbi 0:?X:?Y:X→Z[2]:Y→Z[3]:“QDXO”?I:"QDY0"?S:"QDLC"?O:"QDFWJ "?G:"ZDLC"?H:"QDR"?P:"ZDR"? R:”Q(Z=-1 ZX=0 Y=1)” ?Q:( (P-R)÷(2(H-O)PR)) →D:(Abs((Y-S)cos(G-90)-(X-I)sin(G-90)) ) →J:0→L:90→M:Lbl 1:Prog "SUB1":((Z[3]-Y)cos(G-90+QJ(1÷P+JD)×180÷π)-(Z[2]-X)sin(G-90+QJ(1÷P +JD) ×180÷π)) →L:If:AbsL<10-6 Then Goto2:Else J+L→J:Go to 1:←┘Lbl 2:0→L:Prog "SUB1":((Z[3]-Y)÷sinF)→L:”K=”: O+J→k◢”L=”:L→L◢Goto 03. 反算,正算子程序(SUB1)0.1184634425→A:0.2393143352→B: 0.2844444444→Z[4]:0.0469100770→C: 0.2307 653449→E: 0.5→Z[1]:(I+J(Acos(G+QCJ(1÷P+CJD)×180÷π)+Bcos(G+QEJ(1÷P+EJD)×180÷π)+Z[4]cos(G+Q Z[1]J(1÷P+Z[1]JD)×180÷π)+Bcos(G+Q(1-E)J(1÷P+(1-E)JD)×180÷π)+Acos(G+Q (1-C)J(1÷P+(1-C)JD) ×180÷π))) →X:(S+J(Asin(G+QCJ(1÷P+CJD)×180÷π)+Bsin(G+QEJ(1÷P+EJD)×180÷π)+Z[4]sin(G+QZ [1]J(1÷P+Z[1]JD)×180÷π)+Bsin(G+Q(1-E)J(1÷P+(1-E)JD)×180÷π)+Asin(G+Q (1-C)J (1÷P+(1-C)JD) ×180÷π))) →Y:(G+QJ(1÷P+JD) ×180÷π+M) →F:(X+LcosF)→X:(Y+LsinF) →Y4. 曲线元要素数据库:ZX/YX/QXIf K<(起点里程):Then Goto 2:IfEndIf K<(ZDLC): Then QDXO →I:QDY0→S:QDLC→O:QDFWJ →G:ZDLC→H:QDR→P:ZDR→R:Q(Z=-1 ZX=0 Y=1)→Q: Goto 3:IfEnd……….(注:如有多个曲线元要素继续添加入数据库ZX/YX/QX中)Lbl 2:”NO”Lbl 3:Return说明:一、程序功能及原理1.功能说明:本程序由两个主程序——正算主程序(GSZS)、反算主程序(GSFS)和两个子程——正算子程序(SUB1)、线元数据库(DAT-M)构成,可以根据曲线段——直线、圆曲线、缓和曲线(完整或非完整型)的线元要素(起点坐标、起点里程、起点切线方位角、终点里程、起点曲率半径、止点曲率半径)及里程边距或坐标,对该曲线段范围内任意里程中边桩坐标进行正反算。
C#⾼斯正算⾼斯反算⾼斯换带等⾸先,你要确定椭球参数:C#代码1. a = 6378140; //西安80椭球 IGA752. e2 = 0.006694384999588;3. m0 = a * (1 - e2);4. m2 = 3.0 / 2 * e2 * m0;5. m4 = 5.0 / 4 * e2 * m2;6. m6 =7.0 / 6 * e2 * m4;7. m8 = 9.0 / 8 * e2 * m6;8. a0 = m0 + m2 / 2 + (3.0 / 8.0) * m4 + (5.0 / 16.0) * m6 + (35.0 / 128.0) * m8;9. a2 = m2 / 2 + m4 / 2 + 15.0 / 32 * m6 + 7.0 / 16 * m8;10. a4 = m4 / 8 + 3.0 / 16 * m6 + 7.0 / 32 * m8;11. a6 = m6 / 32 + m8 / 16;12. a8 = m8 / 128;13. xx = 0;14. yy = 0;15. _x = 0;16. _y = 0;17. BB = 0;18. LL = 0;下⾯才开始正题:⾼斯正算:把经纬度坐标转换为平⾯坐标C#代码1. void GaussPositive(double B, double L, double L0)2. {3. double X, t, N, h2, l, m, Bmiao, Lmiao;4. int Bdu, Bfen, Ldu, Lfen;5. Bdu = (int)B;6. Bfen = (int)(B * 100) % 100;7. Bmiao = (B - Bdu - Bfen * 0.01) * 10000.0;8. B = Bdu * PI / 180.0 + (Bfen / 60.0) * PI / 180.0 + Bmiao / 3600.0 * PI / 180.0;9. Ldu = (int)L;10. Lfen = (int)(L * 100) % 100;11. Lmiao = (L - Ldu - Lfen * 0.01) * 10000.0;12. L = Ldu * PI / 180.0 + (Lfen / 60.0) * PI / 180 + Lmiao / 3600.0 * PI / 180.0;13. l = L - L0 * PI / 180;14. X = a0 * B - Math.Sin(B) * Math.Cos(B) * ((a2 - a4 + a6) + (2 * a4 - 16.0 / 3.0 * a6) * Math.Sin(B) * Math.Sin(B) + 16.0 / 3.0 * a6 * Math.Pow(Math.Sin(B), 4)) + a8 / 8.0 * Math.Sin(8 * B);15. t = Math.Tan(B);16. h2 = e2 / (1 - e2) * Math.Cos(B) * Math.Cos(B);17. N = a / Math.Sqrt(1 - e2 * Math.Sin(B) * Math.Sin(B));18. m = Math.Cos(B) * l;19. xx = X + N * t * ((0.5 + (1.0 / 24.0 * (5 - t * t + 9 * h2 + 4 * h2 * h2) + 1.0 / 720.0 * (61 - 58 * t * t + Math.Pow(t, 4)) * m * m) * m * m) * m * m);20. yy = N * ((1 + (1.0 / 6.0 * (1 - t * t + h2) + 1.0 / 120.0 * (5 - 18 * t * t + Math.Pow(t, 4) + 14 * h2 - 58 * h2 * t * t) * m * m) * m * m) * m);21. yy = yy + 500000;22. }⾼斯反算:把平⾯坐标转换为经纬度坐标:C#代码1. void GaussNegative(double x, double y, double L0)2.3. double Bf, Vf, l, tf, hf2, Nf, Bmiao, Lmiao;4. int Bdu, Bfen, Ldu, Lfen;4. int Bdu, Bfen, Ldu, Lfen;5. y = y - 500000;6. Bf = hcfansuan(x);7. Vf = Math.Sqrt(1 + e2 / (1 - e2) * Math.Cos(Bf) * Math.Cos(Bf));8. tf = Math.Tan(Bf);9. hf2 = e2 / (1 - e2) * Math.Cos(Bf) * Math.Cos(Bf);10. Nf = a / Math.Sqrt(1 - e2 * Math.Sin(Bf) * Math.Sin(Bf));11. BB = (Bf - 0.5 * Vf * Vf * tf * (Math.Pow(y / Nf, 2) - 1.0 / 12 * (5 + 3 * tf * tf + hf2 - 9 * hf2 * tf * tf) * Math.Pow(y / Nf, 4) + 1.0 / 360 * (61 + 90 * tf * tf + 45 * tf * tf) * Math.Pow(y / Nf, 6))) * 180 / PI;12. Bdu = (int)BB;13. Bfen = (int)((BB - Bdu) * 60);14. Bmiao = ((BB - Bdu) * 60 - Bfen) * 60;15. BB = Bdu + 0.01 * Bfen + 0.0001 * Bmiao;16. l = 1.0 / Math.Cos(Bf) * (y / Nf - 1.0 / 6.0 * (1 + 2 * tf * tf + hf2) * Math.Pow(y / Nf, 3) + 1.0 / 120.0 * (5 + 28 * tf * tf + 24 * Math.Pow(tf, 4) + 6 * hf2 + 8 * hf2 * tf * tf) * Math.Pow(y / Nf, 5)) * 180.0 / PI;17. LL = L0 + l;18. Ldu = (int)LL;19. Lfen = (int)((LL - Ldu) * 60);20. Lmiao = ((LL - Ldu) * 60 - Lfen) * 60;21. LL = Ldu + 0.01 * Lfen + 0.0001 * Lmiao;⾥⾯涉及到的弧长反算:C#代码1. double hcfansuan(double pX)2. {3. double Bf0 = pX / a0;4. double Bf1, Bf2;5. Bf1 = Bf0;6. Bf2 = (pX - F(Bf1)) / a0;7. while ((Bf2 - Bf1) > 1.0E-11)8. {9. Bf1 = Bf2;10. Bf2 = (pX - F(Bf1)) / a0;11. }12. return Bf1;13. }⾼斯换带就⽐较简单了:C#代码1. void GaussZone(double x, double y, double L0, double L0new)2. {3. GaussNegative(x, y, L0);4. GaussPositive(BB, LL, L0new);5. }。
高斯坐标正反matlab算程序:function [x,y]=zgauss(B,L,B0)%B是弧度为单位%L B0都是一度为单位e2=0.006693421622966; %第一偏心率ee2=0.006738525414683; %第二偏心率a=6378245; %长半轴X=111134.8611*B0-16036.4803*sin(2*B)+16.8281*sin(4*B)-0.022*sin(6*B); %子午弧长p=3600*180/pi; %ρ"W=sqrt(1-e2*(sin(B)^2)); %WN=a/W; %卯酉圈半径t=tan(B);yita=ee2*cos(B)*cos(B); %η的平方l=L-117; %Lll=l*3600;x=X+(N*sin(B)*cos(B)*ll^2)/(2*p^2)+N*sin(B)*(cos(B)^3)*(5-t^2-9*yita) *(ll^4)/(24*p^4);%x坐标y=N*cos(B)*ll/p+N*(cos(B)^3)*(1-t^2+yita)*ll^3/(6*p^3)+N*(cos(B)^5)*( 5-18*t^2+t^4)*ll^5/(120*p^5);%坐标function [BB,l]=fgauss(x,y)%在克拉索夫椭球上e2=0.006693421622966; %第一偏心率ee2=0.006738525414683; %第二偏心率a=6378245; %长半轴a0=111134.8611;Bf(1)=x/a0;Bf(1)=Bf(1)*pi/180; %把度换算成弧度%以下用迭代法解出 Bffor i=1:5Bf(i+1)=(x-(-16036.4803*sin(2*Bf(i))+16.8281*sin(4*Bf(i))-0.022*sin(6 *Bf(i))))/a0*pi/180;end%代入公式计算BBf=Bf(5);tf=tan(BBf);yitaf2=ee2*(cos(BBf)^2);Wf=sqrt(1-e2*(sin(BBf)^2));Mf=a*(1-e2)/Wf;Nf=a/Wf;BB=BBf-tf*y^2/(2*Mf*Nf)+tf^3*(5+3*tf^2+yitaf2-9*yitaf2*tf^2)*y^4/(24* Mf*Nf^3);BB=BB*180/pi;l=y/(Nf*cos(BBf))-(1+2*tf^2+yitaf2)*y^3/(6*Nf^3*cos(BBf))+(5+28*tf^2+ 24*tf^4)*y^5/(120*Nf^5*cos(BBf));我是一名在校大学生,大家在实际生产生活中若有什么关于matlab,和测量有什么问题欢迎来邮件与我联系。
#include<math.h>#include<stdio.h>#define PI 3.1415926535897932#define P 206264.806247096355void main(){long double AngleToRadian(long double alfa);long double RadianToAngle(long double alfa);long double Bf(long double a,long double b,long double x);void GSZS(long double a,long double b,long double l,long double B,long double *x,long double *y);void GSFS(long double a,long double b,long double Bf,long double y,long double *B,long double *l);char XZ,XZZF,XZSL; int N,num;long double a,b,B,L,x,y;char YN='O';long double L1,B1,L0,l;long double *pointer_x,*pointer_y;long double FSB,FSL;long double *pointer_B,*pointer_L;long double DH;pointer_B=&FSB;pointer_L=&FSL;pointer_x=&x;pointer_y=&y;printf("\n============================欢迎使用xx投影计算程序============================\n");printf(" 说明\n");printf("1.程序可实现在任意椭球上进行高斯三度带和六度带正算和反算;\n");printf("2.经纬度的输入输出格式为:度分秒,例如:113°05\'13.68466\"输入时为:113.051368466;\n");printf("3.y坐标的输入输出格式为:带号*10E6+500公里+自然坐标,例如:y=18637682.388,18为带号,自然坐标为137682.388;\n");printf("4.其余可按照提示完成,如有疑问可发送Email至gys_long@,我们将尽快为您解答。
高斯投影正反算与换带计算True BASIC程序欧龙;陈性义;欧阳平【摘要】实际测量工作中,经常需要进行高斯投影正、反算与换带计算,如果用手工完成,则计算量庞大,且容易出错.为此,利用True BASIC编写了计算程序,只需输入高斯平面坐标,就能在克拉索夫斯基和IUGG-1975参考椭球面上进行高斯投影正、反算和换带计算,还可将计算成果导入CASS中展点,或上传到全站仪内存中使用.【期刊名称】《铁道勘察》【年(卷),期】2006(032)005【总页数】4页(P12-15)【关键词】高斯投影;正反算;换带计算;True BASIC【作者】欧龙;陈性义;欧阳平【作者单位】中国地质大学,湖北武汉,430074;中国地质大学,湖北武汉,430074;中国地质大学,湖北武汉,430074【正文语种】中文【中图分类】U21 数学模型1.1 参考椭球面的高斯投影参考椭球面的高斯投影是指将地表的观测元素先投影到参考椭球面上(称为高斯归化[1]),再投影到高斯平面上(称为高斯投影改化[1]),这样就可以在高斯平面直角坐标系中进行测量平差计算。
在控制测量学中,由控制点的大地经纬度(L,B)计算其高斯平面坐标(x,y),称为高斯投影正算;由高斯平面坐标(x,y)计算其大地经纬度(L,B),称为高斯投影反算;由一个投影带的高斯平面坐标(x1,y1)计算其在另一个投影带的高斯平面坐标(x2,y2),称为高斯投影换带计算。
1.2 参考椭球面的高斯投影正算公式设投影带的主子午线经度为L0,地表P点的经纬度为(L,B),其高斯平面坐标为(x,y),子午线收敛角为γ,经度差为l=L-L0,则有高斯投影正算公式[2](1)γ0为以度为单位的子午线收敛角。
式中它们均与高程修正值ΔH无关。
X为子午圈弧长,计算公式为(2)式中,B0是以度为单位的纬度值,5个系数的计算公式为1.3 参考椭球面的高斯投影反算公式高斯投影反算就是已知地面点P的高斯坐标x,y,求其大地坐标L,B。