常用的地图种类分为交通图,地形图,卫星图等等,在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地图采用默认地图类型。