QML地图简介(1)

一、地图插件介绍
1.qml提供了四个内建的地图在线插件"esri"、“mapbox”、“nokia”、“osm”,但是都不是国内地图,对国内很不友好,esri国内可以使用。要是想使用高德和谷歌需要自己写插件。

例如:
插件文件gd_plugin.json

{
    "Keys": ["amap"],
    "Provider": "amap",
    "Version": 200,
    "Experimental": false,
    "Features": [
        "OnlineGeocodingFeature",
        "ReverseGeocodingFeature",
        "OnlineRoutingFeature",
        "AlternativeRoutesFeature",
        "OnlineMappingFeature",
        "SearchSuggestionsFeature"
    ]
}

2.其中"Features"表示该插件支持的哪些特性,比如"OnlineMappingFeature"表示支持在线地图显示、则我们需要实现一个QGeoMappingManagerEngine引擎

每个引擎能支持的所有功能介绍如下所示:
QGeoRoutingManagerEngine
NoRoutingFeatures - Routing is not supported (KO: this option can be omitted)
OnlineRoutingFeature - Online routing support
OfflineRoutingFeature - Offline routing support
LocalizedRoutingFeature - Localized routing support
RouteUpdatesFeature - Support for dynamic path update
AlternativeRoutesFeature - Support for multiple alternative routes
ExcludeAreasRoutingFeature - Support for excluding routing factors
AnyRoutingFeatures - Supports anything your heart desires for routing

QGeoCodingManagerEngine
NoGeocodingFeatures - Geocoding is not supported
OnlineGeocodingFeature - Online geocoding support
OfflineGeocodingFeature - Offline geocoding support
ReverseGeocodingFeature - Reverse geocoding support
LocalizedGeocodingFeature - Localized geocoding support
AnyGeocodingFeatures - All of the above except NoGeocodingFeatures

QGeoMappingManagerEngine
NoMappingFeatures - No mapping supported
OnlineMappingFeature - Support for online maps
OfflineMappingFeature - Support for offline maps
LocalizedMappingFeature - Support for maps with localization
AnyMappingFeatures - All of the above except NoMappingFeatures

QPlaceManagerEngine
NoPlacesFeatures - Point-of-interest is not supported
OnlinePlacesFeature - Online Point-of-interest support
OfflinePlacesFeature - Offline Point-of-interest support
SavePlaceFeature - Support for saving custom points to the map
RemovePlaceFeature - Support for removing Point-of-interes on a map
SaveCategoryFeature - Create and save custom Point-of-interest categories
RemoveCategoryFeature - Remove Point-of-interest categories
PlaceRecommendationsFeature - Support for Recommended Point-of-interest according to keywords
SearchSuggestionsFeature - Suggestions support according to the search query part
LocalizedPlacesFeature - Localization support for Point-of-interes
NotificationsFeature - Support for Point-of-interes change notifications
PlaceMatchingFeature - Support for Point-of-interes comparison from two different providers
AnyPlacesFeatures - It’s Time for You to Relax

3.QGeoServiceProviderFactory地图服务插件实现
实现一个QT地图服务插件,我们需要子类化QGeoServiceProviderFactory,以及实现 4个接口虚函数:

QGeoCodingManagerEngine*    createGeocodingManagerEngine() : 位置搜索引擎,实现位置地理编码,比如配置文件有"OnlineGeocodingFeature"相关特性,则需要实现该虚函数
QGeoMappingManagerEngine*   createMappingManagerEngine() : 地图映射管理器引擎,实现地图显示,比如配置文件有"OnlineMappingFeature"相关特性,则需要实现该虚函数
QGeoRoutingManagerEngine*   createRoutingManagerEngine() : 路径规划引擎,实现路径规划,比如配置文件有"OnlineRoutingFeature"相关特性,则需要实现该虚函数
QPlaceManagerEngine*        createPlaceManagerEngine() : 位置搜索引擎,实现位置搜索,比如配置文件有"OnlinePlacesFeature"相关特性,则需要实现该虚函数

由于本章我们只需要实现一个在线高德地图显示,所以只需要实现QGeoMappingManagerEngine* createMappingManagerEngine()虚函数即可.
自定义一个GeoServiceProviderFactory类,并且继承于QGeoServiceProviderFactory类.
如果不生成dll的话,则需要在main函数中声明插件类:

Q_IMPORT_PLUGIN(GeoServiceProviderFactory)

GeoServiceProviderFactory代码如下所示:

class GeoServiceProviderFactory: public QObject, public QGeoServiceProviderFactory
{
    Q_OBJECT
    Q_INTERFACES(QGeoServiceProviderFactory)
    Q_PLUGIN_METADATA(IID "org.qt-project.qt.geoservice.serviceproviderfactory/5.0" FILE "gd_plugin.json")
public:
    QGeoMappingManagerEngine*   createMappingManagerEngine  (const QVariantMap &parameters, 
        QGeoServiceProvider::Error *error, QString *errorString) const;   // 返回我们子类化的地图映射管理器引擎类
};

Q_PLUGIN_METADATA宏用来描述该属性的元信息
IID “org.qt-project.qt.geoservice.serviceproviderfactory/5.0” 则用来描述地图服务的通用接口描述符、
FILE “gd_plugin.json” 则标明我们插件的配置描述文件是谁.

假如我们qml去使用amap插件,如下所示:

Map {
        id: _map
        anchors.fill: parent
 
        // 地图插件
        plugin: Plugin { name: "amap" }
 
}

那么就会根据"amap"去找到GeoServiceProviderFactory的createMappingManagerEngine虚函数,从而注册一个地图映射管理器引擎给qml显示地图用.

参考:https://blog.youkuaiyun.com/qq_37997682/article/details/122125097

### QML 中的地图功能实现 要在 QML 中实现地图功能,可以借助多种方式完成。以下是基于提供的引用内容和专业知识的具体说明。 #### 1. 基于 `MapView` 的基本地图加载 QML 提供了一个名为 `MapView` 的组件用于显示地图[^1]。可以通过设置其 `source` 属性来指定要加载的地图文件路径。以下是一个简单的代码示例: ```qml import QtQuick 2.15 import QtLocation 5.15 ApplicationWindow { visible: true width: 640 height: 480 Plugin { id: mapPlugin name: "osm" // OpenStreetMap 插件 } Map { id: mapView anchors.fill: parent plugin: mapPlugin center: QtPositioning.coordinate(59.91, 10.75) // 设置中心坐标 (纬度, 经度) zoomLevel: 14 // 设置缩放级别 } } ``` 上述代码展示了如何使用 `QtLocation` 模块中的 `Map` 和 `Plugin` 来加载并显示地图。这里选择了 OpenStreetMap 作为插件提供者。 --- #### 2. 百度离线地图的集成 如果需要在 QML 应用程序中加载百度离线地图,则可以通过 HTML 渲染的方式结合 JavaScript 实现[^2]。具体来说,可以在 QML 文件中嵌入 WebView 并调用百度地图 API 进行渲染。下面是一个简单示例: ```qml import QtWebEngine 1.12 import QtQuick 2.15 ApplicationWindow { visible: true width: 800 height: 600 WebEngineView { id: webView anchors.fill: parent url: "qrc:/baidu_map.html" } } ``` 其中,HTML 文件 (`baidu_map.html`) 可以如下定义: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Baidu Map</title> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=YourAPIKey"></script> <style> html, body { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; } #container { width: 100%; height: 100%; } </style> </head> <body> <div id="container"></div> <script> var map = new BMap.Map("container"); var point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 15); // 初始化地图,设置中心点坐标和缩放级别 </script> </body> </html> ``` 此方法依赖于百度地图 JavaScript API,并通过 QML 的 `WebEngineView` 将网页内容嵌入到应用程序中。 --- #### 3. 遥感数据的应用与可视化 对于更复杂的场景,比如遥感数据分析和可视化,《QML地图可视化》一书提供了详细的指导[^3]。书中介绍了如何将遥感数据(如卫星影像、地形数据等)与 QML 结合起来展示。例如,可以使用自定义的图像层叠加在基础地图上,或者动态更新某些区域的颜色表示特定属性的变化。 假设我们有一个遥感图片资源存储在本地磁盘中,那么可以用以下方式进行加载: ```qml Image { source: "file:///path/to/remote_sensing_image.png" fillMode: Image.PreserveAspectFit opacity: 0.7 // 调整透明度以便观察底层地图细节 } ``` 这种技术允许开发者灵活控制视觉效果的同时保持高性能表现。 --- #### 4. 利用高级组件增强体验 为了进一步提升用户体验,还可以考虑引入高级 QML 3D 组件或其他 UI 设计技巧[^4]。例如,在三维视角下呈现地理特征模型或将传统二维平面转换成更具吸引力的形式都是可行的方向之一。 --- ### 总结 综上所述,无论是采用内置模块还是第三方服务接口,亦或是深入挖掘遥感领域潜力,QML 都能很好地满足不同层次的需求。希望以上信息能够帮助您顺利完成项目目标!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屁小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值