2021-07-25 Qt Location开发系列教程 (五)
文章目录
- 前言
- 一、分析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 ¶meters,QGeoServiceProvider::Error *error,QString *errorString) const override;QGeoMappingManagerEngine *createMappingManagerEngine(const QVariantMap ¶meters,QGeoServiceProvider::Error *error,QString *errorString) const override;QGeoRoutingManagerEngine *createRoutingManagerEngine(const QVariantMap ¶meters,QGeoServiceProvider::Error *error,QString *errorString) const override;QPlaceManagerEngine *createPlaceManagerEngine(const QVariantMap ¶meters,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 ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const
{return new GeoCodingManagerEngineEsri(parameters, error, errorString);
}QGeoMappingManagerEngine *GeoServiceProviderFactoryEsri::createMappingManagerEngine(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const
{return new GeoTiledMappingManagerEngineEsri(parameters, error, errorString);
}QGeoRoutingManagerEngine *GeoServiceProviderFactoryEsri::createRoutingManagerEngine(const QVariantMap ¶meters, 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 ¶meters, 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开发系列教程 (五)相关推荐
- C#微信公众号开发系列教程五(接收事件推送与消息排重)
C#微信公众号开发系列教程五(接收事件推送与消息排重) 原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续 ...
- 自动化编辑器零代码手机RPA脚本开发系列教程五
自动化编辑器 基础知识 条件 官网下载地址自动化编辑器 才发现之前讲过条件了 这次再次重新讲一次,就当我忘了之前讲的是啥了 条件是自动化编辑的基本单元,也是自动化编辑器最核心的东西,所以讲两次也 ...
- C#微信公众号开发系列教程二(新手接入指南)
此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教 ...
- 微信公众号开发系列教程一(调试环境部署续:vs远程调试)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 2021年最新最全Flink系列教程_Flink快速入门(概述,安装部署)(一)(JianYi收藏)
文章目录 引言 相关教程直通车: day01_Flink概述.安装部署和入门案例 今日目标 Flink概述 什么是批处理和流处理 为什么需要流计算 Flink的发展史 Flink的官方介绍 Flink ...
- HTML5游戏开发系列教程5(译)
原文地址:http://www.script-tutorials.com/html5-game-development-lesson-5/ 最终我决定准备下一篇游戏开发系列的文章,我们将继续使用can ...
- 树莓派开发系列教程10——树莓派spi液晶屏支持(fbtft)
树莓派官方支持av及HDMI输出,板子上预留了一个csi接口的液晶显示屏,但是一直没有相应的模组出现.在很多应用场合我们需要一些小型的液晶屏显示一些基本的信息,所以小屏驱动很是必要. 在git ...
- 植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(上)
植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(上) 11.E语言第一课(基址+偏移的读写) 12.E语言第二课(字节集的写入) 13.E语言第三课(快捷键的使用) 14.E语言第四课(调 ...
- C#微信公众号开发系列教程三(消息体签名及加解密)
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...
最新文章
- sublime几个插件
- 读再多书都没觉得自己变强?试试我这“5年陈”的方法
- Java进阶之对象克隆(复制)
- arcgis几何修复有作用吗_修复损坏的 shapefile
- source:读取文件 “/etc/profile” 时发生错误解决办法
- (88)FPGA面试题-使用Verilog HDL编写二进制转格雷码
- GTK中 ToolBar详细说明
- 你真的把数据库事务搞懂了吗,有图有真相,图文并茂!
- 凤凰刷机,强刷 Flashing finalization failed
- 昂达vi40精英版刷Linux,昂达vi40精英版论坛_昂达vi40双核版刷机包_昂达平板vi40精英版...
- 学生:无效文件.dsn问题
- spring boot中mybatisPlus代码生成器源码
- jquery禁止鼠标右键 原生js禁止鼠标右键
- GO 打开WINDOWS的默认浏览器
- 知云文献翻译打不开_【小虎聊干货】八大翻译软件大揭秘,告诉你科研翻译的正确打开方式...
- 一键构建云上高可用蛋白质结构预测平台
- 平衡二叉树 构造方法RR RL LL LR
- Android百度地图显示POI
- 对docker一些认知
- Scheduler (Long-term,Short-term, Medium-term Scheduler) Dispatcher