QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型
2022/1/27 14:05:32
本文主要是介绍QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
常用的地图种类分为交通图,地形图,卫星图等等,在QML的Map(以OSM地图为例)中提供activeMapType属性用于读取当前显示的地图类型(注意:该属性为只读属性,不能用于赋值),QML中地图的加载寻找根据瓦片的文件名进行查找,例如名为"osm_100-l-5-2-2-3.png"的瓦片,其中5代表了该地图的类型。如果需要修改地图类型,可以通过自定义函数:
function setMapOffLineType(){ if(myMap.activeMapType.name != "Night Transit Map"){ for(var a in myMap.supportedMapTypes){ if(myMap.supportedMapTypes[a].name === "Night Transit Map"){ myMap.activeMapType = myMap.supportedMapTypes[a] } } } }
的方式进行设置,但是该函数只能在Component.onCompleted后方可使用,且此时地图加载了两次瓦片数据,当瓦片量大时会影响程序初始化时间。因此我通过修改地图插件Plugin的源码后,在地图插件中直接设置地图类型,此方法不会修改Map中activeMapType的值。代码如下:
Plugin { id: mapPlugin name: "osm" // "mapboxgl", "esri", ... PluginParameter{ name:"osm.mapping.offline.directory" value:Analyze.getAppPath()+"/Map/night"//night } PluginParameter{ name:"osm.mapping.offline.maptype" value:5 } }
修改地图插件源码步骤为:
1、使用QtCreator打开OSM地图插件工程源码位置:F:\Qt\5.11.2\Src\qtlocation\src\plugins\geoservices\osm
2、在"qgeofiletilecacheosm.h"添加变量int m_offlineMapType,在构造函数中添加参数mapType并对m_offlineMapType初始化,代码:
qgeofiletilecacheosm.h:
/*添加地图类型标识*/ int m_offlineMapType; QGeoFileTileCacheOsm(const QVector<QGeoTileProviderOsm *> &providers, const QString &offlineDirectory = QString(), const QString &directory = QString(), const int &mapType = 0, QObject *parent = 0); /*此为原构造函数,新增了地图类型标识 mapType */ // QGeoFileTileCacheOsm(const QVector<QGeoTileProviderOsm *> &providers, // const QString &offlineDirectory = QString(), // const QString &directory = QString(), // QObject *parent = 0);
qgeofiletilecacheosm.cpp
//对m_offlineMapType初始化 QGeoFileTileCacheOsm::QGeoFileTileCacheOsm(const QVector<QGeoTileProviderOsm *> &providers, const QString &offlineDirectory, const QString &directory, const int &mapType, QObject *parent) : QGeoFileTileCache(directory, parent), m_offlineDirectory(offlineDirectory), m_offlineData(false),m_offlineMapType(mapType), m_providers(providers)
3、在"qgeotiledmappingmanagerengineosm.cpp"文件中添加自定义参数设置,可以搜索已有的参数属性例如:"osm.mapping.offline.directory"便于定位到文件中位置,其后添加自定义参数代码:
/*在插件中定义地图类型*/ int m_offlineMapType=0; if(parameters.contains(QStringLiteral("osm.mapping.offline.maptype"))) m_offlineMapType = parameters.value(QStringLiteral("osm.mapping.offline.maptype")).toInt(); QGeoFileTileCacheOsm *tileCache = new QGeoFileTileCacheOsm(m_providers, m_offlineDirectory, m_cacheDirectory,m_offlineMapType); /*此为原地图瓦片初始化构造函数*/ // QGeoFileTileCacheOsm *tileCache = new QGeoFileTileCacheOsm(m_providers, m_offlineDirectory, m_cacheDirectory,m_offlineMapType);
4、在"qgeofiletilecacheosm.cpp"中跳转到函数QString tileSpecToFilename(const QGeoTileSpec &spec, const QString &format, const QString &directory) const override;
该函数功能为生成瓦片地图的瓦片名称,修改其中瓦片标识产生的代码:
/*当在插件中设置了地图类型时根据插件设置加载,如果没有设置则按照地图中的activeMapType进行加载*/ if(m_offlineMapType){ filename += QString::number(m_offlineMapType); }else{ filename += QString::number(spec.mapId()); } /*原地图类型筛选方法*/ // filename += QString::number(spec.mapId());
5、重新编译该osm工程,编译好的插件位于Qt安装盘符根目录下的plugins\geoservices路径下,将生成的插件文件复制到Qt安装目录中的插件目录(F:\Qt\5.11.2\msvc2015\plugins\geoservices\)替换原插件即可。
6、在QML的插件Plugin中传递自定义参数"osm.mapping.offline.maptype",其中该参数的值为地图瓦片的类型标识(标识需>0),如果不设置该参数,QML地图采用默认地图类型。
这篇关于QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)