QML地图

概述

地图类型允许显示地图并在地图内放置对象。可以定义并添加各种兴趣点以进行显示。此外,地图还包含用于控制地图显示的特制功能。使用地图元素,您可以将地图居中、缩放、捏合并使元素可滑动。

要添加到地图的位置是MapItems。项的位置由一个坐标定义,包括纬度、经度和海拔。然后将该项目添加到地图后自动显示。

地图上的位置

所有位置API都是QtPositioning模块的一部分。位置信息的基本元素是坐标。坐标封装了纬度、经度和海拔的数据。海拔单位为米。它还有一个方法来计算到另一个坐标的距离。该坐标类型还可以包含在Location元素中,这还将包含有关边界框大小以确定位置足够接近的信息和位置地址。

以下是一个客户端示例,它使用位置源地图居中在当前位置上。

import QtPositioning
import QtLocation
...

Rectangle {

    Map {
        id: map
        // initialize map
        ...
    }

    PositionSource {
        onPositionChanged: {
            // center the map on the current position
            map.center = position.coordinate
        }
    }
}

地理编码

地理编码是从其他地理参考中推导出地理位置坐标(纬度和经度)的过程。例如,这可以是街道地址。反向地理编码也适用于使用街道地址来确定地理位置坐标。地理编码是通过使用GeocodeModel类型来执行的。

以下代码示例是地图查看器(QML)示例中map组件的一部分。这些片段展示了GeocodeModel组件的声明。

在片段中,我们看到[QML]{GeocodeModel}包含插件和两个信号处理器。一个用于状态变化onStatusChanged,另一个用于更新地图对象的位置值onLocationsChanged

GeocodeModel {
    id: geocodeModel
    plugin: view.map.plugin
    onStatusChanged: {
        if ((status == GeocodeModel.Ready) || (status == GeocodeModel.Error))
            view.geocodeFinished()
    }
    onLocationsChanged:
    {
        if (count === 1) {
            view.map.center.latitude = get(0).coordinate.latitude
            view.map.center.longitude = get(0).coordinate.longitude
        }
    }
}

MapItemView {
    parent: view.map
    model: geocodeModel
    delegate: pointDelegate
}

地理编码功能是从较高层代码调用的。在这个片段中,我们看到一个填充了所期望参数的Address对象。

Address {
    id :fromAddress
    street: "Sandakerveien 116"
    city: "Oslo"
    country: "Norway"
    state : ""
    postalCode: "0484"
}

地址随后在GeocodeModel查询中使用,以进行处理和确定地理坐标

// send the geocode request
geocodeModel.query = fromAddress
geocodeModel.update()

地图类型的一个非常重要的功能是从一个地点导航到另一个地点, muligvis med mellomleggsstoppepunkter på ruten. Ruta vil bli delt inn i en rekke segmenter. Ved slutten av hvert segment er det en vertex som kalles en maneuver. Segmentene inneholder informasjon om tid og avstand til slutten av segmentet. De maneuverene inneholder informasjon om hva som skal gjøres neste gang, hvordan man kommer inn i neste segment, om det er ett. Slik inneholder en maneuver navigasjonsinformasjon, for eksempel "ta til høyre nå"。

为找到合适的路线,我们需要使用RouteQuery来定义选择标准并添加任何所需的途经点。The RouteModel应返回一个包含routeSegment的路线列表,定义从起点到终点的路线,并在段落的连接点提供导航建议,称为routeManeuver

您可以在查询中添加许多选项以缩小标准。The RouteQuery属性可以包括

numberAlternativeRoutes替代路线的数量
travelModes旅行模式
routeOptimizations所需的路线优化
segmentDetail段位的详细程度
maneuverDetail段位之间的maneuver的详细程度
waypoints途经点列表
excludedAreas必须不穿越的排除区域列表
featureTypes相关的地图特征,例如公路,渡轮

在以下示例中,在RouteModel中声明了默认的RouteQuery

RouteModel {
    id: routeModel
    plugin : view.map.plugin
    query:  RouteQuery {
        id: routeQuery
    }
    onStatusChanged: {
        if (status == RouteModel.Ready) {
            switch (count) {
            case 0:
                // technically not an error
                view.routeError()
                break
            case 1:
                view.showRouteList()
                break
            }
        } else if (status == RouteModel.Error) {
            view.routeError()
        }
    }
}

用户输入一些信息,例如路线的起点,一些途经点,和目的地。所有这些位置都是途经点,因此从开始到结束的位置将作为途经点的序列输入。然后可以设置其他特定于此次旅行的查询属性。

// clear away any old data in the query
routeQuery.clearWaypoints();
// add the start and end coords as waypoints on the route
routeQuery.addWaypoint(startCoordinate)
routeQuery.addWaypoint(endCoordinate)
routeQuery.travelModes = RouteQuery.CarTravel
routeQuery.routeOptimizations = RouteQuery.FastestRoute
routeModel.update();

routeInfoModel ListModel用于获取查询结果并构建适合显示的列表。

ListView {
    interactive: true
    model: ListModel { id: routeInfoModel }
    header: RouteListHeader {}
    delegate:  RouteListDelegate{
        routeIndex.text: index + 1
        routeInstruction.text: instruction
        routeDistance.text: distance
    }
}

ListModel routeInfoModel可以通过代码填充值,该代码遍历段,提取段长度,指令文本和到下一个指令的距离。提取的数据在检索时格式化以供显示。

routeInfoModel.clear()
if (routeModel.count > 0) {
    for (var i = 0; i < routeModel.get(0).segments.length; i++) {
        routeInfoModel.append({
            "instruction": routeModel.get(0).segments[i].maneuver.instructionText,
             "distance": Helper.formatDistance(routeModel.get(0).segments[i].maneuver.distanceToNextInstruction)
        });
    }
}

有关此示例的更多信息,请参阅地图查看器示例(QML)

缩放,捏合和可随意翻动

地图项还支持使用触觉和鼠标手势与地图进行用户界面交互。这是如轻扫以平移,捏合以缩放等功能。

MapView类型中启用和配置捏合和可滑动非常简单。

MapView {
    id: view
TapHandler {
    id: tapHandler
    property variant lastCoordinate
    acceptedButtons: Qt.LeftButton | Qt.RightButton

    onPressedChanged: (eventPoint, button) => {
        if (pressed) {
            lastCoordinate = view.map.toCoordinate(tapHandler.point.position)
        }
    }

    onSingleTapped: (eventPoint, button) => {
            if (button === Qt.RightButton) {
                showMainMenu(lastCoordinate)
            }
    }

    onDoubleTapped: (eventPoint, button) => {
        var preZoomPoint = view.map.toCoordinate(eventPoint.position);
        if (button === Qt.LeftButton) {
            view.map.zoomLevel = Math.floor(view.map.zoomLevel + 1)
        } else if (button === Qt.RightButton) {
            view.map.zoomLevel = Math.floor(view.map.zoomLevel - 1)
        }
        var postZoomPoint = view.map.toCoordinate(eventPoint.position);
        var dx = postZoomPoint.latitude - preZoomPoint.latitude;
        var dy = postZoomPoint.longitude - preZoomPoint.longitude;

        view.map.center = QtPositioning.coordinate(view.map.center.latitude - dx,
                                                   view.map.center.longitude - dy);
    }
}
}

缩放也可以由其他对象如滑块控制,并通过绑定到地图zoomLevel

QML类型

地图

GeoJsonData

一个用于表示、加载和保存GeoJSON文档的模型

Map

类型显示地图

MapCircle

类型在地图上显示地理圆

MapCopyrightNotice

项目显示地图元素的当前有效版权声明

MapItemGroup

类型是地图项的容器

MapItemView

用于从模型填充地图

MapPolygon

类型在地图上显示多边形

MapPolyline

类型在地图上显示折线

MapQuickItem

类型在地图上显示任何 Qt Quick 对象

MapRectangle

类型在地图上显示矩形

MapRoute

类型在地图上显示路线

cameraCapabilities

类型包含有关特定地图类型的相机功能的信息

mapType

类型包含有关地图类型的信息

地理编码

GeocodeModel

类型为与地理信息相关的搜索操作提供支持

Routing

RouteModel

类型提供对路线的访问

RouteQuery

类型用于向 RouteModel 提供查询参数

route

类型表示一条地理路线

routeManeuver

类型表示两条路线段相交处的相关信息

routeSegment

类型表示路线的一个段落

示例

以上代码源自 地图查看器(QML) 示例。

© 2024 Qt 公司有限公司。所包含的文档贡献归各自的业主所有。本提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 所许可的。Qt 及其标志是芬兰及全球其他地区的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。