Коммит d80fa33b создал по автору lagutinakv's avatar lagutinakv Зафиксировано автором evseev84
Просмотр файлов

Add the section about geopositioning and maps

владелец fa65d818
......@@ -384,6 +384,19 @@ Copyright © 2016–2025 ООО «Открытая мобильн
* Контейнеры
* Работа со строками
* Многопоточность
* [Введение в многопоточность](./multithreading_base)
* Лекция:
[cлайды](./multithreading_base/lecture.fodp),
[конспект](./multithreading_base/lecture.md)
* [Тесты](./multithreading_base/tests.md)
* [Qt Concurrent](./multithreading_qt_concurrent)
* Лекция:
[cлайды](./multithreading_qt_concurrent/lecture.fodp),
[конспект](./multithreading_qt_concurrent/lecture.md)
* [Примеры](./multithreading_qt_concurrent/examples.md)
* [Тесты](./multithreading_qt_concurrent/tests.md)
* QThread и синхронизация
* QThreadPool
* Интеграция C++ и QML
* [QObject и QGadget, макросы, свойства](./qobject_qgadget)
* Лекция:
......@@ -479,11 +492,40 @@ Copyright © 2016–2025 ООО «Открытая мобильн
[конспект](./share/lecture.md)
* [Тесты](./share/tests.md)
* Жизненный цикл Android-приложения
* [Работа с файлами](./local_files)
* Лекция:
[cлайды](./local_files/lecture.fodp),
[конспект](./local_files/lecture.md)
* [Тесты](./local_files/tests.md)
* Работа с файлами
* [QDir и QFileInfo](./qdir_qfileinfo)
* Лекция:
[cлайды](./qdir_qfileinfo/lecture.fodp),
[конспект](./qdir_qfileinfo/lecture.md)
* [Тесты](./qdir_qfileinfo/tests.md)
* [Доступные директории и разрешения](./aurora_dirs)
* Лекция:
[cлайды](./aurora_dirs/lecture.fodp),
[конспект](./aurora_dirs/lecture.md)
* [Примеры](./aurora_dirs/examples.md)
* [Тесты](./aurora_dirs/tests.md)
* [QFile – чтение и запись файла](./qfile)
* Лекция:
[cлайды](./qfile/lecture.fodp),
[конспект](./qfile/lecture.md)
* [Тесты](./qfile/tests.md)
* [QSettings](./qsettings)
* Лекция:
[cлайды](./qsettings/lecture.fodp),
[конспект](./qsettings/lecture.md)
* [Тесты](./qsettings/tests.md)
* [sstore](./sstore)
* Лекция:
[cлайды](./sstore/lecture.fodp),
[конспект](./sstore/lecture.md)
* [Тесты](./sstore/tests.md)
* [Pickers](./pickers)
* Лекция:
[cлайды](./pickers/lecture.fodp),
[конспект](./pickers/lecture.md)
* [Примеры](./pickers/examples.md)
* [Тесты](./pickers/tests.md)
* FileDialog из QtQuick.Dialogs
* Базы данных
* [LocalStorage](./localstorage)
* Лекция:
......@@ -613,12 +655,6 @@ Copyright © 2016–2025 ООО «Открытая мобильн
[cлайды](./webrtc/lecture.fodp),
[конспект](./webrtc/lecture.md)
* [Тесты](./webrtc/tests.md)
* WebView (Chromium)
* Картография
* Датчики
* NFC
* Шифрование и токены
* Дополнительные API ОС Аврора
* WebView (Chromium)
* [Отображение страницы](./webview_show_page)
* Лекция:
......@@ -635,20 +671,31 @@ Copyright © 2016–2025 ООО «Открытая мобильн
[cлайды](./webview_hybrid_app/lecture.fodp),
[конспект](./webview_hybrid_app/lecture.md)
* [Тесты](./webview_hybrid_app/tests.md)
* Многопоточность
* [Введение в многопоточность](./multithreading_base)
* Лекция:
[cлайды](./multithreading_base/lecture.fodp),
[конспект](./multithreading_base/lecture.md)
* [Тесты](./multithreading_base/tests.md)
* [Qt Concurrent](./multithreading_qt_concurrent)
* Лекция:
[cлайды](./multithreading_qt_concurrent/lecture.fodp),
[конспект](./multithreading_qt_concurrent/lecture.md)
* [Примеры](./multithreading_qt_concurrent/examples.md)
* [Тесты](./multithreading_qt_concurrent/tests.md)
* QThread и синхронизация
* QThreadPool
* Картография
* [Задачи геопозиции](./geopositioning)
* Лекция:
[cлайды](./geopositioning/lecture.fodp),
[конспект](./geopositioning/lecture.md)
* [Тесты](./geopositioning/tests.md)
* [Qt Postioning](./qt_positioning)
* Лекция:
[cлайды](./qt_positioning/lecture.fodp),
[конспект](./qt_positioning/lecture.md)
* [Примеры](./qt_positioning/examples.md)
* [Задания](./qt_positioning/tasks.md)
* [Тесты](./qt_positioning/tests.md)
* [Qt Location, WebTiles](./qt_location)
* Лекция:
[cлайды](./qt_location/lecture.fodp),
[конспект](./qt_location/lecture.md)
* [Примеры](./qt_location/examples.md)
* [Задания](./qt_location/tasks.md)
* [Тесты](./qt_location/tests.md)
* MFW
* Датчики
* NFC
* Шифрование и токены
* Дополнительные API ОС Аврора
* Локализация приложений
* [Интернационализация в Qt](./internationalization)
* Лекция:
......
Это отличие свёрнуто
# Задачи геопозиции
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Геопозиционирование
Геопозиционирование — это определение географического местоположения мобильного устройства с помощью различных технологий: спутниковых систем или Wi-Fi и базовых станций сотовой связи. Оно используется для навигации, отслеживания транспорта, предоставления информации в реальном времени в зависимости от местоположения.
ОС Аврора позволяет получать информацию со спутников GPS и ГЛОНАСС, включая информацию о текущей позиции, последнее известное положение, точность, расстояние и скорость.
API Qt Positioning используется для получения информации о местоположении и обновления спутниковой информации.
API Qt Location используется для доступа к службам определения местоположения: запрос на близлежащие объекты, доступ к фрагментам карты, а также расчёт навигационных маршрутов между двумя точками.
В качестве серверного модуля позиционирования в ОС Аврора применяется провайдер GeoClue, который использует oFono, чтобы получать MCC (мобильный код страны), MNC (мобильный сетевой код), LAC (код зоны местоположения), CID (идентификатор соты) и SS (мощность сигнала) о соседних вышках сотовой связи, затем применяет эту информацию вместе с информацией о публичном домене, полученной от службы определения местоположения Mozilla для определения приблизительного расположения устройства.
## NMEA-файл
При разработке приложений можно использовать последовательность координат, отражающих, как могло бы
передвигаться мобильное устройство по улице в руках пользователя.
Это может быть полезно, например, когда под рукой нет устройства с модулем геопозиционирования,
но требуется обрабатывать координаты в период разработки и тестирования приложения.
Для этих целей можно использовать журнал в формате NMEA.
NMEA — стандартный формат для хранения информации о передвижениях по треку.
Qt позволяет использовать его для воспроизведения записанных ранее движений.
Для использования данной возможности необходимо разместить файл с данными на устройстве
и указать его в качестве источника данных.
# Тесты по теме «Задачи геопозиции»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Single choice
Для чего нужен nmea-файл?
---
* **Хранение последовательности геграфических координат**
* Проверка доступности GPS
* Конфигурация для использования геолокации
## Single choice
Что такое геопозиционирование?
---
* **Определение географического местоположения мобильного устройства**
* Проверка доступности GPS
* Определение размера экрана мобильного устройства
* Изменение настроек системы телефона
## Multiple choice
Какие технологии используются для геопозиционирования?
---
* **Спутниковые системы**
* **Wi-Fi**
* **Базовые станции сотовой связи**
* Магнитометр
## Single choice
Какой модуль используется в ОС Аврора для серверного позиционирования?
---
* **GeoClue**
* Qt Positioning
* OpenGL ES
* Android Services
# Примеры по теме «Qt Location, WebTiles»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
* [Шаблон для задания для Qt Creator](../../projects/location_template_qt_creator)
* [Шаблон для задания для Аврора IDE](../../projects/location_template_aurora)
* [Ответ для задания с геолокацией для Qt Creator](../../projects/location_qt_creator)
* [Ответ для задания с картами для Аврора IDE](../../projects/location_example_aurora)
Это отличие свёрнуто
# Qt Location, WebTiles
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Модуль QtLocation — отрисовка карты
Модуль Qt Location помогает создавать картографические решения, используя данные, поступающие
от сервисов определения местоположения.
Возможности модуля следующие:
* доступ и представление картографических данных,
* поддержка сенсорных жестов на определенной области карты,
* запрос конкретного географического местоположения и маршрута,
* показ карт с пользовательскими слоями и подложками.
Qt Location открывает доступ к большому набору классов, QML-типов и плагинов.
Мы остановимся на возможностях показа карты и маркера текущего местоположения
и рассмотрим следующие QML-типы:
* Map - тип для отображения карты;
* Plugin - плагин сервиса на основе местоположения;
* MapGestureArea — область обработки жестов;
* MapItem и его потомки — отображение объектов QtQuick на карте.
В .desktop-файл нужно добавить разрешения Location и Internet.
## Map — область карты
Тип Map используется для отображения карты или изображения Земли с возможностью демонстрации
интерактивных объектов, привязанных к поверхности карты.
Различные источники картографических данных могут использовать разные проекции,
и с точки зрения типа карты мы рассматриваем их как одну сменную единицу: плагин карты.
Плагин Map состоит из источника данных, а также всех других деталей, необходимых для отображения
его данных на экране.
Текущий используемый плагин содержится в свойстве plugin.
Для отображения любого изображения в элементе карты необходимо установить это свойство.
Карты отрисовываются с помощью OpenGL и стека Qt Scene Graph.
Географическая область, отображающаяся в элементе Map называется окном просмотра, координаты центра
области просмотра содержатся в свойстве center. zoomLevel контролирует масштаб карты.
При рендеринге карты каждая видимая географическая координата будет отображаться в некоторые пиксели
с координатами X и Y на экране.
Для выполнения этих преобразований компонент Map предоставляет функции toCoordinate и fromCoordinate.
Список элементов карты содержится в свойстве mapItems. Манипуляции с объектами на карте выполняются
с помощью методов, позволяющих добавить или удалить объекты, либо же очистить карту.
Метод fitViewportToMapItems позволяет отобразить все элементы карты на экране.
## Plugin — настройка сервиса для карты
QML-тип Plugin представляет из себя мост между Qt API и конкретными источниками картографической
информации (OpenStreetMap, HereMaps).
Плагины предоставляют данные, необходимые для расчета маршрутов и навигационных инструкций,
как правило, они привязаны к конкретному сервису определения местоположения.
Для выполнения различных задач могут использоваться различные плагины геосревисов.
Плагину может потребоваться доступ в Интернет, но он также может поддерживать встроенные карты
и данные.
Когда объект типа Plugin создан, он отсоединен и не связан с каким-либо реальным сервисом.
Как только он получит информацию, установив свое имя в свойстве name, имя предпочитаемых сервисов
в свойстве preffered, набор необходимых свойств плагина в свойстве required и дополнительных
параметров, он выберет соответствующий сервис для соединения.
Подключаемые объекты могут быть прикреплены только один раз; чтобы использовать несколько плагинов,
необходимо создать несколько объектов плагинов.
На слайде показан пример подключения плагина open street maps.
## MapGestureArea — область обработки жестов
Обработка жестов пользователя для взаимодействия с картой осуществляется с помощью
QML-типа MapGestureArea.
Объект MapGestureArea автоматически создается с объектом Map и доступен с помощью свойства gesture.
Два наиболее часто используемое свойства MapGestureArea - это enabled и acceptedGestures.
Они должно быть установлено до того, как MapGestureArea окажет какое-либо влияние
на взаимодействие с картой.
Свойство acceptedGesture позволяет распознавать несколько жестов, которые можно
комбинировать - масштабирование, перетаскивание, прокрутку, поворот и наклон карты.
acceptedGestures : enumeration — распознаваемые жесты (можно комбинировать через |):
* MapGestureArea.NoGesture — не распознавать жесты (0x0000);
* MapGestureArea.PinchGesture — распознавать масштабирование (0x0001);
* MapGestureArea.PanGesture — распознавать перетаскивание (0x0002);
* MapGestureArea.FlickGesture - распознавать прокрутку (0x0004).
## MapQuickItem — объекты карты
Тип MapQuickItem используется для размещения произвольного объекта QtQuick на карте
в определенном месте и указанного размера.
Свойство sourceItem содержит элемент Qt Quick, который должен быть отрисован, и может
быть любым отображаемым типом.
Позиционирование MapQuickItem на карте контролируется двумя свойствами: coordinate и anchorPoint.
Если задана только координата, она определяет координату долготы / широты объекта.
Установленная координата будет выстраиваться в верхнем левом углу содержащегося элемента,
если она отображается на экране.
Свойство anchorPoint предоставляет способ позиционирования объекта.
Точка, заданная anchorPoint на самом элементе, является точкой, которая будет выстраиваться в линию
с заданной координатой при отображении.
В дополнение к привязке к карте MapQuickItem может по желанию следить за масштабом карты
и изменять размер при увеличении или уменьшении карты.
Это поведение контролируется свойством zoomLevel. Если параметр zoomLevel не установлен, - элемент,
отрисовывается «на экране», а не «на поверхности карты, чтобы его размер оставался неизменным
независимо от уровня масштабирования карты.
Наследники MapQuickItem позволяют отрисовывать различные объекты - круг, прямоугольник,
многоугольник, ломаную или путь.
## Пример объекта на карте
Рассмотрим два примера. Здесь в элементе MapQuickItem в качестве источника мы выбираем изображение
следов, а ее координаты привязываем к источнику геопозиционирования.
Таким образом мы отображаем маршрут следования в зависимости от перемещения устройства.
## Динамический MapCircle
Во втором случае мы динамически создаем объект MapCircle, задаем ему свойства радиуса, цвета,
ширина рамки.
Значение центра задаем с помощью источника координат.
## Плагин WebTiles: конфигурация
В версии ОС Аврора 4 и выше в Qt Location для стандартного qml-типа Plugin
недоступен плагин osm для карт Open Street Maps.
Для того, чтобы подключить OSM, необходимо использовать плагин WebTiles.
Для того, чтобы использовать плагин WebTiles в приложении, в .spec- и .desktop-файлах необходимо
указать дополнительные настройки конфигурации.
В .spec-файл в секцию Requires нужно добавить зависимость qt5-plugin-geoservices-webtiles
В .desktop-файл нужно добавить разрешения Location и Internet.
WebTiles предоставляет более гибкий подход — можно шаблонно указывать, как выглядит ссылка на тайл.
В том числе, это позволяет работать с локальными тайлами.
## Плагин WebTiles
Пример конфигурации плагина.
В поле name нужно указать имя плагина: webtiles.
Навигация по тайлам осуществляется с помощью трёх параметров: __x__, __y__, __z__, —
двумерных координат и масштабирования.
Следует использовать шаблон __${x}__, __${y}__, __${z}__ для автокоррекции при формировании
пути или запроса.
У плагина имеются следующие параметры.
webtiles.scheme - Протокол передачи данных по сети, например, https
webtiles.host - Сервер с тайлами карт, например, **tile.openstreetmap.org**
Список общедоступных серверов можно найти на Wiki OpenStreetMap
webtiles.path - Формат пути к тайлам на сервере, например, **/${z}/${x}/${y}.png**
## Эмуляция местоположения
На устройствах ОС Аврора можно получить данные о геолокации устройства с помощью классов
и компонентов из модулей Qt Positioning и Qt Location.
Эмулятор ОС Аврора может также имитировать работу с местоположением.
Средствами Аврора IDE можно запустить мастер управления эмуляцией, задать местоположение
или GPS-трек для эмуляции перемещения и проверить работу программы с геопозицией.
Для эмуляции местоположения можно использовать раздел Местоположение.
Он содержит:
* текстовые поля, отображающие координаты текущей позиции (широту, долготу и высоту над уровнем моря);
* поля для ввода координат новой текущей позиции (координаты вводятся в формате "ГГ.ммсс",
где ГГ - радусы, мм - минуты, сс - секунды);
* поле для загрузки файла GPS-трека в формате NMEA;
* таблицу, отображающую точки загруженного GPS-трека (номер, время, широту, долготу и высоту над уровнем моря);
* слайдер для отображения (в процентах) и установки текущего положения на треке;
* кнопки Воспроизведение, Пауза и Стоп для управления движением по загруженному GPS-треку;
* компоненты для настройки скорости передвижения по загруженному GPS-треку и зацикливания движения.
# Задания по теме «Qt Location, WebTiles»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Карта
1. Открыть [шаблон примера](examples.md).
2. В элементе map файла MapPage.qml задать плагин для работы с картами OSM.
3. Привязать центр отображаемого фрагмента карты к актуальным координатам, если они корректны.
Для этого нужно создать элемент типа Binding:
qml
Binding {
target: map
property: "center"
value: positionSource.position.coordinate
when: positionSource.position.coordinate.isValid
}
4. Активировать обработку жестов в элементе map.
5. Добавить элемент типа Slider для управления свойством zoomLevel элемента map:
qml
Slider { // вариант для QQC2, для Silica вместо from и to нужно использовать minimumValue и maximumValue
from: map.minimumZoomLevel
to: map.maximumZoomLevel
value: 11
}
6. Разместить добавленный элемент вдоль нижней границы экрана поверх карты и привязать значение
zoomLevel элемента map к значению его свойства value.
7. Проверить, что карта раз в секунду центрируется на актуальных координатах, можно её перетаскивать
и управлять масштабом с помощью слайдера.
## Объекты на карте
Добавить элемент для отображения текущего местоположения.
1. В директории assets создать компонент Footprints:
qml
import QtQuick 2.6
import QtLocation 5.0
MapQuickItem {
property alias diameter: image.width
sourceItem: Image {
id: image
source: Qt.resolvedUrl("graphics/footprints.svg")
width: objectSize
height: width
fillMode: Image.PreserveAspectFit
}
}
2. Изменить его свойство anchorPoint так, чтобы координате соответствовал центр изображе­ния.
3. В компонент MapPage добавить элемент типа Footprints, координаты которого привязаны
к координатам, получаемым из элемента positionSource, видимость определяется кор­ректностью
координат, а диаметр вычисляет­ся следующим образом: Math.min(map.width, map.height) / 8.
4. В обработчике сигнала Component.completed компонента MapPage разместить добавленный элемент
на карте с помощью map.addMapItem( … ).
5. Проверить, что позиция, соответствующая актуальным коорди­натам, отображается на карте.
# Тесты по теме «Qt Location, WebTiles»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Single choice
Что необходимо сделать для отображения карты на странице?
---
* **Привязать ее к соответствующему плагину**
* Поместить ее в отдельную область.
* Поместить ее в прямоугольник.
* Задать координату центра карты.
## Single choice
```qml
PositionSource{
id: positionSource
active: true
}
Plugin {
id: mapPlugin
name: "osm"
}
Map {
anchors.fill: parent
plugin: mapPlugin
center: positionSource.position.coordinate
zoomLevel: 14
}
```
Что будет изображено на экране?
---
* **карта Open Street Maps, центр которой задан текущими координатами устройства**
* карта Google Maps, центр которой задан текущими координатами устройства
* карта Open Street Maps, центр которой задан началом координат
* карта Google Maps, центр которой задан началом координат
## Single choice
Каким образом указывается источник данных для визуализации карты?
---
* С помощью QML-типа PositionSource
* С помощью QML-типа Position
* **С помощью QML-типа Plugin**
* С помощью NMEA-лога
## Single choice
Для чего используется свойство activeMapType типа QML Map?
---
* **Для активации определенного типа карт.**
* Для выбора способа отображения карты.
* Для отображения на карте набора элементов.
## Multiple choice
Какие зависимости необходимо прописать для отображения карт?
---
* В .spec файле, разделе Requires: qt5-declarative-import-positioning
* **В .spec файле, разделе Requires: qt5-declarative-import-location**
* **В .spec файле, разделе Requires: qt5-plugin-geoservice-osm или аналог.**
* **.qml: import QtLocation 5.0**
* .qml: import QtPositioning 5.0
# Примеры по теме «Qt Postioning»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
* [Шаблон для задания для Qt Creator](../../projects/positioning_template_qt_creator)
* [Шаблон для задания для Аврора IDE](../../projects/positioning_template_aurora)
* [Ответ для задания с геолокацией для Qt Creator](../../projects/positioning_qt_creator)
* [Ответ для задания с геолокацией для Аврора IDE](../../projects/positioning_example_aurora)
Это отличие свёрнуто
# Qt Postioning
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Модуль QtPositioning
В этом модуле речь пойдет о том, как получить информацию о георграфическом положении устройства
и отобразить карту в приложении.
Фреймворк Qt предоставляет два модуля для работы с геолокационными данными - QtPositioining и Qt Location.
Первый позволяет получить информацию о текущем местоположении устройства, а второй предоставляет
средства для геокодирования и отображения этой информации на карте.
Для работы с модулем Qt Positioning в QML или C++ необходимо прописать соответствующие зависимости
и импортировать модуль в QML-документ или С++ класс.
В .desktop-файл нужно добавить разрешение Location.
Location — использование GPS и определение местоположения.
## Типы Qt Positioning
Qt Positioning API содержит несколько базовых типов, определяющих информацию о местоположении,
и компоненты для работы с сервисами геопозиционирования.
QtPositioning – глобальный объект, предоставляющий функции для работы с базовыми типами.
Coordinate – тип для определения географического местоположения.
Geoshape – тип, представляющий абстрактную географическую область.
Geocircle – географическая область в виде круга.
Задается координатой, определяющей центр круга и радиусом окружности в метрах.
Georectangle – прямоугольная географическая область.
Задается парой координат: координатой верхнего левого и координатой нижнего правого углов.
## Компоненты Qt Positioning
Помимо типов Qt Positiong API одержит набор компонентов.
* Position содержит информацию о географическом положении.
* PositionSource – компонент, предоставляющий текущую позицию устройства,
полученную от указанного источника локационных данных.
* CoordinateAnimation – аниматор для свойств типа coordinate.
* Address – компонент, предоставляющий информацию о локации в виде адреса.
* Location – компонент, хранящий информацию о локации.
## Coordinate: географические координаты
Тип coordinate хранит информацию о геопозиции.
Для определения позиции данный тип содержит три свойства, доступные только для чтения:
широту (latitude), долготу (longitude) и высоту над уровнем моря (altitude).
Широта определяет количество десятичных градусов выше и ниже экватора.
Положительная широта указывает на северное полушарие, а отрицательная - на южное.
Атрибут долготы указывает количество десятичных градусов на восток и запад.
Положительная долгота указывает на восточное полушарие, а отрицательная - на западное полушарие.
Атрибут altitude указывает количество метров над уровнем моря.
Вместе эти атрибуты определяют трехмерное положение в любом месте на поверхности Земли или вблизи нее.
Свойство isValid возвращает true, если данный объект является валидным, т.е. содержит
корректные значения широты и долготы.
Также у типа coordinate есть три метода.
distanceTo() возвращает расстояние(в метрах) между двумя координатами: текущей и той,
что передана в качестве аргумента.
Высота над уровнем моря здесь не участвует в вычислениях.
azimuthTo() возвращает азимут(в градусах) между двумя координатами.
Высота над уровнем моря здесь не участвует в вычислениях.
atDistanceAndAzimuth() возвращает координату, определенную с помощью расстояния и азимута,
относительно текущей координаты.
## Geoshape — географическая область
Тип geoshape представляет собой абстрактную географическую область.
Данный тип является базовым для geocircle и georectangle и обладает общими для них свойствами.
isEmpty возвращает true, если объект не имеет никакой географической информации.
isValid возвращает true, если объект является корректным.
Корректность описывается самими дочерними типами.
type возвращает текущий тип области: неизвестный, круговая или прямоугольная.
Также geoshape имеет метод сontains(), чтобы определить, содержится ли некоторая координата внутри области.
## geocircle и georectangle
Тип geocircle представляет собой круглую географическую область.
Задается координатой, определяющей центр круга и радиусом окружности в метрах
(по умолчанию имеет значение -1).
Данный тип является дочерним для geoshape и наследует его свойства и методы.
Тип georectangle представляет собой прямоугольную область.
Задается парой координат: координатой верхнего левого и координатой нижнего правого углов.
Cобственных свойства georectangle определяют координаты центра, углов области, ее ширину и высоту.
## QtPositioning
QtPositioning - глобальный объект, предоставляющий функции для работы с базовыми типами, описанными выше.
shape() создает недействительный geoshape.
Методы shapeToCircle() и shapeToRectangel() преобразуют передаваемые в них объекты geoshape в круг
и прямоугольник соответственно.
## Position — информация о местоположении
QML-тип Position содержит информацию о географическом положении: координаты
(долгота, широта, высота), timestamp (время, когда были получены эти координаты), скорость, точность данных.
Для каждого из свойств, кроме coordinate и timestamp, имеется по соответствующему свойству Valid,
которое определяет, задано ли связанное с ним свойство.
Не все свойства должны быть доступны в каждый момент времени, в таком случае в свойстве с суффиксом
Valid будет содержаться информация о его невалидности.
В первую очередь данный тип используется как одно из свойств в другом типе - PositionSource,
как основная единица данных, доступных от локационных источников.
coordinate - содержит тип с координатами.
direction - азимут направления перемещения.
speed - скорость.
verticalSpeed - вертикальная скорость.
timistamp - момент времени, в который информация о позиционировании была получена.
## PositionSource — информация о текущей позиции
Тип PositionSource предоставляет информацию о текущей позиции устройства.
Сама информация о расположении, включая широту, долготу и высоту, содержится в свойстве position,
PositionSource же считывает данные из источника.
Пока источник для получения информации не установлен, данное свойство содержит значение null.
Сначала необходимо определиться с источником информации, который требуется для приложения:
достаточно ли ему примерных координат, полученных на основании вышек мобильных операторов
или необходима высокая точность позиционирования с использованием систем глобального позиционирования.
Стоит отметить, что пока на эмуляторе ОС Аврора нет возможности воспользоваться источниками данных
из перечисленных выше, она станет доступна в следующих версиях Аврора SDK.
На данный момент для работы с геопозиционированием можно использовать nmea-файл,
ссылка на него указывается в свойстве nmeaSource.
Частота обновления информации о местоположении определяется с помощью свойства updateInterval.
Не стоит устанавливать это значение слишком коротким — частые обновления приведут к избыточному
энергопотреблению.
Для управления получением данных можно воспользоваться слеудющими методами.
Для запуска и остановки передачи данных используются методы start и stop соответственно.
Метод update обновляет местоположение в принудительном порядке.
Запускать и останавливать можно также декларативным способом — с помощью установки свойства
active в значение true или false.
Когда источник данных активен, он начинает обновлять свойство position.
Его можно привязать к другим свойствам с помощью механизма связывания в QML.
Кроме того, вы можете использовать сигнал onPositionChanged, чтобы обрабатывать новые значения
координат по мере их получения из источника данных.
## Пример компаса
Для создания простого компаса создадим объект PositionSource.
Вместе с ним с помощью метода объекта QtPositioning coordinate() задается координата, являющаяся
условной точкой назначения.
На экран в столбец будут выводится время последнего обновления информации, расстояние до точки
destination в метрах, а также широта и долгота текущего положения.
## NMEA-файл
Для работы с геопозиционированием можно использовать не только данные местоположения физического
устройства, но и файл с записанным логом данных.
Это может быть полезно, например, когда под рукой нет устройства с модулем геопозиционирования,
но приложение создать нужно.
Для этих целей можно использовать журнал в формате NMEA.
NMEA — стандартный формат для хранения информации о передвижениях по треку.
Qt позволяет использовать его для воспроизведения записанных ранее движений.
Для использования данной возможности необходимо разместить файл с данными на устройстве
и указать его в качестве источника данных.
Нужно обратить внимание, что невозможно одновременно использовать nmea-файл и другие источники
позиционирования одновременно.
Для считывания файла приложением необходимо сделать следующее:
1. В .pro файл проекта добавить код, указывающий исходное расположения nmea-файла
и его будущую директорию при установке приложения на устройстве.
2. В переменную nmeafiles.files помещаются текущие путь и название nmea-файлов, в переменной
nmeafiles.path указывается путь, по которому файлы будут размещены на устройстве.
3. Внутри QML кода nmea-файл указывается в качестве источника в объекте PositionSource.
После установки nmeaSource вернуться к использованию других способов геопозиционирования
будет невозможно.
# Задания по теме «Qt Postioning»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Геоданные
1. В ресурсы проекта в qml.qrc добавить nmea-файл.
2. В элементе positionSource компонента PositioningPage в свойство nmeaSource прописать путь
к файлу path.nmea в системе.
3. В директории assets создать компонент NmeaPositionSource:
```qml
import QtPositioning 5.3
PositionSource {
updateInterval: 1000
nmeaSource: "../nmea/path.nmea"
active: true
}
```
4. В файле PositioningPage.qml заменить созданным компонентом PositionSource,
убрать более не нужный импорт QtPositioning.
Запустите приложение и проверьте, что оно изменяет геоданные со временем.
# Тесты по теме «Qt Postioning»
Copyright © 2016–2025 ООО «Открытая мобильная платформа».
Этот документ предоставляется в соответствии
с [Публичной лицензией Creative Commons с указанием авторства версии 4.0 Международная](../../LICENSE.CC-BY-4.0.ru.md).
## Text
Какое разрешение позволяет использовать API геолокации?
---
Location
## Multiple choice
Какие QML-типы корректно использовать для отображения географической области?
---
* **geocircle**
* geoshape
* coordinate
* **georectangle**
## Single choice
Какая основная функция (применение) типа Position?
---
* Предоставлять данные о текущем положении пользователю.
* **Является одним из свойств PositionSource, как основная единица данных, доступных от источников данных о местоположении.**
* Содержит в себе свойство PositionSource, в котором указывается источник данных о местоположении.
* Передает источнику запрос на получение данных.
## Multiple choice
```qml
PositionSource {
id: src
...
onPositionChanged: {
var coord = src.position.coordinate;
console.log("Coordinate:", coord.latitude, coord.speed);
}
}
```
Какие данные о геопозиции будут выведены в консоль?
---
* **широта**
* долгота
* высота над уровнем моря
* **скорость движения**
## Single choice
```qml
import QtPositioning 5.2
Item {
property variant region: QtPositioning.shape()
}
```
Географическая область какой формы здесь задаётся?
---
* прямоугольник с коррдинатами по умолчанию (0, 0, 100, 100)
* полигон
* **абстрактная область**
## Single choice
```qml
QtPositioning.coordinate(57.62227626, 39.92667952)
PositionSource{
id: positionSource
active: true
}
Label {
text: qsTr("Distance: %1 m").
arg(positionSource.position.coordinate.distanceTo(destination))
}
```
Откуда отсчитывается расстояние в positionSource.position.coordinate.distanceTo(destination)?
---
* **текущее положение устройства**
* начало координат
## Single choice
В объекте какого типа содержится информация о местоположении в конкретный момент времени?
---
* **Position**
* Address
* Location
* coordinate
## Single choice
Возможно ли одновременно использовать источники геоданных NMEA и другие?
---
* Да
* **Нет**
## Single choice
Каким образом используется файл с записанным перемещением по треку?
---
* Файл указывается в свойстве nmeaSource объекта Postion.
* **Файл указывается в свойстве nmeaSource объекта PostionSource.**
* Файл указывается в свойстве nmea объекта Postion.
* Файл указывается в свойстве nmea объекта PostionSource.
## Single choice
С помощью элемента какого типа можно вызвать методы для геолокации?
---
* **coordinate**
* georectangle
* geoshape
* QtPositioning
## Single choice
Возможно ли создать элемент типа Position, не используя методы типа PositionSource?
---
* **Да**
* Нет
## Single choice
Существует ли способ программно получать данные о местоположении на устройствах
без модуля геопозиционирования?
---
* Нет, данные можно получать только от реальных источников.
* **Да, если использовать в качестве источника файл NMEA.**
* Да, если есть доступ в интернет.
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <edu@omp.ru>
// SPDX-License-Identifier: CC-BY-4.0
import QtQuick 2.6
import QtQuick.Controls 2.4
import QtPositioning 5.3
import QtLocation 5.0
import "assets"
Item {
width: 640
height: 480
NmeaPositionSource { id: positionSource }
Map {
id: map
anchors.fill: parent
plugin: Plugin {
allowExperimental: true
name: "osm"
required.mapping: Plugin.AnyMappingFeatures
required.geocoding: Plugin.AnyGeocodingFeatures
}
gesture.enabled: true
zoomLevel: zoomSlider.value
Binding {
target: map
property: "center"
value: positionSource.position.coordinate
when: positionSource.position.coordinate.isValid
}
MouseArea {
anchors.fill: parent
onClicked: {
var mouseCoordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y));
var circle = Qt.createQmlObject("import QtLocation 5.0; MapCircle {}", map);
circle.center = mouseCoordinate;
circle.radius = 50.0;
circle.color = "red";
circle.border.width = 3;
map.addMapItem(circle);
}
onPressAndHold: {
var mouseCoordinate = map.toCoordinate(Qt.point(mouse.x, mouse.y));
var circle = mapQuickCircleComponent.createObject(map, {
coordinate: mouseCoordinate,
diameter: footprints.diameter,
color: "green"
});
map.addMapItem(circle);
}
}
Component.onCompleted: center = QtPositioning.coordinate(55.751244, 37.618423)
}
Slider {
id: zoomSlider
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
}
from: map.minimumZoomLevel
to: map.maximumZoomLevel
value: 11
}
Component {
id: mapQuickCircleComponent
MapQuickCircle { }
}
Footprints {
id: footprints
visible: positionSource.position.coordinate.isValid
coordinate: positionSource.position.coordinate
diameter: Math.min(map.width, map.height) / 8
}
Component.onCompleted: map.addMapItem(footprints)
}
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <edu@omp.ru>
// SPDX-License-Identifier: CC-BY-4.0
import QtQuick 2.6
import QtLocation 5.0
MapQuickItem {
property alias diameter: image.width
sourceItem: Image {
id: image
source: Qt.resolvedUrl("../graphics/footprints.svg")
height: width
fillMode: Image.PreserveAspectFit
}
anchorPoint {
x: sourceItem.width / 2
y: sourceItem.height / 2
}
}
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <edu@omp.ru>
// SPDX-License-Identifier: CC-BY-4.0
import QtQuick 2.6
import QtLocation 5.0
MapQuickItem {
property alias diameter: rectangle.width
property alias color: rectangle.color
sourceItem: Rectangle {
id: rectangle
height: width
radius: width / 2
}
anchorPoint {
x: sourceItem.width / 2
y: sourceItem.height / 2
}
}
// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <edu@omp.ru>
// SPDX-License-Identifier: CC-BY-4.0
import QtPositioning 5.3
PositionSource {
updateInterval: 1000
nmeaSource: "../nmea/path.nmea"
active: true
}
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 112.3 112.3" style="enable-background:new 0 0 112.3 112.3;" xml:space="preserve">
<g>
<g>
<path style="fill:#010002;" d="M107.435,31.472c0.959-1.317,1.6-2.97,1.732-4.831c0.125-1.804-0.218-3.543-0.991-5.021
c-0.744-1.421-1.886-2.466-3.207-3.121c-0.809-3.436-3.275-5.977-6.474-6.338c-1.51-3.131-4.245-5.2-7.437-5.2l-0.401,0.011
c-0.766,0.043-1.482,0.24-2.172,0.501c-1.725-2.537-4.266-4.148-7.154-4.148l-0.429,0.011c-1.571,0.086-2.981,0.659-4.205,1.532
c-2.523-3.436-6.17-5.361-9.967-4.756c-6.17,0.991-9.838,7.859-8.536,15.972c0.666,4.126,2.548,7.566,5.046,9.82
c-0.905,1.313-1.557,2.759-1.836,4.359c-1.56,8.983,4.996,14.53,9.334,18.195c0.973,0.827,1.904,1.6,2.648,2.369
c2.659,2.745,3.124,7.312,1.045,10.178c-0.147,0.204-0.39,0.49-0.691,0.852c-3.067,3.711-11.23,13.567-8.042,24.279
c1.814,6.116,6.048,9.91,12.587,11.27c1.832,0.379,3.586,0.573,5.222,0.573c9.878,0,15.969-6.854,16.298-18.331
c0.129-4.391,0.816-7.831,2.176-10.865C106.447,58.649,113.683,42.172,107.435,31.472z M102.17,23.137
c1.027,0.072,1.757,1.474,1.643,3.128c-0.118,1.653-1.041,2.938-2.065,2.867c-1.02-0.072-1.757-1.474-1.639-3.128
S101.15,23.065,102.17,23.137z M97.829,17.457c1.278,0.089,2.201,1.843,2.054,3.915c-0.147,2.076-1.303,3.683-2.588,3.59
c-1.278-0.089-2.197-1.847-2.047-3.915C95.395,18.971,96.551,17.367,97.829,17.457z M90.954,12.328
c1.732-0.093,3.264,2.104,3.418,4.907c0.15,2.802-1.127,5.154-2.867,5.247c-1.729,0.093-3.257-2.101-3.411-4.907
C87.941,14.773,89.222,12.425,90.954,12.328z M81.195,8.696c2.137-0.115,4.019,2.591,4.209,6.041
c0.19,3.457-1.392,6.349-3.525,6.467c-2.137,0.118-4.015-2.588-4.205-6.041C77.483,11.709,79.062,8.814,81.195,8.696z
M63.494,15.234c-0.795-4.932,1.034-9.33,4.087-9.82c3.046-0.487,6.159,3.114,6.95,8.045c0.795,4.932-1.031,9.33-4.083,9.82
C67.405,23.77,64.284,20.166,63.494,15.234z M97.067,66.627c-1.836,4.083-2.498,8.414-2.627,12.873
c-0.136,4.753-1.568,15.461-15.06,12.655c-4.058-0.845-7.161-2.913-8.536-7.541c-2.713-9.115,6.406-18.345,7.934-20.446
c3.668-5.06,2.913-12.476-1.532-17.071c-3.844-3.973-11.882-8.256-10.554-15.915c1.6-9.194,25.127-9.985,35.008,1.417
C108.405,40.34,101.576,56.384,97.067,66.627z"/>
<path style="fill:#010002;" d="M45.571,14.429c-3.786-0.608-7.433,1.317-9.964,4.756c-1.228-0.877-2.638-1.449-4.216-1.535
l-0.422-0.011c-2.888,0-5.426,1.607-7.154,4.151c-0.691-0.265-1.414-0.462-2.183-0.508l-0.39-0.011
c-3.192,0-5.923,2.069-7.433,5.2c-3.178,0.361-5.633,2.87-6.46,6.281c-0.827,0.401-1.585,0.97-2.219,1.7
c-1.446,1.668-2.172,4.041-1.997,6.514c0.132,1.857,0.773,3.504,1.729,4.821c-6.242,10.697,0.991,27.178,5.472,37.36
c1.349,2.996,2.033,6.431,2.162,10.826c0.336,11.477,6.431,18.327,16.302,18.327c1.632,0,3.389-0.193,5.222-0.576
c6.531-1.36,10.765-5.146,12.587-11.263c3.189-10.708-4.967-20.564-8.038-24.275c-0.301-0.365-0.544-0.651-0.694-0.855
c-2.079-2.87-1.614-7.44,1.045-10.185c0.744-0.769,1.678-1.542,2.652-2.369c4.338-3.668,10.89-9.216,9.326-18.195
c-0.276-1.596-0.927-3.046-1.832-4.355c2.498-2.255,4.381-5.694,5.039-9.817c0.544-3.357,0.211-6.728-0.941-9.495
C51.669,17.328,48.906,14.966,45.571,14.429z M31.101,23.011c2.137,0.118,3.715,3.013,3.525,6.467
c-0.19,3.457-2.072,6.159-4.209,6.041c-2.137-0.115-3.711-3.01-3.522-6.467C27.086,25.602,28.965,22.897,31.101,23.011z
M21.342,26.644c1.729,0.097,3.013,2.444,2.86,5.247c-0.15,2.806-1.682,5-3.411,4.907c-1.736-0.093-3.017-2.444-2.863-5.247
C18.082,28.748,19.613,26.551,21.342,26.644z M14.467,31.772c1.281-0.089,2.437,1.514,2.584,3.59
c0.147,2.069-0.773,3.822-2.051,3.915c-1.281,0.093-2.437-1.514-2.588-3.59C12.266,33.619,13.186,31.865,14.467,31.772z
M10.126,37.456c1.02-0.072,1.947,1.21,2.061,2.863c0.118,1.653-0.619,3.056-1.639,3.128s-1.943-1.21-2.061-2.867
C8.365,38.93,9.102,37.527,10.126,37.456z M35.052,61.416c-4.445,4.592-5.2,12.011-1.532,17.071
c1.525,2.101,10.647,11.331,7.934,20.446c-1.378,4.624-4.481,6.696-8.536,7.541c-13.496,2.806-14.924-7.902-15.063-12.655
c-0.125-4.459-0.791-8.79-2.627-12.873c-4.509-10.243-11.338-26.29-4.635-34.024c9.885-11.406,33.412-10.611,35.008-1.417
C46.938,53.16,38.896,57.443,35.052,61.416z M48.802,29.55c-0.791,4.932-3.908,8.536-6.954,8.045
c-3.046-0.49-4.874-4.889-4.083-9.82c0.795-4.932,3.908-8.532,6.954-8.045C47.768,20.22,49.6,24.618,48.802,29.55z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>
# SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <edu@omp.ru>
# SPDX-License-Identifier: CC-BY-4.0
QT += quick
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Refer to the documentation for the
# deprecated API to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать