使用Qt/C++实现WGS84、高德GCJ-02、百度BD-09坐标系间相互转化

news2024/11/16 15:29:19

        在做地图相关开发时候,绕不开不同坐标系间的转化,因此我根据查阅相关资料后将不同坐标系间的转换封装到一个GeoTranslate类中,该类转换函数不仅支持Qt/C++调用,同时可在QML中直接调用,配合上QML/Map很方便,我将该类做了个Demo,方便使用者使用,效果如图:

在QML的地图Map中使用高德的路径规划的效果:

使用方法为将 GeoTranslate类添加到工程中,调用转换函数即可

geotranslate.h:

#ifndef GEOTRANSLATE_H
#define GEOTRANSLATE_H

#include <QtMath>
#include <QObject>
#include <QGeoCoordinate>

class GeoTranslate : public QObject
{
public:
    explicit GeoTranslate(QObject *parent = nullptr);

    static constexpr double pi = 3.14159265358979323846;
    static constexpr double a = 6378245.0;
    static constexpr double ee = 0.00669342162296594323;

    Q_INVOKABLE static QGeoCoordinate wgs84ToGcj02(QGeoCoordinate coordinate);
    Q_INVOKABLE static QGeoCoordinate gcj02ToWgs84(QGeoCoordinate coordinate);
    Q_INVOKABLE static QGeoCoordinate wgs84ToGcj02(double lat,double lon);
    Q_INVOKABLE static QGeoCoordinate gcj02ToWgs84(double lat,double lon);

    Q_INVOKABLE static QGeoCoordinate gcj02ToBd09(QGeoCoordinate coordinate);
    Q_INVOKABLE static QGeoCoordinate bd09ToGcj02(QGeoCoordinate coordinate);
    Q_INVOKABLE static QGeoCoordinate gcj02ToBd09(double gg_lat, double gg_lon);
    Q_INVOKABLE static QGeoCoordinate bd09ToGcj02(double bd_lat,double bd_lon);

private:
    static double transformLat(double x,double y);
    static double transformLon(double x,double y);
    static bool outOfChina(double lat,double lon);
    static QGeoCoordinate transform(double lat,double lon);

};

#endif // GEOTRANSLATE_H

 调用方法:

void Widget::on_pushButton_1_clicked()
{
    QGeoCoordinate wgs(ui->lineEditLa_1->text().toDouble(),ui->lineEditLo_1->text().toDouble());
    QGeoCoordinate gcj02 = GeoTranslate::wgs84ToGcj02(wgs);
    ui->lineEditLa_2->setText(QString::number(gcj02.latitude()));
    ui->lineEditLo_2->setText(QString::number(gcj02.longitude()));
}

void Widget::on_pushButton_2_clicked()
{
    QGeoCoordinate gcj02(ui->lineEditLa_3->text().toDouble(),ui->lineEditLo_3->text().toDouble());
    QGeoCoordinate wgs = GeoTranslate::gcj02ToWgs84(gcj02);
    ui->lineEditLa_4->setText(QString::number(wgs.latitude()));
    ui->lineEditLo_4->setText(QString::number(wgs.longitude()));
}

void Widget::on_pushButton_3_clicked()
{
    QGeoCoordinate gcj02(ui->lineEditLa_5->text().toDouble(),ui->lineEditLo_5->text().toDouble());
    QGeoCoordinate bd09 = GeoTranslate::gcj02ToBd09(gcj02);
    ui->lineEditLa_6->setText(QString::number(bd09.latitude()));
    ui->lineEditLo_6->setText(QString::number(bd09.longitude()));
}

void Widget::on_pushButton_4_clicked()
{
    QGeoCoordinate bd09(ui->lineEditLa_7->text().toDouble(),ui->lineEditLo_7->text().toDouble());
    QGeoCoordinate gcj02 = GeoTranslate::bd09ToGcj02(bd09);
    ui->lineEditLa_8->setText(QString::number(gcj02.latitude()));
    ui->lineEditLo_8->setText(QString::number(gcj02.longitude()));
}

 完整Demo(包含geotranslate.h  /  geotranslate.cpp)我上传到CSDN库中,自行下载即可运行:

https://download.csdn.net/download/zjgo007/87966450

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大咖培训讲座|高性能计算专场 认识真正的高性能计算,探究如何成为高性能计算工程师 ...

猿代码科技高性能计算讲座原文——OpenBLAS创始人无保留分享 我们如何成为一个高性能计算的工程师&#xff0c;或者这种性能优化的这一部分的软件工程师。 我其实想了一下&#xff0c;这一部分的入门的基础其实没那么难。 就是更主要的话&#xff0c;我还是在于兴趣和自驱力…

idea自定义类注释以及方法注释,无警告

背景 idea&#xff1a;IntelliJ IDEA 2023.1.3 (Ultimate Edition) 效果 类 方法 正式&#xff1a;类 设置 代码 /** * author: 你的名字* date: ${DATE} on ${TIME}* desc: $NAME*/注意&#xff0c;请全部复制&#xff0c;空行也要&#xff0c;看设置截图选中部分 …

Jenkins定时执行JMeter脚本并查看测试报告实现

【整体思路】 通过Tomcat启动Jenkins服务&#xff0c;在Jenkins中创建自动化测试项目&#xff0c;项目配置中配置构建时执行的动作&#xff0c;配置构建后动作展示报告 【涉及软件及版本信息】 Tomcat版本&#xff1a;9.0.76 Jenkins版本&#xff1a;2.332.3&#xff08;注…

ES批量上传数据 - Python操作ES

代码 # -*- coding: utf-8 -*- # Author : markadcimport randomfrom elasticsearch import Elasticsearch, helpersurl http://localhost:9200/ client Elasticsearch(url) index testsome [] for i in range(1, 10001):docu {uid: i, age: random.randint(1, 100)} …

ChatGPT中的Token:了解聊天模型的基本单位

✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社区 &#x1f4d9; 专栏地址&#xff1a;AI大模型 ChatGPT中的Token是什么&#xff1f; 在ChatGPT…

23-BOM和常见的BOM对象

一、是什么 BOM (Browser Object Model)&#xff0c;浏览器对象模型&#xff0c;提供了独立于内容与浏览器窗口进行交互的对象 作用&#xff1a;跟浏览器做一些交互效果&#xff0c; 如何进行页面的后退&#xff0c;前进&#xff0c;刷新&#xff0c;浏览器的窗口发生变化&am…

ECS云服务器U实例评测,可以免费体验哦

目录 一、ECS云服务器U实例介绍 话题一、U实例使用体感如何&#xff0c;是否和主售型实例有区别&#xff0c;具体体现在哪里&#xff1f; 话题二、结合相关数据材料&#xff0c;对您感兴趣的场景 话题三、使用u实例是否为您的云上业务或者测试项目提供了帮助支持&#xff1…

Axure教程——表格内部修改

本文介绍的时用Axue中的中继器制作表内修改效果 效果 预览地址&#xff1a;https://w97xns.axshare.com 功能 点击某条数据的”编辑“按钮可以修改此条数据的每项数据&#xff0c;”编辑“和”删除“按钮变为”保存“和”取消‘按钮 制作 需要的元件&#xff1a;矩形、中继…

asp.net MVC

文件目录 页面 HTML与Script的联系 HTML元素通过调用脚本中的function来触发前端的动作要进行的后端逻辑操作 Script中通过选择器$(“#str”)来改变前端HTML的显示数据 Script中有两种类型的函数模式 $(function(){ … }) &#xff1a;window.onload时调用。function btnRese…

​Chamilo 学习管理软件存在命令执行漏洞(CVE-2023-34960)

Chamilo 学习管理软件存在命令执行漏洞&#xff08;CVE-2023-34960&#xff09; 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff…

Python基础语法笔记整理(黑马8天学会python笔记)

Python 第一章、基础语法 01.字面量(写在代码中的固定的值) 02.注释 # 单行注释 """ 多行注释 """03.变量 变量无类型&#xff0c;数据有类型 变量名 变量值04.数据类型 数据类型&#xff1a; type()05.类型转换 字符串转数字&#xff…

【unity实战】制作一个类帝国时代、红警——RTS战略性游戏

文章目录 先来看看实现的最终效果什么是RTS游戏一、两种方法实现相机的移动旋转缩放以及拖拽功能前言准备第一种办法1. 移动1.1 代码实现&#xff0c;里面都写了详细的中文注释&#xff0c;就不过多解释了1.2 效果&#xff1a;1.3 问题&#xff1a; 2. 缩放2.1 代码 3. 限制范围…

Linux内核TCP参数调优全面解读

Linux内核TCP参数调优全面解读 前言 TCP 性能的提升不仅考察 TCP 的理论知识&#xff0c;还考察了对于操心系统提供的内核参数的理解与应用。 TCP 协议是由操作系统实现&#xff0c;所以操作系统提供了不少调节 TCP 的参数。 如何正确有效的使用这些参数&#xff0c;来提高 T…

微前端框架MicroApp入门学习笔记(一)

1、简介 微前端是一种架构风格&#xff0c;旨在通过将前端应用程序拆分为更小、更可管理的部分&#xff0c;使多个团队能够独立开发、部署和维护这些部分&#xff0c;从而实现前端的可扩展性和可维护性。   MicroApp框架是京东出品的一种用于构建微前端架构的开源框架&#x…

Linux系统开机启动详细流程

目录 Linux系统开机启动流程为什么要了解系统开机启动流程关机的命令开机流程图:开机自检&#xff08;Power-On Self-Test&#xff0c;POST&#xff09;BIOSROM和RAMBIOS的介绍CMOS的介绍&#xff1a;BIOS和CMOS的区别和联系如何进入BIOS系统&#xff1f;如何改BIOS的顺序以及为…

vue js实现表格行拖拽

效果图&#xff1a; <a-table :dataSource"dataSource" :columns"columns" :pagination"false"><template #bodyCell"{ column, record }"><template v-if"column.key td"><div style"cursor: p…

|DataDirectory| 解决Web.config中数据库连接的相对路径问题

1、业务背景 维护老系统代码&#xff0c;Web.config中数据库字符串连接的相对路径的处理 2、核心代码如下 <connectionStrings><add name"connString" connectionString"ProviderMicrosoft.Jet.OLEDB.4.0;Data Source|DataDirectory|\FnDB.mdb"…

【Java】Java中的String类

文章目录 一、认识 String 类二、String 类的常用方法2.1 构造方法2.2 String 类对象之间的比较2.3 字符串查找2.4 字符串的转换2.5 字符串替换2.6 字符串拆分2.7 字符串截取2.8 字符串常量池2.9 字符串的不可变性 三、StringBuilder 和 StringBuffer3.1 StringBuilder3.2 Stri…

robotframework接口自动化测试详解

我们在使用rebotframework的时候&#xff0c;不只是能做UI自动化&#xff0c;接口自动化也是可以的。 那么这里就整理一下rebotframework_接口自动化的应用&#xff1a; 一、编写接口测试 由上图可知&#xff0c;该接口如下信息&#xff1a; 接口功能描述&#xff1a;预诊模…

Spring6快速入门

Spring6快速入门 各工具版本要求&#xff1a; JDK:Java17 Maven:3.6 Spring:6.0.9 简介 Spring是一个控制反转(IOC)&#xff0c;面向切面(AOP)编程的轻量级框架。 2002年&#xff0c;Rod Johnson首次推出Spring框架的雏形&#xff0c;interface21(https://interface21.io/) 200…