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地图采用默认地图类型。

上一篇:【机器学习】使用pyplot绘制MNIST数据集中的手写数字


下一篇:Qt - 插件化编程机制