文档章节

坐标转换

洋碱
 洋碱
发布于 2017/08/27 16:31
字数 993
阅读 51
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

坐标转换源代码--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);

}
 


 

本文转载自网络

上一篇: 关于npm install
下一篇: C# 实现UPD 协议
洋碱

洋碱

粉丝 3
博文 77
码字总数 29731
作品 0
广州
高级程序员
私信 提问
加载中

评论(0)

cesium 学习(六) 坐标转换

cesium 学习(六) 坐标转换 一、前言   在场景中,不管是二维还好还是三维也罢,只要涉及到空间概念都会提到坐标,坐标是让我们理解位置的一个非常有效的东西。有了坐标,我们能很快的确定位...

osc_nnbkiac5
2019/07/25
8
0
PIE SDK屏幕坐标和地图坐标转换

功能简介 屏幕坐标和地图坐标转换,就是字面意思,将电脑屏幕的坐标转换为带有空间信息的地图坐标,主要运用PIE SDK地图控件的ToMapPoint()方法,而地图坐标转换为设备坐标(屏幕),用的是F...

osc_f48vvrg3
2019/01/09
2
0
PIE SDK Geometry的坐标转换

基于SpatialReference对象的坐标转换 1.1 示例简介 Geometry类是所有几何形体对象的父类,它是一个抽象类,IGeometry接口定义了所有的几何对象都有的方法和属性。 下面介绍基于Geometry对象的...

osc_avpo3z9q
2019/01/17
2
0
PCB Genesis原点坐标转换关系

一.Genesis原点坐标转换关系: 1.读取Genesis坐标转换: UI界面坐标 = 文件坐标 - 偏移值 2.写入Genesis坐标转换: 文件坐标 = UI界面坐标 + 偏移值 3.为了说清楚转换关系,这里以读取Genes...

osc_vxlxmpgv
2018/08/14
0
0
iOS开发中的火星坐标系及各种坐标系转换算法

其原理是这样的:保密局开发了一个系统,能将实际的坐标转换成虚拟的坐标。所有在中国销售的数字地图必须使用这个系统进行坐标转换之后方可上市。这是生产环节,这种电子地图被称为火星地图。...

刀客445
2016/02/23
1.7K
1

没有更多内容

加载失败,请刷新页面

加载更多

IDEA安装 IntelliJ IDEA 下载安装与破解教程

IntelliJ IDEA 下载安装与破解教程 一、首先到IDEA官网下载正版的IDEA 网址:https://www.jetbrains.com/idea/download/#section=windows 请直接用下面的链接下载 上面网址加载慢的话可以用这...

osc_u9wft6hh
28分钟前
20
0
mysql执行过程以及顺序

前言:mysql在我们的开发中基本每天都要面对的,作为开发中的数据的来源,mysql承担者存储数据和读写数据的职责。因为学习和了解mysql是至关重要的,那么当我们在客户端发起一个sql到出现详细的查...

osc_r2jpynxi
29分钟前
16
0
去阿里,是不可能的,这辈子都不可能的

前几天,又有一个朋友邀请我去阿里,然后,,,,,我不假思索地就拒绝了。 因为说实话,阿里的修福报文化不适合我——不小心又装逼了。主要是感觉自己的学历配不上进大厂,就一个大专而已。...

osc_7nzqlmki
31分钟前
15
0
IDEA安装 IntelliJ IDEA 下载安装与破解教程

IntelliJ IDEA 下载安装与破解教程 一、首先到IDEA官网下载正版的IDEA 网址:https://www.jetbrains.com/idea/download/#section=windows 请直接用下面的链接下载 上面网址加载慢的话可以用这...

osc_wy8nhxhn
32分钟前
15
0
如何使用Lock?Lock 与synchronized 区别是什么?

Lock 就像同步块一样, java.util.concurrent.locks.Lock是线程同步机制。但是,锁比同步块更灵活,更复杂。由于Lock是接口,因此需要使用其实现之一在应用程序中使用Lock。 ReentrantLock是...

极客编程111
32分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部