高斯投影正反算编程Word文件下载.docx

上传人:b****2 文档编号:15074703 上传时间:2022-10-27 格式:DOCX 页数:13 大小:114.06KB
下载 相关 举报
高斯投影正反算编程Word文件下载.docx_第1页
第1页 / 共13页
高斯投影正反算编程Word文件下载.docx_第2页
第2页 / 共13页
高斯投影正反算编程Word文件下载.docx_第3页
第3页 / 共13页
高斯投影正反算编程Word文件下载.docx_第4页
第4页 / 共13页
高斯投影正反算编程Word文件下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

高斯投影正反算编程Word文件下载.docx

《高斯投影正反算编程Word文件下载.docx》由会员分享,可在线阅读,更多相关《高斯投影正反算编程Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。

高斯投影正反算编程Word文件下载.docx

三.编程的相关代码

(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 艺术创意

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1