大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼_第1頁
大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼_第2頁
大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼_第3頁
大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼_第4頁
大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼大地坐標與空間直角坐標的轉(zhuǎn)換程序代碼編制僅供參考審核批準生效日期地址:電話:傳真:郵編:#include""#include""#include""#include"iostream"#definePIdoublea,b,c,e2,ep2;intmain(){ intm,n,t; doubleRAD(doubled,doublef,doublem); voidRBD(doublehd); voidBLH_XYZ(); voidXYZ_BLH(); voidB_ZS(); voidB_FS(); voidGUS_ZS(); voidGUS_FS(); printf("大地測量學\n");sp1:printf("請選擇功能:\n"); printf("1.大地坐標系到大地空間直角坐標的轉(zhuǎn)換\n"); printf("2.大地空間直角坐標到大地坐標系的轉(zhuǎn)換\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("請選擇橢球參數(shù)(輸入橢球序號):\n"); printf("1.克拉索夫斯基橢球參數(shù)\n"); printf("橢球參數(shù)\n"); printf("橢球參數(shù)\n"); printf("0.其他橢球參數(shù)(自行輸入)\n"); scanf("%d",&n); switch(n) { case1:a=;b=;c=;e2=;ep2=;break; case2:a=;b=;c=;e2=;ep2=;break; case3:a=;b=;c=;e2=;ep2=;break; case0:{ printf("請輸入橢球參數(shù):\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");gotosp2; } while(1) { switch(m) { case1:BLH_XYZ();break; case2:XYZ_BLH();break; case3:B_ZS();break; case4:B_FS();break; case5:GUS_ZS();break; case6:GUS_FS();break; default:printf("\n\n輸入錯誤!\n請重新輸入!\n\n");gotosp1; } printf("是否繼續(xù)進行此功能計算\n\n"); printf("(若繼續(xù)進行此功能計算,則輸入1;\n若選擇其他功能進行計算,則輸入2;\n若退出,則輸入0.)\n"); scanf("%d",&t); switch(t) { case1:break; case2:gotosp1; case0:exit(0); } }}doubleRAD(doubled,doublef,doublem){ doublee; doublesign=(d<:; if(d==0) { sign=(f<:; if(f==0) { sign=(m<:; } } if(d<0) d=d*; if(f<0) f=f*; if(m<0) m=m*; e=sign*(d*3600+f*60+m)*PI/(3600*180); returne;}voidRBD(doublehd){ intt; intd,f; doublem; doublesign=(hd<:; 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);}voidBLH_XYZ(){ doubleB,L,H,N,W; doubled,f,m; doubleX,Y,Z; printf("請輸入大地坐標(輸入格式為角度(例如:30'40'50')):\n"); printf("大地經(jīng)度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轉(zhuǎn)換后得到大地空間直角坐標為:\n\n"); printf("X=%lf\nY=%lf\nZ=%lf\n\n",X,Y,Z);}voidXYZ_BLH(){ doubleB,L,H,N,W; doubleX,Y,Z; doubletgB0,tgB1; printf("請輸入大地空間直角坐標:\n"); printf("X="); scanf("%lf",&X); printf("Y="); scanf("%lf",&Y); printf("Z="); scanf("%lf",&Z); printf("\n\n轉(zhuǎn)換后得到大地坐標為:\n\n"); L=atan(Y/X); printf("大地經(jīng)度為: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);}voidB_ZS(){ doubleL1,B1,A1,s,d,f,mi; doubleu1,u2,m,M,k2,alfa,bt,r,kp2,alfap,btp,rp; doublesgm0,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)>*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");}voidB_FS(){ doubleL1,B1,L2,B2,s,A1,A2,du,f,mi,m0,m,M; doublel,u1,u2,alfa,bt,r,lmd0,dit_lmd,lmd,sgm,dit_sgm,sgm0,sgm1,alfap,btp,rp,k2,kp2; printf("請輸入第一個點大地坐標(輸入格式為角度(例如:30'40'50'),下同):\n大地經(jīng)度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大地經(jīng)度: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=*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");}voidGUS_ZS(){ doubleB,L,x3,x6,y3,y6,Y3,Y6,du,f,mi,X,N,n,t; doubleAt,Bt,Ct,Dt,m3,m6,l3,l6,W,L03,L06; intDH3,DH6; printf("請輸入大地坐標(輸入格式為角度(例如:30'40'50')):\n大地經(jīng)度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-*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);}voidGUS_FS(){ doublex,y,Y,B,B0,B1,Bf,Vf,tf,Nf,nf,L,At,Bt,Ct,Dt,L3,L6; longDH; 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*e

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論