文章目录

  • 前言
  • 一、分析Qt location 源码中 esri模块源码
  • 二、创建自己的插件,显示天地图
  • github链接:
  • 总结

前言

本章节讲如何制作自己的地图插件,我们以制作天地图插件为例,做一个简单的天地图插件,当然也可以做google,bing,高德,百度等,思路都一样
另外说明一点,截止今日(2021-07-25)Qt6.2版本,Qt 6 暂时不支持QtLocation 模块,原因好像是因为Qtlocation 是基于opengl做的,具体可在官方找资料…Qt官方可能会在后期加上Qtlocation 模块,有使用Qtlocation的同学可以关注一下这块的更新…目前在Qt5是完全可以正常使用的…

一、分析Qt location 源码中 esri模块源码


geoserviceproviderfactory_esri.h 文件,QtLocation 入口为此文件

QT_BEGIN_NAMESPACEclass GeoServiceProviderFactoryEsri: public QObject, public QGeoServiceProviderFactory
{Q_OBJECTQ_INTERFACES(QGeoServiceProviderFactory)Q_PLUGIN_METADATA(IID "org.qt-project.qt.geoservice.serviceproviderfactory/5.0"FILE "esri_plugin.json")public:QGeoCodingManagerEngine *createGeocodingManagerEngine(const QVariantMap &parameters,QGeoServiceProvider::Error *error,QString *errorString) const override;QGeoMappingManagerEngine *createMappingManagerEngine(const QVariantMap &parameters,QGeoServiceProvider::Error *error,QString *errorString) const override;QGeoRoutingManagerEngine *createRoutingManagerEngine(const QVariantMap &parameters,QGeoServiceProvider::Error *error,QString *errorString) const override;QPlaceManagerEngine *createPlaceManagerEngine(const QVariantMap &parameters,QGeoServiceProvider::Error *error,QString *errorString) const override;
};QT_END_NAMESPACE#endif // GEOSERVICEPROVIDERFACTORYESRI_H
#include "geoserviceproviderfactory_esri.h"
#include "geotiledmappingmanagerengine_esri.h"
#include "geocodingmanagerengine_esri.h"
#include "georoutingmanagerengine_esri.h"
#include "placemanagerengine_esri.h"#include <QtLocation/private/qgeotiledmappingmanagerengine_p.h>QT_BEGIN_NAMESPACEQGeoCodingManagerEngine *GeoServiceProviderFactoryEsri::createGeocodingManagerEngine(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
{return new GeoCodingManagerEngineEsri(parameters, error, errorString);
}QGeoMappingManagerEngine *GeoServiceProviderFactoryEsri::createMappingManagerEngine(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
{return new GeoTiledMappingManagerEngineEsri(parameters, error, errorString);
}QGeoRoutingManagerEngine *GeoServiceProviderFactoryEsri::createRoutingManagerEngine(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
{const QString token = parameters.value(QStringLiteral("esri.token")).toString();if (!token.isEmpty()) {return new GeoRoutingManagerEngineEsri(parameters, error, errorString);} else {*error = QGeoServiceProvider::MissingRequiredParameterError;*errorString = tr("Esri plugin requires a 'esri.token' parameter.\n""Please visit https://developers.arcgis.com/authentication/accessing-arcgis-online-services/");return 0;}
}QPlaceManagerEngine *GeoServiceProviderFactoryEsri::createPlaceManagerEngine(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
{return new PlaceManagerEngineEsri(parameters, error, errorString);
}QT_END_NAMESPACE

此类是重写 QGeoServiceProviderFactory 工厂类,以实现地图创建,地理信息编码,路由等4个功能,我这里只关注地图创建createMappingManagerEngine,如有需要其它的,可依源码自己行创建

二、创建自己的插件,显示天地图

这里不再贴代码了,源码中关键位置有注释,说下调用关系
TiQeoServiceProviderFactory —> TiQGeoTiledMappingManagerEngine ->> TiGeoTileFetcher
------------------------------------------------------------------------------------------------->>TiQGeoFileTileCache

  • TiQeoServiceProviderFactory :为插件类,入口
  • TiQGeoTiledMappingManagerEngine :地图tile 瓦片的管理类
  • TiGeoTileFetcher : 从网络获取tile的类
  • TiQGeoFileTileCache: 缓冲到本地文件的类,官方默认的是 QGeoFileTileCache,此会tile以png的形式写入到本地磁盘,默认在C盘目录,我重载重写里面的 insert() 和 get() 函数,写入到数据库

另外有个类TiMapEngine 为单例类,里面有各地图服务的url获取方式,getUrlEngine()及数据库线程getSqlThread()
其中TiMapUrlEngine 类可添加新地图服务,用于支持其它地图,注意现在天地图里面的key是我自己申请的key,每天只有1W张图,自己拿到工作请到天地图官方申请帐号,更换key 位置: titianditumapprovider.cpp

  • 支持天地图影像图和影像标注信息,且二者是可以叠加的,叠加方式参见:https://doc.qt.io/qt-5/location-plugin-itemsoverlay.html
  • 支持sql数据库存储
  • 只实现了地图的显示,未做地图的搜索,路径等功能
  • Qt5.15.0版本上运行,理论上5.12版本后都可以运行,印象中从5.11后,Qtlocation里就没功能变动?Qt 6目前不支持,主要是官方说Qt6不支持Qtlocation,看后续6.3版本后会不会添加进来

如果要实现更多功能,参考本系列文章的第一章节里的参考项目

github链接:

https://github.com/tianxiaofan/QtLocationTianditu

总结

遇到问题需要多查官方文档和官方案例,当然github也不错,哈哈

2021-07-25 Qt Location开发系列教程 (五)相关推荐

  1. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    C#微信公众号开发系列教程五(接收事件推送与消息排重) 原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续 ...

  2. 自动化编辑器零代码手机RPA脚本开发系列教程五

    自动化编辑器 基础知识    条件 官网下载地址自动化编辑器 才发现之前讲过条件了 这次再次重新讲一次,就当我忘了之前讲的是啥了 条件是自动化编辑的基本单元,也是自动化编辑器最核心的东西,所以讲两次也 ...

  3. C#微信公众号开发系列教程二(新手接入指南)

    此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教 ...

  4. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  5. 2021年最新最全Flink系列教程_Flink快速入门(概述,安装部署)(一)(JianYi收藏)

    文章目录 引言 相关教程直通车: day01_Flink概述.安装部署和入门案例 今日目标 Flink概述 什么是批处理和流处理 为什么需要流计算 Flink的发展史 Flink的官方介绍 Flink ...

  6. HTML5游戏开发系列教程5(译)

    原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...

  7. 树莓派开发系列教程10——树莓派spi液晶屏支持(fbtft)

        树莓派官方支持av及HDMI输出,板子上预留了一个csi接口的液晶显示屏,但是一直没有相应的模组出现.在很多应用场合我们需要一些小型的液晶屏显示一些基本的信息,所以小屏驱动很是必要. 在git ...

  8. 植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(上)

    植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(上) 11.E语言第一课(基址+偏移的读写) 12.E语言第二课(字节集的写入) 13.E语言第三课(快捷键的使用) 14.E语言第四课(调 ...

  9. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

最新文章

  1. sublime几个插件
  2. 读再多书都没觉得自己变强?试试我这“5年陈”的方法
  3. Java进阶之对象克隆(复制)
  4. arcgis几何修复有作用吗_修复损坏的 shapefile
  5. source:读取文件 “/etc/profile” 时发生错误解决办法
  6. (88)FPGA面试题-使用Verilog HDL编写二进制转格雷码
  7. GTK中 ToolBar详细说明
  8. 你真的把数据库事务搞懂了吗,有图有真相,图文并茂!
  9. 凤凰刷机,强刷 Flashing finalization failed
  10. 昂达vi40精英版刷Linux,昂达vi40精英版论坛_昂达vi40双核版刷机包_昂达平板vi40精英版...
  11. 学生:无效文件.dsn问题
  12. spring boot中mybatisPlus代码生成器源码
  13. jquery禁止鼠标右键 原生js禁止鼠标右键
  14. GO 打开WINDOWS的默认浏览器
  15. 知云文献翻译打不开_【小虎聊干货】八大翻译软件大揭秘,告诉你科研翻译的正确打开方式...
  16. 一键构建云上高可用蛋白质结构预测平台
  17. 平衡二叉树 构造方法RR RL LL LR
  18. Android百度地图显示POI
  19. 对docker一些认知
  20. Scheduler (Long-term,Short-term, Medium-term Scheduler) Dispatcher

热门文章

  1. MySQL Connector/C++ 操作MySQL数据库
  2. 如何规划城市旧改中的商业街
  3. 【Linux】 rm -rf报错cannot remove ‘directory‘: Directory not empty
  4. 后端用户注册及发送短信验证码3
  5. 自己开店怎么办会员卡-云上铺会员管理系统
  6. 无名之辈高清版百度云在线观影
  7. 你老是手麻是怎么了?
  8. unity3d著名项目-Dark Tree翻译
  9. C#统计酷狗播放列表里歌曲播放的总时间
  10. ROS学习记录002:机器语音学习