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

 更新时间:2023年07月04日 11:38:24   作者:喵喵叫的猴  
这篇文章主要为大家详细介绍了如何使用Qt实现WGS84、高德GCJ-02与百度BD-09坐标系间相互转化,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

在做地图相关开发时候,绕不开不同坐标系间的转化,因此我根据查阅相关资料后将不同坐标系间的转换封装到一个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()));
}
 

以上就是使用Qt/C++实现WGS84,高德GCJ-02与百度BD-09坐标系间相互转化的详细内容,更多关于Qt坐标系转化的资料请关注脚本之家其它相关文章!

相关文章

  • C++类与对象深入之引用与内联函数与auto关键字及for循环详解

    C++类与对象深入之引用与内联函数与auto关键字及for循环详解

    朋友们好,这篇播客我们继续C++的初阶学习,现在对一些C++的入门知识做了些总结,整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步
    2022-06-06
  • 详解C++虚函数中多态性的实现原理

    详解C++虚函数中多态性的实现原理

    C++是一种面向对象的编程语言,在C++中,虚函数是实现多态性的关键。本文就来探讨一下C++虚函数中多态性的实现原理及其在面向对象编程中的应用吧
    2023-05-05
  • c++10进制转换为任意2-16进制数字的实例

    c++10进制转换为任意2-16进制数字的实例

    下面小编就为大家带来一篇c++10进制转换为任意2-16进制数字的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 利用C++如何覆盖或删除指定位置的文件内容

    利用C++如何覆盖或删除指定位置的文件内容

    这篇文章主要给大家介绍了关于利用C++如何覆盖或删除指定位置的文件内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • C语言三种方法解决轮转数组问题

    C语言三种方法解决轮转数组问题

    这篇文章主要给大家讲解轮转数组的问题,一个问题不局限于一种解法,希望你看了本文的解决方法以后可以举一反三自己编写,这样你的技术水平会有质的提高
    2022-04-04
  • C语言深入探究动态规划之线性DP

    C语言深入探究动态规划之线性DP

    线性动态规划,是较常见的一类动态规划问题,其是在线性结构上进行状态转移,这类问题不像背包问题、区间DP等有固定的模板,线性动态规划的目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目的是求目标函数的最大值或最小值
    2022-04-04
  • C++实现defer声明方法详解

    C++实现defer声明方法详解

    这篇文章主要介绍了C++实现defer声明,在和朋友交谈时候,无意间了解到Go语言的defer,发现挺有意思的。和智能指针类似,当出了作用域后,被defer修饰的操作才会执行
    2022-11-11
  • C语言数组a和&a的区别讲解

    C语言数组a和&a的区别讲解

    今天小编就为大家分享一篇关于C语言数组a和&a的区别讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C语言快速幂取模算法小结

    C语言快速幂取模算法小结

    这篇文章主要介绍了C语言快速幂取模算法,包括了算法的分析与改进,是很多程序设计竞赛中常见的算法,需要的朋友可以参考下
    2014-09-09
  • opencv提取水平与垂直线条

    opencv提取水平与垂直线条

    这篇文章主要为大家详细介绍了opencv提取水平与垂直线条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07

最新评论