QML的地图Map中提供了属性activeMapType : MapType用于设置当前地图的类型,以OSM地图插件为例,OSM地图提供了多种地图类型,下面介绍如何修改OSM插件的源码添加需要的地图类型,并在Map动态的更换地图类型,Demo效果如图:
修改插件源码方法如下(以5.15.2为例):
1、使用QtCreator打开OSM地图插件工程源码位置:
F:\Qt\5.15.2\Src\qtlocation\src\plugins\geoservices\osm.pro
2、打开文件 "qgeotiledmappingmanagerengineosm",可以搜索已有的注释标签:"/* QGeoTileProviderOsms setup */" 定位到文件中位置,此处代码功能为向osm插件中注册可用的地图类型,添加自定义的地图类型:
/* QGeoTileProviderOsms setup */
m_providers.push_back( new QGeoTileProviderOsm( nmCached,
QGeoMapType(QGeoMapType::StreetMap, tr("Street Map"), tr("Street map view in daylight mode"), false, false, 1, pluginName, cameraCaps),
providers_street, cameraCaps ));
//下方三行为新添加
m_providers.push_back( new QGeoTileProviderOsm( nmCached,
QGeoMapType(QGeoMapType::CustomMap, tr("Night Blue Map"), tr("My Night Blue view"), false, false, 2, pluginName, cameraCaps),
providers_hiking, cameraCaps ));
m_providers.push_back( new QGeoTileProviderOsm( nmCached,
QGeoMapType(QGeoMapType::CustomMap, tr("Image Map"), tr("My Image view"), false, false, 3, pluginName, cameraCaps),
providers_hiking, cameraCaps ));
m_providers.push_back( new QGeoTileProviderOsm( nmCached,
QGeoMapType(QGeoMapType::CustomMap, tr("White Street Map"), tr("My Street view"), false, false, 4, pluginName, cameraCaps),
providers_hiking, cameraCaps ));
// m_providers.push_back( new QGeoTileProviderOsm( nmCached,
// QGeoMapType(QGeoMapType::SatelliteMapDay, tr("Satellite Map"), tr("Satellite map view in
……省略其中代码
// QGeoMapType(QGeoMapType::PedestrianMap, tr("Hiking Map"), tr("Hiking map view"), false, false, 7, pluginName, cameraCaps),
// providers_hiking, cameraCaps ));
3、重点参数说明:
QGeoMapType的构造函数:
style:预设的地图类型,如果是自定义的地图,可以传入QGeoMapType::CustomMap,可重复
name:地图名称
description:地图详细介绍
mobile:是否是移动设备中显示
night:是否是黑夜图
mapId:地图标识ID序号。该属性用于地图组件查找瓦片时瓦片图片的名称标识(标识=mapId-1),例如mapId为2时,查找的地图瓦片名为osm_100-l-1-4-11-7。在修改osm插件时(即上方代码),mapId需要顺序递增,此处需要特别注意
pluginName:插件名称
cameraCapabilities:相机属性
4、重新编译该osm工程,编译好的插件位于Qt安装盘符根目录下的plugins\geoservices路径下,将生成的插件文件复制到Qt安装目录中的插件目录(F:\Qt\5.15.2\msvc2019\plugins\geoservices\)替换原插件即可。
5、QML中设置地图类型和动态修改类型:
Map {
id:myMap
anchors.fill: parent
plugin: mapPlugin
center: QtPositioning.coordinate(25.1214, 102.65)
zoomLevel: 4
copyrightsVisible: false
MouseArea{
anchors.fill: parent
property int index: 0
onClicked: {
index++
if(index>2)
index = 0
myMap.activeMapType = myMap.supportedMapTypes[index]
}
}
Component.onCompleted: {
for(var i in myMap.supportedMapTypes)
console.log("SupportedMapType:",i,myMap.supportedMapTypes[i].name)
}
}
输出结果:
qml: SupportedMapType: 0 Street Map
qml: SupportedMapType: 1 Night Blue Map
qml: SupportedMapType: 2 Image Map
qml: SupportedMapType: 3 White Street Map