Qt Location模块中的plugin默认只有 "esri"、"mapbox"、"osm"、"here",一般我们需要换成自己的数据源,github 上有人做了谷歌地图和其他地图的 plugin 。而我目前的需求是加载本地瓦片地图,所以准备实现一个自己的 plugin 。

1.了解如何自定义 plugin

我们可以通过查看 Qt Location 相关文档,了解自定义 plugin 的步骤:https://doc.qt.io/qt-5/qtlocation-geoservices.html

文档上提到了两点,给插件写一个json描述文件;继承 QGeoServiceProviderFactory 并实现其部分接口。

对于 json 文件的 Features 字段的内容,可以参考:https://doc.qt.io/qt-5/qgeoserviceprovider.html。比如我目前做这个只用到了瓦片加载,那么可以这样写(写的Online实际上是自己处理的网路请求加载本地数据):

{"Keys": ["mymap"],"Provider": "mymap","Version": 100,"Experimental": false,"Features": ["OnlineMappingFeature"]
}

对于接口实现部分,插件实现者需要继承QGeoServiceProviderFactory以及要为其提供实现的许多ManagerEngine类的子类(机器翻译),如果插件不提供对应引擎,则相关函数应返回0(nullptr)。如果要制作自己的 plugin 加载瓦片,需要重写createMappingManagerEngine处理相关请求来实现映射。

当然,只是看文档还不足以自己做一个插件,需要参考已有的实现,如:

Qt源码的实现: qt-everywhere-src-5.12.4\qtlocation\src\plugins\geoservices\osm\osm.pro

GitHub:https://github.com/mavlink/qgroundcontrol

GitHub:https://github.com/vladest/googlemaps

GitHub:https://github.com/wangpengcheng/OfflineMapTest

2.实现中的一些关键点

目前的实现我只做了瓦片的请求,也就是继承 QGeoServiceProviderFactory 类后实现其 createMappingManagerEngine 接口。具体的请求由 QGeoTileFetcher 的子类来完成,我们继承他后实现 getTileImage 接口。

对于一些请求参数,我是通过 QGeoServiceProviderFactory 虚函数接口中的 parameters 参数来捕获的,我们可以在QML中通过给 Plugin 添加 PluginParameter 来传递参数(也可以通过 MapParameter 来实现):

        plugin: Plugin {name: "mymap" //"esri" "mapbox" "osm" "here"PluginParameter {name: "mapPath"value: applicationDirPath+"/dianzi_gaode_ArcgisServerTiles/_alllayers"}PluginParameter {name: "format"value: "png"}}

目前也有一些没解决的问题,如请求的 url 不对的话程序会很卡等。

(2020-1-18)之前自定义的模块加载了 cache 但是不会释放, Map 切换多次后内存占用飙升,参考源码之后借用 QGeoFileTileCache 类来管理瓦片缓存,解决了 cache 没释放的问题。

3.实现效果及源码

实现效果如下图,源码中带有部分瓦片地图,可以直接运行。要注意的是不同的 Qt 版本可能 Location 模块有些接口不同,我使用的 Qt5.12 和 Qt5.15 来测试,其他版本请自行查看 Qt 源码来修改。

代码中有个 MyQtLocation.pro 用于运行示例,示例是静态加载的 plugin 。Plugin文件夹下有个单独的 pro文件用于生成 lib dll,生成动态库之后放到 Qt 安装目录的插件目录下(如 E:\Qt\Qt5.12.6\5.12.6\msvc2017\plugins\geoservices ),就可以在别的项目中使用这个 dll 了,可以通过添加 build 参数 install 自定安装到对应目录。

至此,一个简单的瓦片地图插件就完成了,如果要自己做一定要看文档和源码。

代码 github 链接:https://github.com/gongjianbo/MyQtLocation

QML QtLocation地图应用学习-5:实现自己的plugin加载瓦片地图相关推荐

  1. OpenLayers教程十一:多源数据加载之用最简单的方式加载瓦片地图

    目录 一.加载OpenStreetMap 二.加载Stamen Map 三.加载Bing Map OpenLayers封装了一些瓦片地图源类用于加载瓦片地图,这些类包括: ol.source.OSM  ...

  2. cocos2dx3.x加载瓦片地图TiledMap

    1.瓦片地图 就我个人理解所谓瓦片地图即由许多地图砖块拼成的整体的地图,这样的好处就是对不同地貌的地图块可以设置不同的属性,比如墙壁和河流显然是不能直接穿过的,而整体的地图显然要设置这样的属性就显得非 ...

  3. web高德地图怎么加载离线地图_基于 QGIS 在内网中离线加载卫星地图的方法

    1. 概述 我们之前为大家分享过在三维地球开源平台离线加载卫星影像的方法,主要包括基于桌面端的OsgEarth开源三维地球和基于Web端的Cesium开源三维地球等平台的局域网离线影像加载. 另外,也 ...

  4. google地图过期,出现此页面无法正确加载 Google 地图问题修改

    今天上午打开监控页面,出现此页面无法正确加载 Google 地图, 查看日志,日志内容有: You have exceeded your request quota for this API. See ...

  5. cocos2dx之加载瓦片地图tmx

    最近在有个华为比赛,于是乎报名了,直在做一个游戏,所以没有写博客,今天遇到个问题觉得有必要写一下,以防之后遇到忘记. auto map = TMXTiledMap::create("newm ...

  6. 0_1_QGIS安装配置中文加载瓦片地图

    选择QGIS的原因无他,免费开源而已. 很多人GIS软件入门都是arcgis,但arcgis+arcpy+arcserver+arcSED构建了一个全封闭系统,不管是桌面端,还是Python,还是we ...

  7. QGIS 上加载瓦片地图(高德、ESRI、OSM等)

    1. 在QGIS左侧的浏览面板中,选择XYZ Tiles节点,右键新建连接.在弹出的窗口中填入名称和瓦片地图的网址http://webrd02.is.autonavi.com/appmaptile?l ...

  8. QGIS上加载瓦片地图

    gis上添加其它地图 其他瓦片地址 高德街道:http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&a ...

  9. android瓦片地图下载,Andorid 如何加载 瓦片地图

    之前用的高德是这样加载 的 aMap.addTileOverlay(new TileOverlayOptions().tileProvider(new UrlTileProvider(256, 256 ...

  10. vue 项目安装 openlayer 加载高德地图

    vue 项目安装 openlayer 今天呢,稍微说一下关于 vue 项目使用 openlayer 的一些操作,我也是刚开始学习,在摸索. 比较讨厌的一点就是他的官网说明文档啥的都是英文的,对英语不好 ...

最新文章

  1. mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...
  2. python opencv二值化图像_python opencv,读取彩色图像,提取三通道,图像二值化,提取图像的边缘...
  3. Golang垃圾回收机制(一)
  4. 【图文详解】IDEA控制台运行时出现乱码:淇℃伅...
  5. 分库分表学习总结(2)——数据库中间件MyCat学习总结之MyCat-Web原理介绍
  6. linux基本命令之chattr与lsattr
  7. [轉]javascript 的 location 各種用法
  8. Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结...
  9. 如何从PDF中删除页面?
  10. 2021年下软考高项信息系统项目管理师真题试卷答案解析
  11. c php乱码,Cknife的PHP功能部分修正,解决SHELL无法回显以及中文乱码
  12. 软件测试面试题:设计系统测试计划需要参考的项目文档?
  13. 为wpf中的DataGrid控件添加鼠标单击事件
  14. base64加密解密
  15. LEAK: ByteBuf.release() was not called before it's garbage-collected. Enable advanced leak reporting
  16. make_blobs
  17. 【微分方程数值解】有限差分法(二)两点边值问题数值算例(附python代码)
  18. “Win10 UAP 开发系列”之主题模式切换
  19. 字节流与字符流(一)
  20. Ajax请求的五大步骤——一看就会

热门文章

  1. 单片机测试开发板用什么软件,怎么知道单片机开发板的好坏
  2. 星空编程 小甲鱼c语言,c++快速入门(小甲鱼)
  3. 【程序设计基础与实验】地铁售票查询系统
  4. WPF/WinForm 如何生成单文件的EXE
  5. bugzilla dbd-mysql_Redhat 搭建bugzilla平台
  6. cocos2dx 学习笔记之摄像头与3D精灵的移动
  7. php微信商家转账到零钱 发起商家转账API
  8. 国内外各大搜索引擎登录入口
  9. 合天网安就业班_【合天网安实验室】SQL注入入门一
  10. nagios一些安装注意