c语言大地坐标转换空间坐标,空间直角坐标系与大地坐标系转换程序

《空间直角坐标系与大地坐标系转换程序》由会员分享,可在线阅读,更多相关《空间直角坐标系与大地坐标系转换程序(4页珍藏版)》请在人人文库网上搜索。

1、空间直角坐标系与大地坐标系转换程序#include#include#includeusing namespace std;#define PI (2.0*asin(1.0)void main() double a,b,c,d1,d2,f1,f2,m1,m2,B,L,H,X,Y,Z,W,N,e;/coutab;a=6378137;/ 以 WGS8釣例b=6356752.3142;e=sqrt(a*a-b*b)/a;c=a*a/b;int x;coutx;switch(x)case 0:coutd1f1m1d2f2m2H;B=PI*(d1+f1/60+m1/3600)/180;L=PI*(d2+f。

2、2/60+m2/3600)/180;W=sqrt(1-e*e*sin(B)*sin(B);N=a/W;X=(N+H)*cos(B)*cos(L);Y=(N+H)*cos(B)*sin(L);Z=(N*(1-e*e)+H)*sin(B);coutXYZ;double t,m,n, P,k,B0; m=Z/sqrt(X*X+Y*Y); /t0 B0=atan(m); /初值n=Z/sqrt(X*X+Y*Y);P=c*e*e/sqrt(X*X+Y*Y);k=1+(a*a-b*b)/(b*b);t=m+P*n/sqrt(k+n*n); / 现在为 t1 ,之后代替 t2,t3.B=atan(t);W=。

3、sqrt(1-e*e*sin(B)*sin(B);N=a/W;H=Z/sin(B) - N*(1-e*e);int i;for(i=1;fabs(B-B0)10E-10;i+)/ 每一次新的 B 与上一次计算的10E-10 radB0=B;n=t;t=m+P*n/sqrt(k+n*n);/ 迭代B=atan(t);W=sqrt(1-e*e*sin(B)*sin(B);N=a/W;/if(X0)/L=atan(Y/X)+PI;/if(X0)&(Y0)/L=2*PI-atan(Y/X);L=atan2(Y,X);H=sqrt(X*X+Y*Y)/cos(B)-N;int Bd,Bf,Ld,Lf;do。

4、uble Bm,Lm;B=180*B/PI;/B 转化为度做单位Bd=B;Bf=(B-Bd)*60;Bm=(B-Bd)*60-Bf)*60;L=180*L/PI;/L 转化为度做单位Ld=L;Lf=(L-Ld)*60;Lm=(L-Ld)*60-Lf)*60;cout 大地坐标系中纬度,经度,大地高(国际单位)分别为 fixedsetprecision(6)BmendlLd fixedsetprecision(6)Lmendlfixedsetprecision(6)Hendl;break;B 比较,误差小于Bd BfLf运行结果请输入眄如 阳大地坐标系到空间直角坐标系i -空间直角坐标系到大地坐标系 話分别输入空间直角坐标系中卷的值(国际单位)-2686431-0253934292457.8225433864951768393大地坐掃系中纬度,经度,大地高(匡I际单位)分别为即32 18-540000122 2 25.280008-0000005Press any ke to continue精选资料,欢迎下载Welcome !欢迎您的下载,资料仅供参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一种基于WGS84椭球模型的大地坐标空间直角坐标之间的相互转换方法,使用C语言实现。 1. 定义常量 首先需要定义一些常量,包括椭球体长半轴a、短半轴b、第一偏心率e、第二偏心率e'等,以及一些常量的计算结果。 ```c #define PI 3.14159265358979323846 #define a 6378137.0 // 椭球体长半轴 #define b 6356752.314245 // 椭球体短半轴 #define f (a - b) / a // 扁率 #define e2 (2 * f - f * f) // 第一偏心率的平方 #define ep2 (e2 / (1 - e2)) // 第二偏心率的平方 ``` 2. 大地坐标转换空间坐标 给定一个大地坐标(经度、纬度、高程),需要将其转换空间坐标(X、Y、Z)。计算方法如下: ```c void geodetic2ecef(double lon, double lat, double h, double *x, double *y, double *z) { double N = a / sqrt(1 - e2 * sin(lat) * sin(lat)); // 卯酉圈曲率半径 *x = (N + h) * cos(lat) * cos(lon); *y = (N + h) * cos(lat) * sin(lon); *z = (N * (1 - e2) + h) * sin(lat); } ``` 3. 空间坐标转换大地坐标 给定一个空间坐标(X、Y、Z),需要将其转换大地坐标(经度、纬度、高程)。计算方法如下: ```c void ecef2geodetic(double x, double y, double z, double *lon, double *lat, double *h) { double p = sqrt(x * x + y * y); // 投影距离 double theta = atan2(z * a, p * b); // 纬度角 double sintheta = sin(theta); double costheta = cos(theta); *lon = atan2(y, x); double N = a / sqrt(1 - e2 * sintheta * sintheta); // 卯酉圈曲率半径 *lat = atan2(z + ep2 * N * sintheta * sintheta, p - e2 * N * costheta * costheta); double sinlat = sin(*lat); N = a / sqrt(1 - e2 * sinlat * sinlat); *h = p / cos(*lat) - N; } ``` 使用示例: ```c int main() { double lon = 116.3975; // 经度 double lat = 39.9086; // 纬度 double h = 50.0; // 高程 double x, y, z; geodetic2ecef(lon * PI / 180, lat * PI / 180, h, &x, &y, &z); printf("x = %lf, y = %lf, z = %lf\n", x, y, z); double lon1, lat1, h1; ecef2geodetic(x, y, z, &lon1, &lat1, &h1); printf("lon = %lf, lat = %lf, h = %lf\n", lon1 * 180 / PI, lat1 * 180 / PI, h1); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值