高斯投影正反算编程Word文件下载.docx
《高斯投影正反算编程Word文件下载.docx》由会员分享,可在线阅读,更多相关《高斯投影正反算编程Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
三.编程的相关代码
(1)正算
#include"
stdio.h"
#include "
stdlib.h"
#include"math.h"
#include"
assert.h"
#definepi(4*atan(1.0))
inti;
structjin
{
double B;
double L;
doubleL0;
};
structjing[100];
main(intargc,double *argv[])
FILE*r=fopen("a.txt"
,"
r"
);
assert(r!
=NULL);
ﻩFILE *w=fopen("
b.txt"
"w"
assert(r!
=NULL);
ﻩinti=0;
while(fscanf(r,"
%lf%lf%lf",&
g[i].B,&g[i].L,&
g[i].L0)!
=EOF)
ﻩ{
double a,b;
intzuobiao;
printf("
\n请输入坐标系:
北京54=1,西安80=2,WGS84=3:
"
ﻩscanf("
%d"
&
zuobiao);
getchar();
if(zuobiao==1)
{
a=6378245;
b=6356863.0187730473;
ﻩ}
if(zuobiao==2)
ﻩ {
a=6378140;
b=6356755.2881575287;
}
if(zuobiao==3)
ﻩ{
ﻩa=6378137;
ﻩ b=6356752.3142;
} //选择坐标系//
doublef=(a-b)/a;
double e,e2;
ﻩe=sqrt(2*f-f*f);
e2=sqrt((a/b)*(a/b)-1);
//求椭球的第一,第二曲率//
ﻩ
doublem0,m2,m4,m6,m8;
double a0,a2,a4,a6,a8;
m0=a*(1-e*e);
m2=3*e*e*m0/2;
m4=5*e*e*m2/4;
ﻩ m6=7*e*e*m4/6;
m8=9*e*e*m6/8;
a0=m0+m2/2+3*m4/8+5*m6/16+35*m8/128;
a2=m2/2+m4/2+15*m6/32+7*m8/16;
ﻩ a4=m4/8+3*m6/16+7*m8/32;
a6=m6/32+m8/16;
a8=m8/128;
ﻩ
double Bmiao,Lmiao, L0miao;
Bmiao=(int)(g[i].B)*3600.0+(int)((g[i].B-(int)(g[i].B))*100.0)*60.0+(g[i].B*100-(int)(g[i].B*100))*100.0;
Lmiao=(int)(g[i].L)*3600.0+(int)((g[i].L-(int)(g[i].L))*100.0)*60.0+(g[i].L*100-(int)(g[i].L*100))*100.0;
ﻩL0miao=(int)(g[i].L0)*3600.0+(int)((g[i].L0-(int)(g[i].L0))*100.0)*60.0+(g[i].L0*100-(int)(g[i].L0*100))*100.0;
doubledb;
ﻩ db=pi/180.0/3600.0;
ﻩdouble B1,L1,l;
B1=Bmiao*db;
L1= Lmiao*db;
l=L1-L0miao*db;
//角度转化为弧度//
double T=tan(B1)*tan(B1);
doublen=e2*e2*cos(B1)*cos(B1);
doubleA=l*cos(B1);
doubleX,x,y;
X=a0*(B1)-a2*sin(2*B1)/2+a4*sin(4*B1)/4-a6*sin(6*B1)/6+a8*sin(8*B1)/8;
//求弧长//
doubleN=a/sqrt(1-e*e*sin(B1)*sin(B1));
intZonewide;
ﻩintZonenumber;
printf("\n请输入带宽:
3度带或6度带Zonewide="
);
scanf("
&Zonewide);
getchar();
ﻩif(Zonewide==3)
{
ﻩZonenumber=(int)((g[i].L-Zonewide/2)/Zonewide+1);
else if(Zonewide==6)
ﻩ Zonenumber=(int)g[i].L/Zonewide+1;
}
else
ﻩ{
ﻩ printf("
错误");
exit(0);
ﻩ}//选择带宽//
double
ﻩ FE=Zonenumber*1000000+500000;
//改写为国家通用坐标//
ﻩy=FE+N*A+A*A*A*N*(1-T*T+n*n)/6+A*A*A*A*A*N*(5-18*T*T+T*T*T*T+14*n*n-58*n*n*T*T)/120;
ﻩx=X+tan(B1)*N*A*A/2+tan(B1)*N*A*A*A*A*(5-T*T+9*n*n+4*n*n*n*n)/24+tan(B1)*N*A*A*A*A*A*A*(61-58*T*T+T*T*T*T)/720;
ﻩprintf("\n所选坐标系的转换结果:
x=%lfy=%lf\n",x,y);
ﻩfprintf(w,"%lf%lf\n"
x,y);
//输出结果到文本文件//
ﻩﻩ
ﻩ}
ﻩfclose(r);
fclose(w);
ﻩsystem("
pause"
ﻩreturn 0;
}
(2)反算
#include"
stdio.h"
#include"
stdlib.h"
# include"
math.h"
# include"
assert.h"
#definepi(4*atan(1.0))
doubleX,Y,B1,B2,B3,F,t;
double m0,m2,m4,m6,m8;
doublea0,a2,a4,a6,a8,a1,b1;
doubleBB,LL,Bf;
double e,e1;
int d,m,s,i,zuobiao;
doublesort(double,double);
struct jin
double x;
doubley;
doubleL0;
struct jin g[100];
//x,y,L0为输入量:
x,y坐标和中央子午线经度//
main(intargc, double *argv[])
FILE*r=fopen("c.txt"
"
assert(r!
=NULL);
FILE*w=fopen("
d.txt"
assert(r!
=NULL);
inti=0;
while(fscanf(r,"
%lf%lf%lf"
,&
g[i].x,&
g[i].y,&
g[i].L0)!
=EOF)//文件为空,无法打开//
ﻩdoublea1=6378245.0000000000;
//克拉索夫斯基椭球参数//
doubleb1=6356863.0187730473;
doublea75=6378140.0000000000;
//1975国际椭球参数//
ﻩ doubleb75=6356755.2881575287;
doublea84=6378137.0000000000;
//WGS-84系椭球参数//
ﻩdoubleb84=6356752.3142000000;
double M,N;
//mouyou圈曲率半径,子午圈曲率半径//
ﻩdoublet,n;
double A,B,C;
doubleBB,LL,Bf,LL0,BB0;
ﻩ
doublea,b;
ﻩprintf("
\n选择参考椭球:
1=克拉索夫斯基椭球,2=1975国际椭球,3=WGS-84系椭球:
scanf("%d"
zuobiao);
getchar();
ﻩif(zuobiao==1)
ﻩa=a1;
b=b1;
ﻩ}
if(zuobiao==2)
a=a75;
b=b75;
if(zuobiao==3)
{
ﻩﻩa=a84;
ﻩﻩb=b84;
ﻩ }//选择参考椭球,求解第一偏心率e,第二偏心率e1//
Bf=sort(a,b);
//调用求解底点纬度的函数//
doubleq=sqrt(1-e*e*sin(Bf)*sin(Bf));
doubleG=cos(Bf);
ﻩ M=a*(1-e*e)/(q*q*q);
N=a/q;
doubleH,I;
A=g[i].y/N;
ﻩ H=A*A*A;
ﻩI=A*A*A*A*A;
t=tan(Bf);
ﻩn=e1*cos(Bf);
B=t*t;
ﻩC=n*n;
BB0=Bf-g[i].y*t*A/(2*M)+g[i].y*t*H/(24*M)*(5+3*B+C-9*B*C)-g[i].y*t*I/(720*M)*(61+90*B+45*B*B);
ﻩLL0=g[i].L0*pi/180.0+A/G-H/(6*G)*(1.0+2*B+C)+I/(120*G)*(5.0+28*B+24*B*B+6*C+8*B*C);
//利用公式求解经纬度//
ﻩintBdu,Bfen,Ldu,Lfen;
ﻩdoubleBmiao,Lmiao;
Ldu=int(LL0/pi*180);
ﻩLfen=int((LL0/pi*180)*60-Ldu*60);
ﻩLmiao=LL0/pi*180*3600-Ldu*3600-Lfen*60;
ﻩBdu=int(BB0/pi*180);
ﻩBfen=int((BB0/pi*180)*60-Bdu*60);
ﻩBmiao=BB0/pi*180*3600-Bdu*3600-Bfen