c语言坐标反算,[转载]C语言版——高斯坐标反算程序

高斯反算

输入1975年国际椭球体下的6度带坐标x和y,例

如(2506658.3680,19711330.6495)求其大地经纬度L,

B。(现用函数处理,且用指针类型的数据作函数参数)

#include

#include

#define PI 3.1415926535897932

#define P 206264.806247096355

void main()

{

long double RadianToAngle(long double

alfa);

long double Bf(long double a,long double b,long double

x);

void GSFS(long double a,long double b,long double Bf,long double

y,long double *B,long double *l);

long double a,b,x,y,L0;

long double FSB,FSL;

long double

*pointer_B,*pointer_L;

long double

DH;

pointer_B=&FSB; pointer_L=&FSL;

a=6378140.0000000000;b=6356755.2881575287;

printf("请输入x坐标和y坐标:(输入时x坐标和y坐标之间用逗号隔开)n");

scanf("%lf,%lf",&x,&y);

FSB=Bf(a,b,x);

DH=floor(y/1000000); y=y-DH*1000000-500000;

GSFS(a,b,FSB,y,pointer_B,pointer_L);

FSB=RadianToAngle(FSB);

FSL=RadianToAngle(FSL);

L0=DH*6-3;

printf("nt===========================计算结果===========================n");

printf("nttB=%-20.10lfttL=%-20.10lfn",FSB,DH*6-3+FSL);

printf("nt=============================================================n");

}

long double RadianToAngle(long double alfa)

{

long double alfa1,alfa2;

alfa=alfa*180./PI;

alfa1=floor(alfa)+floor((alfa-floor(alfa))*60.)/100.;

alfa2=(alfa*60.-floor(alfa*60.))*0.006;

alfa1+=alfa2;

return(alfa1);

}

long double Bf(long double a,long double b,long double x)

{

long double

e,m0,m2,m4,m6,m8;

long double a0,a2,a4,a6,a8;

long double B,FB,Bn1,Bn;

int n=0;

e=(sqrt(a*a-b*b))/a;

m0=a*(1-e*e);

m2=3.0/2.0*e*e*m0; m4=5.0/4.0*e*e*m2;

m6=7.0/6.0*e*e*m4; m8=9.0/8.0*e*e*m6;

a0=m0+m2/2.0+3.0/8.0*m4+5.0/16.0*m6+35.0/128.0*m8;

a2=m2/2.0+m4/2.0+15.0/32.0*m6+7.0/16.0*m8;

a4=m4/8.0+3.0/16.0*m6+7.0/32.0*m8;

a6=m6/32.0+m8/16.0; a8=m8/128.0;

B=x/a0;

FB=a2/2.0*sin(2*B)-a4/4.0*sin(4*B)+a6/6.0*sin(6*B)-a8/8.0*sin(8*B);

do

{

Bn=B;

B=(x+FB)/a0;

FB=a2/2.0*sin(2*B)-a4/4.0*sin(4*B)+a6/6.0*sin(6*B)-a8/8.0*sin(8*B);

Bn1=B;

}

while(fabs((Bn1-Bn)*P)>=0.000000000001);

return(B);

}

void GSFS(long double a,long double b,long double Bf,long double

y,long double *B,long double *l)

{

long double

e,e1,V,t,u2;

long double

n0,n2,n4,n6,n8,sin2B,sin4B,sin6B,sin8B,N;

e=(sqrt(a*a-b*b))/a;

e1=(sqrt(a*a-b*b))/b;

V=sqrt(1+e1*e1*cos(Bf)*cos(Bf));

t=tan(Bf);

u2=e1*e1*cos(Bf)*cos(Bf);

n0=a;

n2=1.0/2.0*e*e*n0; n4=3.0/4.0*e*e*n2;

n6=5.0/6.0*e*e*n4; n8=7.0/8.0*e*e*n6;

sin2B=pow(sin(Bf),2); sin4B=pow(sin(Bf),4);

sin6B=pow(sin(Bf),6); sin8B=pow(sin(Bf),8);

N=n0+n2*sin2B+n4*sin4B+n6*sin6B+n8*sin8B;

*B=Bf-1.0/2.0*V*V*t*((y/N)*(y/N)-1.0/12.0*(5+3*t*t+u2-9*u2*t*t)*pow((y/N),4)+1.0/360.0*(61+90*t*t+45*pow(t,4))*pow((y/N),6));

*l=1.0/cos(Bf)*((y/N)-1.0/6.0*(1+2*t*t+u2)*pow((y/N),3)+1.0/120.0*(5+28*t*t+24*pow(t,4)+6*u2+8*u2*t*t)*pow(y/N,5));

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言实现的坐标斯正程序代码: 坐标: ```c #include <stdio.h> #include <math.h> #define pi 3.14159265358979324 #define a 6378245.0 #define ee 0.00669342162296594323 static double transformLat(double x, double y) { double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(fabs(x)); ret += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0; ret += (20.0 * sin(y * pi) + 40.0 * sin(y / 3.0 * pi)) * 2.0 / 3.0; ret += (160.0 * sin(y / 12.0 * pi) + 320 * sin(y * pi / 30.0)) * 2.0 / 3.0; return ret; } static double transformLon(double x, double y) { double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(fabs(x)); ret += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0; ret += (20.0 * sin(x * pi) + 40.0 * sin(x / 3.0 * pi)) * 2.0 / 3.0; ret += (150.0 * sin(x / 12.0 * pi) + 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0; return ret; } void wgs2gcj(double wgLat, double wgLon, double *gcjLat, double *gcjLon) { if (outOfChina(wgLat, wgLon)) { *gcjLat = wgLat; *gcjLon = wgLon; return; } double dLat = transformLat(wgLon - 105.0, wgLat - 35.0); double dLon = transformLon(wgLon - 105.0, wgLat - 35.0); double radLat = wgLat / 180.0 * pi; double magic = sin(radLat); magic = 1 - ee * magic * magic; double sqrtMagic = sqrt(magic); dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi); *gcjLat = wgLat + dLat; *gcjLon = wgLon + dLon; } void gcj2wgs(double gcjLat, double gcjLon, double *wgLat, double *wgLon) { if (outOfChina(gcjLat, gcjLon)) { *wgLat = gcjLat; *wgLon = gcjLon; return; } double dLat = transformLat(gcjLon - 105.0, gcjLat - 35.0); double dLon = transformLon(gcjLon - 105.0, gcjLat - 35.0); double radLat = gcjLat / 180.0 * pi; double magic = sin(radLat); magic = 1 - ee * magic * magic; double sqrtMagic = sqrt(magic); dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi); *wgLat = gcjLat - dLat; *wgLon = gcjLon - dLon; } int outOfChina(double lat, double lon) { if (lon < 72.004 || lon > 137.8347) return 1; if (lat < 0.8293 || lat > 55.8271) return 1; return 0; } ``` 斯正: ```c #include <stdio.h> #include <math.h> #define pi 3.14159265358979324 #define a 6378245.0 #define ee 0.00669342162296594323 #define m0 0.9996 #define x_pi (3.14159265358979324 * 3000.0 / 180.0) void gauss2wgs(double gaussX, double gaussY, double *wgLat, double *wgLon) { double x = gaussX / m0; double y = gaussY / m0; double z = sqrt(1 - ee * sin(y * pi / 180.0) * sin(y * pi / 180.0)); double z1 = (1 - ee) / z; double d = x / (a * z1); double r = pi / 180.0; double lat = d; double v = 0; double sign = y < 0 ? -1.0 : 1.0; for (int i = 0; i < 5; i++) { double t = lat; double c = sqrt(1 - ee * sin(t * r) * sin(t * r)) * tan(t * r); double f = 1 + c * c; double m = a * (1 - ee) / pow(f, 1.5); double n = a / sqrt(f); double tmp = n / m * c; v = sign * d * d / 2.0; lat = d + (y - v + tmp * tmp * d / 3.0) / m; } *wgLat = lat; *wgLon = x_pi * (x / a / z1 + (3.0 * tmp - 0.0024 * tmp * tmp * tmp) * cos(y * r) + 0.002 * cos(3.0 * y * r) - 0.0003 * cos(5.0 * y * r)) / pi; } void wgs2gauss(double wgLat, double wgLon, double *gaussX, double *gaussY) { double lat = wgLat; double lon = wgLon; double L = lon * pi / 180.0; double B = lat * pi / 180.0; double n = (a - 6378140) / (a + 6378140); double e2 = 1 - (a - 6378140) * (a - 6378140) / (a * a); double ee2 = (a * a - 6378140 * 6378140) / (6378140 * 6378140); double cosB = cos(B); double sinB = sin(B); double tanB = sinB / cosB; double N = a / sqrt(1 - e2 * sinB * sinB); double t = tanB * tanB; double t2 = t * t; double c = ee2 * cosB * cosB; double c2 = c * c; double a0 = 1 + 3 * t / 4 + 45 * t2 / 64 + 175 * t * t2 / 256 + 11025 * t2 * t2 / 16384; double a2 = -3 * t / 2 + 15 * t2 / 16 + 525 * t * t2 / 512 - 2205 * t2 * t2 / 2048; double a4 = 15 * t2 / 64 - 175 * t * t2 / 256 + 945 * t2 * t2 / 4096; double a6 = -35 * t2 / 512 + 315 * t2 * t2 / 2048; double a8 = 315 * t2 * t2 / 131072; double s = a0 * B - sinB * cosB * (a2 + c * a4 + c2 * a6 + c2 * c * a8); double A = L - 117 * pi / 180; double A2 = A * A; double A3 = A2 * A; double A4 = A2 * A2; double A5 = A2 * A3; double A6 = A2 * A4; double A7 = A2 * A5; double A8 = A2 * A6; double x = 6367558.4969 * B - (662.789 + 0.58 * cos(2 * B * pi / 180) + 1.25 * cos(4 * B * pi / 180) + 0.21 * cos(6 * B * pi / 180)) * 100000 * (A2 / 2 - (5 + 3 * tanB * tanB + 10 * c - 4 * c * c - 9 * ee2) * A4 / 24 + (61 + 90 * tanB * tanB + 298 * c + 45 * tanB * tanB * tanB * tanB - 252 * ee2 - 3 * c * c) * A6 / 720); double y = (1 + (1 - ee2) * cosB * cosB - 3 * ee2 * sinB * sinB) * N * tanB * A - N * (1 + (1 - ee2) * cosB * cosB - ee2 * sinB * sinB) * A3 / 6 + N * (5 - 18 * tanB * tanB + t2 + 14 * c - 58 * ee2) * tanB * A5 / 120; *gaussX = x + 500000; *gaussY = y + 2700000; } ``` 注意:以上代码仅供参考,实际应用中需要进行一定的测试和修改以保证正确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值