QML Карты
Обзор
Тип Карта позволяет отображать карту и размещать объекты на ней. Можно определять и добавлять различные точки интереса для отображения на карте. Также у Карты есть функции для управления отображением карты. С помощью элемента Карта можно центрировать карту, изменять масштаб, приближать и отдалять, а также сделать элемент прокручиваемым.
Места, которые необходимо добавить на карту, являются MapItems. Положение элемента определяется координатами координаты, которые включают широту, долготу и высоту. Элемент отображается автоматически после добавления его на Карту.
Положение на карте
Все API позиционирования являются частью модуля QtPositioning. Основным элементом информации о положении является координата. Координата содержит данные о широте, долготе и высоте расположения. Высота указана в метрах. Также она имеет метод для определения расстояния до другой координаты. Тип координата также может храниться в элементе Location, который также будет содержать информацию о размере ограничивающей рамки, чтобы определить достаточную близость к расположению, и адрес расположения.
Вот пример клиента, который использует источник позиционирования для центрирования карты на текущем положении:
Rectangle {
import QtPositioning 5.2
import QtLocation 5.3
...
Map {
id: map
// initialize map
...
}
PositionSource {
onPositionChanged: {
// center the map on the current position
map.center = position.coordinate
}
}
} Геокодирование
Геокодирование — это получение географических координат (широты и долготы) из других географических ссылок на расположения. Например, это может быть адрес улицы. Также возможно обратное геокодирование, при котором адрес улицы используется для определения географической координаты. Геокодирование выполняется с помощью типа GeocodeModel.
Следующие примеры кода — это небольшая часть компонента map в примере Просмотр карты (QML). Примеры демонстрируют объявление компонента GeocodeModel.
В примере мы видим, что [QML]{GeocodeModel} содержит плагин и два обработчика сигналов. Один для изменений состояния onStatusChanged, а другой для обновления центрирования объекта Map onLocationsChanged.
GeocodeModel {
id: geocodeModel
plugin: map.plugin
onStatusChanged: {
if ((status == GeocodeModel.Ready) || (status == GeocodeModel.Error))
map.geocodeFinished()
}
onLocationsChanged:
{
if (count == 1) {
map.center.latitude = get(0).coordinate.latitude
map.center.longitude = get(0).coordinate.longitude
}
}
}
MapItemView {
model: geocodeModel
delegate: pointDelegate
} Функции геокодирования вызываются из кода более высокого уровня. В этом фрагменте мы видим объект Address, заполненный необходимыми параметрами.
Address {
id :fromAddress
street: "Sandakerveien 116"
city: "Oslo"
country: "Norway"
state : ""
postalCode: "0484"
} Объект Address впоследствии используется в запросе для GeocodeModel для обработки и определения географических координат.
// send the geocode request geocodeModel.query = fromAddress geocodeModel.update()
Навигация
Очень важной функцией типа Карта является навигация от одного места к месту назначения с возможными промежуточными точками на маршруте. Маршрут будет разделен на ряд сегментов. В конце каждого сегмента находится вершина, называемая маневром. Сегменты содержат информацию о времени и расстоянии до конца сегмента. Маневры содержат информацию о том, что делать дальше, как перейти к следующему сегменту, если он есть. Таким образом, маневр содержит навигационную информацию, например, «поверните направо сейчас».
Чтобы найти подходящий маршрут, необходимо использовать RouteQuery для определения критериев выбора и добавления необходимых промежуточных точек. RouteModel должен возвращать список RouteSegmentов, которые определяют маршрут до места назначения, включая навигационные рекомендации в местах соединения сегментов, называемые RouteManeuvers
Существует много вариантов, которые можно добавить в запрос, чтобы сузить критерии. Свойства RouteQuery могут включать
| numberAlternativeRoutes | Количество альтернативных маршрутов |
| travelModes | Режим передвижения |
| routeOptimizations | Необходимые оптимизации маршрута |
| segmentDetail | Уровень детализации сегментов |
| maneuverDetail | Уровень детализации маневров между сегментами |
| waypoints | Список промежуточных точек |
| excludedAreas | Список исключенных областей, через которые маршрут не должен проходить |
| featureTypes | Релевантные объекты карты, например, шоссе, паром |
В следующем примере объявлен RouteQuery по умолчанию в RouteModel.
RouteModel {
id: routeModel
plugin : map.plugin
query: RouteQuery {
id: routeQuery
}
onStatusChanged: {
if (status == RouteModel.Ready) {
switch (count) {
case 0:
// technically not an error
map.routeError()
break
case 1:
map.showRouteList()
break
}
} else if (status == RouteModel.Error) {
map.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).
Масштабирование, Приближение и Прокручивание
Элемент Карта также поддерживает пользовательские взаимодействия с картой с помощью тактильных и мышиных жестов. Это такие функции, как прокрутка для панорамирования, приближение/удаление для изменения масштаба.
Включение и настройка приближения и прокручивания легко выполняется в типе Карта.
Map {
id: map
// Enable pan, flick, and pinch gestures to zoom in and out
gesture.acceptedGestures: MapGestureArea.PanGesture | MapGestureArea.FlickGesture | MapGestureArea.PinchGesture | MapGestureArea.RotationGesture | MapGestureArea.TiltGesture
gesture.flickDeceleration: 3000
gesture.enabled: true
} Масштабирование также может контролироваться другими объектами, такими как ползунки, с привязкой к свойству zoomLevel карты.
Типы QML
Карты
Тип содержит информацию о возможностях камеры для определенного типа карты |
|
(ранее MapParameter) тип представляет параметр для элемента карты или других элементов, используемых в карте (например, элементов карты и т. д.). Этот тип предоставляет возможность указать зависящие от плагина необязательные динамические параметры, которые позволяют плагину расширить API модуля во время выполнения |
|
Тип отображает карту |
|
Тип отображает географическую окружность на карте |
|
Отображает окружность на карте |
|
Элемент отображает текущее действительное уведомление об авторских правах для элемента карты |
|
Тип предоставляет взаимодействие с жестами карты |
|
Отображает значок на карте |
|
Тип является контейнером для элементов карты |
|
Используется для заполнения карты данными из модели |
|
Используется для заполнения карты объектами карты из модели |
|
Тип предоставляет основную информацию о событии масштабирования |
|
Тип отображает многоугольник на карте |
|
Отображает многоугольник на карте |
|
Тип отображает полилинию на карте |
|
Отображает полилинию на карте |
|
Тип отображает произвольный объект Qt Quick на карте |
|
Тип отображает прямоугольник на карте |
|
Тип отображает маршрут на карте |
|
Отображает географический маршрут на карте |
|
Тип содержит информацию о типе карты |
|
Тип предоставляет функциональность для выполнения навигации по шагам |
Geocoding
Тип предоставляет поддержку операций поиска, связанных с географической информацией |
Routing
Тип представляет собой один географический маршрут |
|
Тип представляет собой этап маршрута, то есть часть маршрута между одной точкой маршрута и следующей |
|
Тип представляет собой информацию, относящуюся к точке пересечения двух сегментов маршрута |
|
Тип предоставляет доступ к маршрутам |
|
Тип используется для предоставления параметров запроса к RouteModel |
|
Тип представляет собой сегмент маршрута |
|
Тип предоставляет способ указать точку маршрута в RouteQuery более подробно, чем с помощью простых координат |
Example
Вышеупомянутые фрагменты взяты из примера Map Viewer (QML).
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qml-location5-maps.html