大地坐标系到站心坐标系(ENU)坐标转换(提供QT和JAVA源码)
在做两个坐标系转换的时候,谷歌好长时间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源码)相关推荐
- FPGA驱动FT601实现USB3.0相机 OV5640视频采集 提供2套工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.vivado工程1--彩条视 ...
- FPGA驱动FT601实现USB3.0相机HDMI视频采集 提供工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.详细设计方案 5.vivad ...
- simulink模块,提供xpctarget下驱动源码
simulink模块,提供xpctarget下驱动源码 :77999632700099250风中的蜗牛
- Qt股票软件企业级源码
Qt股票软件企业级源码
- Qt编写输入法源码V2019,未采用Qt系统层输入法框架,独创输入切换机制
Qt编写输入法源码V2019 未采用Qt系统层输入法框架,独创输入切换机制. 纯QWidget编写,支持任何目标平台(亲测windows.linux.嵌入式linux等),支持任意Qt版本(亲测Qt4 ...
- 源码交流网,提供50套商业源码免费下载
源码交流网,提供50套商业源码免费下载 源码交流网(www.100oa.com).改版后重出江湖,50套精品商业源码免费下载,您要做的,就是把本广告在各大技术论坛上发10个同样的广告,好消息让更多的人 ...
- 国产系统 统信UOS20 飞腾CPU QT Creator4.11 源码编译
国产系统 统信UOS20 飞腾CPU QT Creator4.11 源码编译 资源下载 https://mirrors.tuna.tsinghua.edu.cn/qt/development_rel ...
- 国产系统 统信UOS20 飞腾CPU QT Creator4.14 源码编译
国产系统 统信UOS20 飞腾CPU QT Creator4.14 源码编译 系统信息 安装qt5.14 手动编译参考[详细参考另外一篇qt5.14编译] 也可以直接下载已经编译了的[国产系统 统信 ...
- ictclas4j java_ictclas4j 中科院中文分词系统完成的java源码,能很好的实现 的 ,为文本挖掘提供基础。 Develop 238万源代码下载- www.pudn.com...
文件名称: ictclas4j下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 6617 KB 上传时间: 2013-12-06 下载次数: 4 提 供 者: 黄倩 ...
最新文章
- 大型网站系统架构系列:分布式消息队列(二)
- Java知多少(中)
- python hook技术,python hook监听事件详解
- java 之绘图技术
- Docker实战:Docker安装部署RabbitMQ
- TCP三次握手和四次挥手过程
- Shell 字符串处理、获取文件名和后缀名
- 合格PHP工程师的知识结构
- java new 关键字到底做了什么?
- MATLAB自学教程一1.显示图像图像基本信息
- 巧用DOS命令修复U盘文件错误
- 利用谷歌浏览器模拟网速慢的情况
- 树莓派 android10,树莓派4使用AndroidTV 10系统
- Android相机拍照后,对照片模糊的处理;对照片旋转90度的处理
- 如何简单又好看地美化你的Ubuntu界面
- java lr0分析,LR0分析器实验报告.doc
- 01、本地微信服务器测试环境
- 口红会染唇是什么意思_唇釉染唇是什么意思
- spring报错parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]
- nodejs实现阿里云短信验证码