在做两个坐标系转换的时候,谷歌好长时间C++相关的代码资料,查找到两个转换的代码,但是结果都不对,故记录本次的坐标转换。

测试结果:

QT源码:

WGS84ToENU.h#ifndef WGS84TOENU_H
#define WGS84TOENU_H#include <QMainWindow>
#include<QDateTime>class WGS84ToENU
{
public:WGS84ToENU();double* wgs84ToEcef(double lat, double lon, double h);double* ecefToEnu(double x, double y, double z, double lat, double lng, double height);double DMS_RAD(double DMS);};#endif // WGS84TOENU_H
WGS84ToENU.cpp#include "wgs84toenu.h"
#include<QtMath>
#include<QDebug>
#define a   6378137
#define b   6356752.3142//b为椭球的短半轴:a=6356.7523141km
#define RAD 57.295779 //一弧度约为57.295779°
WGS84ToENU::WGS84ToENU()
{}
double WGS84ToENU::DMS_RAD(double DMS)
{double Rad=0.00;Rad=DMS/RAD;qDebug()<<"Rad"<<QString::number(Rad,'f',9);return Rad;
}
double* WGS84ToENU::wgs84ToEcef(double lat, double lon, double h)
{double f = (a - b) / a;double e_sq = f * (2 - f);double lamb = this->DMS_RAD(lat);double phi = this->DMS_RAD(lon);double s = sin(lamb);double N = a / sqrt(1 - e_sq * s * s);double sin_lambda = sin(lamb);double cos_lambda = cos(lamb);double sin_phi = sin(phi);double cos_phi = cos(phi);double x = (h + N) * cos_lambda * cos_phi;double y = (h + N) * cos_lambda * sin_phi;double z = (h + (1 - e_sq) * N) * sin_lambda;double *returnArr=new double[3];returnArr[0]=x;returnArr[1]=y;returnArr[2]=z;return returnArr;
}double* WGS84ToENU::ecefToEnu(double x, double y, double z, double lat, double lng, double height){double f = (a - b) / a;double e_sq = f * (2 - f);double lamb = this->DMS_RAD(lat);double phi = this->DMS_RAD(lng);double s =sin(lamb);double N = a / sqrt(1 - e_sq * s * s);double sin_lambda = sin(lamb);double cos_lambda = cos(lamb);double sin_phi = sin(phi);double cos_phi = cos(phi);double x0 = (height + N) * cos_lambda * cos_phi;double y0 = (height + N) * cos_lambda * sin_phi;double z0 = (height + (1 - e_sq) * N) * sin_lambda;double xd = x - x0;double yd = y - y0;double zd = z - z0;double t = -cos_phi * xd - sin_phi * yd;double xEast = -sin_phi * xd + cos_phi * yd;double yNorth = t * sin_lambda + cos_lambda * zd;double zUp = cos_lambda * cos_phi * xd + cos_lambda * sin_phi * yd + sin_lambda * zd;double *returnArrAndNEU=new double[3];returnArrAndNEU[0]=xEast;returnArrAndNEU[1]=yNorth;returnArrAndNEU[2]=zUp;qDebug()<<"xEast"<<QString::number(xEast,'f',9);qDebug()<<"yNorth"<<QString::number(yNorth,'f',9);qDebug()<<"zUp"<<QString::number(zUp,'f',9);return returnArrAndNEU;}

QT测试代码(主函数代码):

 WGS84ToENU *wgs84ToEnu=new WGS84ToENU();double* arr1 = wgs84ToEnu->wgs84ToEcef(31.48999455, 121.9440825, 10.800000000);//此处经纬度是需要比对的偏移经纬度qDebug()<<"arr1[0]"<<QString::number(arr1[0],'f',9);qDebug()<<"arr1[1]"<<QString::number(arr1[1],'f',9);qDebug()<<"arr1[2]"<<QString::number(arr1[2],'f',9);double* xyz=wgs84ToEnu->ecefToEnu(arr1[0],arr1[1], arr1[2],31.489996667, 121.94408167,  12.700000000);qDebug()<<"result1x"<<QString::number(xyz[0],'f',9);qDebug()<<"result1y"<<QString::number(xyz[1],'f',9);qDebug()<<"result1z"<<QString::number(xyz[2],'f',9);

JAVA源码:

public class testEcef {public static double[] wgs84ToEcef(double lat, double lon, double h) {double a = 6378137;double b = 6356752.3142;double f = (a - b) / a;double e_sq = f * (2 - f);double lamb = Math.toRadians(lat);double phi = Math.toRadians(lon);System.out.println("lamb"+lamb);System.out.println("phi"+phi);double s = Math.sin(lamb);double N = a / Math.sqrt(1 - e_sq * s * s);double sin_lambda = Math.sin(lamb);double cos_lambda = Math.cos(lamb);double sin_phi = Math.sin(phi);double cos_phi = Math.cos(phi);double x = (h + N) * cos_lambda * cos_phi;double y = (h + N) * cos_lambda * sin_phi;double z = (h + (1 - e_sq) * N) * sin_lambda;return new double[]{x,y,z};}public static double[] ecefToEnu(double x, double y, double z, double lat, double lng, double height) {double a = 6378137;double b = 6356752.3142;double f = (a - b) / a;double e_sq = f * (2 - f);double lamb = Math.toRadians(lat);double phi = Math.toRadians(lng);System.out.println("lamb2"+lamb);System.out.println("phi2"+phi);double s = Math.sin(lamb);double N = a / Math.sqrt(1 - e_sq * s * s);double sin_lambda = Math.sin(lamb);double cos_lambda = Math.cos(lamb);double sin_phi = Math.sin(phi);double cos_phi = Math.cos(phi);double x0 = (height + N) * cos_lambda * cos_phi;double y0 = (height + N) * cos_lambda * sin_phi;double z0 = (height + (1 - e_sq) * N) * sin_lambda;double xd = x - x0;double yd = y - y0;double zd = z - z0;double t = -cos_phi * xd - sin_phi * yd;double xEast = -sin_phi * xd + cos_phi * yd;double yNorth = t * sin_lambda + cos_lambda * zd;double zUp = cos_lambda * cos_phi * xd + cos_lambda * sin_phi * yd + sin_lambda * zd;return new double[] { xEast, yNorth, zUp };}public static void main(String[] args) {// TODO Auto-generated method stub//gpggaH "10.800000000"10.8//gpslat "31.494067233"31.48999455//gpslon "121.947391683"121.9440825//gpggaH2 "12.700000000"12.7//gpslat2 "31.489996667"31.489996667//gpslon2 "121.947391667"121.94408167double[] arr1 = wgs84ToEcef(31.48999455, 121.9440825, 10.800000000);//此处经纬度是需要比对的偏移经纬度double[] xyz=ecefToEnu(arr1[0],arr1[1], arr1[2],31.489996667, 121.94408167,  12.700000000);//此处经纬度是站点经纬度System.out.println("xyz[0]"+xyz[0]);System.out.println("xyz[1]"+xyz[1]);System.out.println("xyz[2]"+xyz[2]);}}

经过和MATLAB相关数据核对,结果完全一样。所以代码可以放心的尝试,如有问题请留言讨论

大地坐标系到站心坐标系(ENU)坐标转换(提供QT和JAVA源码)相关推荐

  1. FPGA驱动FT601实现USB3.0相机 OV5640视频采集 提供2套工程源码和QT上位机源码

    目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.vivado工程1--彩条视 ...

  2. FPGA驱动FT601实现USB3.0相机HDMI视频采集 提供工程源码和QT上位机源码

    目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.详细设计方案 5.vivad ...

  3. simulink模块,提供xpctarget下驱动源码

    simulink模块,提供xpctarget下驱动源码 :77999632700099250风中的蜗牛

  4. Qt股票软件企业级源码

    Qt股票软件企业级源码

  5. Qt编写输入法源码V2019,未采用Qt系统层输入法框架,独创输入切换机制

    Qt编写输入法源码V2019 未采用Qt系统层输入法框架,独创输入切换机制. 纯QWidget编写,支持任何目标平台(亲测windows.linux.嵌入式linux等),支持任意Qt版本(亲测Qt4 ...

  6. 源码交流网,提供50套商业源码免费下载

    源码交流网,提供50套商业源码免费下载 源码交流网(www.100oa.com).改版后重出江湖,50套精品商业源码免费下载,您要做的,就是把本广告在各大技术论坛上发10个同样的广告,好消息让更多的人 ...

  7. 国产系统 统信UOS20 飞腾CPU  QT Creator4.11 源码编译

    国产系统 统信UOS20 飞腾CPU  QT Creator4.11 源码编译 资源下载 https://mirrors.tuna.tsinghua.edu.cn/qt/development_rel ...

  8. 国产系统 统信UOS20 飞腾CPU QT Creator4.14 源码编译

    国产系统 统信UOS20 飞腾CPU  QT Creator4.14 源码编译 系统信息 安装qt5.14 手动编译参考[详细参考另外一篇qt5.14编译] 也可以直接下载已经编译了的[国产系统 统信 ...

  9. ictclas4j java_ictclas4j 中科院中文分词系统完成的java源码,能很好的实现 的 ,为文本挖掘提供基础。 Develop 238万源代码下载- www.pudn.com...

    文件名称: ictclas4j下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 6617 KB 上传时间: 2013-12-06 下载次数: 4 提 供 者: 黄倩 ...

最新文章

  1. 大型网站系统架构系列:分布式消息队列(二)
  2. Java知多少(中)
  3. python hook技术,python hook监听事件详解
  4. java 之绘图技术
  5. Docker实战:Docker安装部署RabbitMQ
  6. TCP三次握手和四次挥手过程
  7. Shell 字符串处理、获取文件名和后缀名
  8. 合格PHP工程师的知识结构
  9. java new 关键字到底做了什么?
  10. MATLAB自学教程一1.显示图像图像基本信息
  11. 巧用DOS命令修复U盘文件错误
  12. 利用谷歌浏览器模拟网速慢的情况
  13. 树莓派 android10,树莓派4使用AndroidTV 10系统
  14. Android相机拍照后,对照片模糊的处理;对照片旋转90度的处理
  15. 如何简单又好看地美化你的Ubuntu界面
  16. java lr0分析,LR0分析器实验报告.doc
  17. 01、本地微信服务器测试环境
  18. 口红会染唇是什么意思_唇釉染唇是什么意思
  19. spring报错parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]
  20. nodejs实现阿里云短信验证码

热门文章

  1. Linux /proc 你懂多少? 详情来了~~~
  2. 3-2 高速公路超速处罚
  3. chrome dev tools 使用大全
  4. C#获取指定文件夹下所有文件夹名称
  5. 洪强宁谈豆瓣网技术架构
  6. 豆瓣电影公共API (亲测有效)
  7. 财付通基础支付平台高可用保障体系演进之路
  8. 实战:获取33种生活指数
  9. 拨开浮云见月明 详解手机双核处理器
  10. 【互联网生存法则】互联网打工人的一天