坐标转换
2017-08-27 00:00
351 查看
摘要: GPS定位程序,C++
坐标转换源代码--GPS定位程序(C++)
GPS数据处理中为了满足不同的需要,处理的数据要进行坐标转换,得到在不同坐标系统下的结果,下面是笛卡尔坐标系,大地坐标系,站心地平坐标系(线型和极坐标形式)之间的转换源代码:
头文件:
源文件:
坐标转换源代码--GPS定位程序(C++)
GPS数据处理中为了满足不同的需要,处理的数据要进行坐标转换,得到在不同坐标系统下的结果,下面是笛卡尔坐标系,大地坐标系,站心地平坐标系(线型和极坐标形式)之间的转换源代码:
头文件:
#ifndef _COORDCOVERT_H #define _COORDCOVERT_H #include "stdlib.h" //WGS-84椭球体参数 const double a=6378137.0;//长半轴 const double flattening=1/298.257223563;//扁率 const double delta=0.0000001; typedef struct tagCRDCARTESIAN{ double x; double y; double z; }CRDCARTESIAN; typedef CRDCARTESIAN *PCRDCARTESIAN; //笛卡尔坐标系 typedef struct tagCRDGEODETIC{ double longitude; double latitude; double height; }CRDGEODETIC; typedef CRDGEODETIC *PCRDGEODETIC; //大地坐标系 typedef struct tagCRDTOPOCENTRIC{ double northing; double easting; double upping; }CRDTOPOCENTRIC; typedef CRDTOPOCENTRIC *PCRDTOPOCENTRIC; //站心地平坐标系(线坐标形式) typedef struct tagCRDTOPOCENTRICPOLAR{ double range; double azimuth; double elevation; }CRDTOPOCENTRICPOLAR; typedef CRDTOPOCENTRICPOLAR *PCRDTOPOCENTRICPOLAR; //站心地平坐标系(极坐标形式) //由笛卡尔坐标转换为大地坐标 void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc, double dSemiMajorAxis, double dFlattening); //pcg:指向所转换出的大地坐标的指针; //pcc:指向待转换的笛卡尔坐标的指针; //dSemiMajorAxis:参考椭球的长半轴; //dFlattening:参考椭球的扁率。 //由大地坐标转换为笛卡尔坐标 void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg, double dSemiMajorAxis, double dFlattening); //pcc:指向所转换出的笛卡尔坐标的指针; //pcg:指向待转换的大地坐标的指针; //dSemiMajorAxis:参考椭球的长半轴; //dFlattening:参考椭球的扁率。 //由笛卡尔坐标转换为站心地平坐标 void CartesianToTopocentric (PCRDTOPOCENTRIC pct, PCRDCARTESIAN pcc, PCRDCARTESIAN pccCenter, double dSemiMajorAxis, double dFlattening); //pct:指向所转换出的站心地平坐标的指针; //pcc:指向待转换的笛卡尔坐标的指针; //pccCenter:指向站心的笛卡尔坐标的指针; //dSemiMajorAxis:参考椭球的长半轴; //dFlattening:参考椭球的扁率。 //由站心地平直角坐标转换为站心地平极坐标 void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp, PCRDTOPOCENTRIC pct); //pctp:指向所转换出的站心地平极坐标的指针; //pct:指向待转换的站心地平坐标的指针; //由站心地平极坐标转换为站心地平直角坐标 void TopocentricPolarToTopocentric (PCRDTOPOCENTRIC pct,PCRDTOPOCENTRICPOLAR pctp); //pct:指向所转换的站心地平坐标的指针; //pctp:指向待转换的站心地平极坐标的指针; #endif
源文件:
#include "CoordCovert.h" #include "math.h" void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc, double dSemiMajorAxis, double dFlattening) { double e2;//第一偏心率的平方 e2=2*dFlattening-dFlattening*dFlattening; pcg->longitude=atan(pcc->y/pcc->x); double W,N,N1=0,B,B1; B1=atan(pcc->z/sqrt(pcc->x*pcc->x+pcc->y*pcc->y)); while(1) { W=sqrt(1-e2*sin(B1)*sin(B1)); N1=dSemiMajorAxis/W; B=atan((pcc->z+N1*e2*sin(B1))/sqrt(pcc->x*pcc->x+pcc->y*pcc->y)); if(fabs(B-B1)<delta) break; else B1=B; } pcg->latitude=B; N=dSemiMajorAxis/sqrt(1-e2*sin(pcg->latitude)*sin(pcg->latitude)); pcg->height=sqrt(pcc->x*pcc->x+pcc->y*pcc->y)/cos(B)-N; } //由大地坐标转换为笛卡尔坐标 void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg, double dSemiMajorAxis, double dFlattening) { double e2;//第一偏心率的平方 double N;//卯酉圈半径 e2=2*dFlattening-dFlattening*dFlattening; N=dSemiMajorAxis/sqrt(1-e2*sin(pcg->latitude)*sin(pcg->latitude)); pcc->x=(N+pcg->height)*cos(pcg->latitude)*cos(pcg->longitude); pcc->y=(N+pcg->height)*cos(pcg->latitude)*sin(pcg->longitude); pcc->z=(N*(1-e2)+pcg->height)*sin(pcg->latitude); } //由笛卡尔坐标转换为站心地平坐标 void CartesianToTopocentric (PCRDTOPOCENTRIC pct, PCRDCARTESIAN pcc, PCRDCARTESIAN pccCenter, double dSemiMajorAxis, double dFlattening) { double dx,dy,dz; dx=pcc->x-pccCenter->x; dy=pcc->y-pccCenter->y; dz=pcc->z-pccCenter->z; PCRDGEODETIC pd; pd=(PCRDGEODETIC)malloc(sizeof(CRDGEODETIC)); CartesianToGeodetic (pd,pccCenter,dSemiMajorAxis,dFlattening); pct->northing=-sin(pd->latitude)*cos(pd->longitude)*dx -sin(pd->latitude)*sin(pd->longitude)*dy +cos(pd->latitude)*dz; pct->easting=-sin(pd->longitude)*dx +cos(pd->longitude)*dy; pct->upping=cos(pd->latitude)*cos(pd->longitude)*dx +cos(pd->latitude)*sin(pd->longitude)*dy +sin(pd->latitude)*dz; free(pd); } //由站心地平直角坐标转换为站心地平极坐标 void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp, PCRDTOPOCENTRIC pct) { pctp->range=sqrt(pct->northing*pct->northing+pct->easting*pct->easting+pct->upping*pct->upping); pctp->azimuth=atan(pct->easting/pct->northing); pctp->elevation=asin(pct->upping/pctp->range); } //由站心地平极坐标转换为站心地平直角坐标 void TopocentricPolarToTopocentric (PCRDTOPOCENTRIC pct, PCRDTOPOCENTRICPOLAR pctp) { pct->northing=pctp->range*cos(pctp->elevation)*cos(pctp->azimuth); pct->easting=pctp->range*cos(pctp->elevation)*sin(pctp->azimuth); pct->upping=pctp->range*sin(pctp->elevation); }
相关文章推荐
- 转贴:轻松实现坐标转换--不同地理位置系统转换入门
- Unity的实时绘制与坐标转换总结
- 地理坐标、经纬度坐标与屏幕坐标的转换!
- Unity 3D物体的点击事件响应以及NGUI坐标和世界坐标的互相转换
- MapGIS K9 TDE平台3D坐标转换为2D坐标
- 原创]unity3D学习【功能实现】之一:坐标的转换以及物体的移动
- 转:坐标转换的一些基本知识 (地球椭球体 大地基准面 投影坐标系统 高斯投影)
- UIView中的坐标转换
- Gps与地图坐标转换
- 百度与谷歌地图坐标转换
- 【Unity】关于transform.TransformPoint的坐标转换
- GPS坐标批量转换成百度地图坐标(SQL SERVER 2012+C#)
- ArcGIS Engine 下投影坐标和经纬度坐标的相互转换
- Unity里的坐标转换+动态载入
- iOS-- UIView中的坐标转换
- 经纬度定义、经纬度格式、GDAL中地理坐标转换及地理坐标屏幕显示
- ARCGIS中坐标转换及地理坐标、投影坐标定义(转载)
- java中的坐标转换及测距
- 地球坐标 火星坐标 百度坐标 相互转换
- 相机的坐标转换(2):单应性矩阵的求解