位置地图(QML)

位置地图示例演示了如何使用 MapItemView 在地图上搜索和显示位置列表。

示例显示当前位置或如果没有位置可用,则使用奥斯陆/挪威的地图。之后执行与术语“食物”匹配的位置搜索,并将每个结果显示在地图上。

运行示例

要从 Qt Creator 运行此示例,请打开 欢迎 模式并从 示例 中选择示例。有关更多信息,请访问构建和运行示例

要编写显示地图上位置的 QML 应用程序,我们首先进行以下导入声明。

import QtQuick
import QtPositioning
import QtLocation

实例化一个 Plugin 实例。该 Plugin 事实上是从其中获取位置的后端。根据选择的插件可能需要一些必需的参数。在本例中选择了 OSM 插件,它没有必需的参数。

Plugin {
    id: myPlugin
    name: "osm"
    //specify plugin parameters if necessary
    //PluginParameter {...}
    //PluginParameter {...}
    //...
}

接下来,实例化一个 PlaceSearchModel,它可以用来指定搜索参数并执行位置搜索操作。为了说明目的,在模型构建完成后调用了 update()。通常,update() 将在用户操作(如按钮点击)的响应下调用。

PlaceSearchModel {
    id: searchModel

    plugin: myPlugin

    searchTerm: "food"
    searchArea:  QtPositioning.circle(positionSource.lastSearchPosition, 1000 /* 1 km radius */)
    Component.onCompleted: update()
}

使用 MapView 类型显示地图,并在其中声明 MapItemView,并供应搜索模型和代理。这里使用了内联代理,并且假设每个搜索结果都是 类型 PlaceSerachesult。因此,假设我们始终可以访问 place 角色,其他搜索结果类型可能没有 place 角色

MapView {
    id: view
    anchors.fill: parent
    map.plugin: myPlugin;
    map.center: positionSource.lastSearchPosition
    map.zoomLevel: 13

    MapItemView {
        model: searchModel
        parent: view.map
        delegate: MapQuickItem {
            coordinate: place.location.coordinate

            anchorPoint.x: image.width * 0.5
            anchorPoint.y: image.height

            sourceItem: Column {
                Image { id: image; source: "marker.png" }
                Text { text: title; font.bold: true }
            }
        }
    }
}

最后,使用 PositionSource 重置地图到当前位置并在新区域中查找“食物”位置。位置信息每2分钟更新一次,如果新位置距离上次食物搜索区域超过500米,则重新触发位置搜索。

PositionSource {
    id: positionSource
    property variant lastSearchPosition: QtPositioning.coordinate(59.93, 10.76) //Initialized/Fallback to Oslo
    active: true
    updateInterval: 120000 // 2 mins
    onPositionChanged:  {
        var distance = lastSearchPosition.distanceTo(position.coordinate)
        if (distance > 500) {
            // 500m from last performed food search
            lastSearchPosition = positionSource.position.coordinate
        }
    }
}

示例项目在 @ code.qt.io

© 2024 The Qt Company Ltd. 本文档贡献的版权归其各自的所有者。本提供的文档是在 GNU 自由文档许可证版本 1.3 下的,该许可证由自由软件基金会发布。Qt 和相应的徽标是 The Qt Company Ltd. 在芬兰和/或世界其他国家的 商标。所有其他商标均为其各自所有者的财产。