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应返回一个包含
您可以在查询中添加许多选项以缩小标准。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类型
地图
一个用于表示、加载和保存GeoJSON文档的模型 | |
类型显示地图 | |
类型在地图上显示地理圆 | |
项目显示地图元素的当前有效版权声明 | |
类型是地图项的容器 | |
用于从模型填充地图 | |
类型在地图上显示多边形 | |
类型在地图上显示折线 | |
类型在地图上显示任何 Qt Quick 对象 | |
类型在地图上显示矩形 | |
类型在地图上显示路线 | |
类型包含有关特定地图类型的相机功能的信息 | |
类型包含有关地图类型的信息 |
地理编码
类型为与地理信息相关的搜索操作提供支持 |
Routing
类型提供对路线的访问 | |
类型用于向 RouteModel 提供查询参数 | |
类型表示一条地理路线 | |
类型表示两条路线段相交处的相关信息 | |
类型表示路线的一个段落 |
示例
以上代码源自 地图查看器(QML) 示例。
© 2024 Qt 公司有限公司。所包含的文档贡献归各自的业主所有。本提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 所许可的。Qt 及其标志是芬兰及全球其他地区的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。