Позиционирование (C++)
Позиционирование
Компонент позиционирования API Qt Location связан с географическим положением, размером и адресом места. Позиционирование содержит класс QGeoCoordinate, содержащий широту, долготу и высоту в метрах. QGeoLocation содержит QGeoCoordinate плюс информацию об адресе и размере (прямоугольник ограничивающей рамки), чтобы позиции могли быть больше, чем просто математические точки. Можно отслеживать перемещения внутрь или наружу определенных областей ограничивающей рамки. API также позволяет разработчику контролировать источник информации о местоположении.
Данные местоположения включают в себя точно определённое положение на поверхности Земли — как указано координатами широты и долготы — наряду с связанными данными, такими как:
- Дата и время, в которые было сообщено о местоположении
- Скорость устройства, которое сообщило о местоположении
- Высота указанного местоположения (высота над уровнем моря)
- Азимут устройства в градусах относительно истинного севера
Эти данные можно извлечь с помощью различных методов. Одним из наиболее известных методов позиционирования является GPS (Глобальная система позиционирования), общедоступная система, которая использует радиоволновые сигналы, полученные от спутников, вращающихся вокруг Земли, для расчёта точного положения и времени приёмника. Другим популярным методом является «позиционирование по идентификатору сотовой ячейки», которое использует идентификатор сотовой ячейки, обслуживающей устройство приёма, для расчёта его приблизительного местоположения. Эти и другие методы позиционирования могут быть использованы с API местоположения; единственное требование к источнику данных местоположения в API заключается в том, что он предоставляет координаты широты и долготы со значением даты/времени, а также необязательно предоставляет другие указанные выше атрибуты.
Источники данных местоположения создаются путём наследования от QGeoPositionInfoSource и предоставления объектов QGeoPositionInfo через сигнал QGeoPositionInfoSource::positionUpdated(). Клиенты, которым нужны данные о местоположении, могут подключиться к сигналу positionUpdated() и вызвать startUpdates() или requestUpdate() для запуска распространения данных о местоположении. Распространение данных о местоположении можно остановить, вызвав функцию stopUpdates().
На некоторых платформах может быть доступен источник данных по умолчанию. Вызовите QGeoPositionInfoSource::createDefaultSource() для создания экземпляра источника данных по умолчанию. Метод возвращает nullptr, если на данной платформе источник по умолчанию недоступен.
Если возникнет проблема с доступом к источнику информации, будет испущен сигнал errorOccurred().
Класс QGeoAreaMonitorSource позволяет клиентским приложениям получать уведомления, когда принимающее устройство вошло или вышло из определённой области, как указано координатами и радиусом. Если платформа предоставляет встроенную поддержку мониторинга областей, метод QGeoAreaMonitorSource::createDefaultSource() возвращает экземпляр монитора областей по умолчанию.
Информация о спутниках также может распространяться через класс QGeoSatelliteInfoSource. Вызовите QGeoSatelliteInfoSource::createDefaultSource() для создания экземпляра источника данных о спутниках по умолчанию для платформы, если он доступен. В качестве альтернативы, клиенты могут наследоваться от него, чтобы предоставить собственный источник данных о спутниках.
Запрос данных о местоположении из источников данных
Для получения данных из источника подключитесь к его сигналу positionUpdated(), затем вызовите либо startUpdates(), либо requestUpdate(), чтобы начать.
Вот пример клиента, который получает данные из источника данных местоположения по умолчанию, как возвращается QGeoPositionInfoSource::createDefaultSource():
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QObject *parent = 0)
: QObject(parent)
{
QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(this);
if (source) {
connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)),
this, SLOT(positionUpdated(QGeoPositionInfo)));
source->startUpdates();
}
}
private slots:
void positionUpdated(const QGeoPositionInfo &info)
{
qDebug() << "Position updated:" << info;
}
}; Управление аспектами источников данных
Метод QGeoPositionInfoSource::setUpdateInterval() может быть использован для управления скоростью получения обновлений местоположения. Например, если клиентскому приложению требуются обновления только один раз каждые 30 секунд, оно может вызвать setUpdateInterval(30000). Если интервал обновления не установлен или setUpdateInterval() вызывается со значением 0, источник использует интервал по умолчанию или какую-либо другую внутреннюю логику для определения времени предоставления обновлений.
QGeoPositionInfoSource::setPreferredPositioningMethods() позволяет клиентским приложениям запросить использование определенного типа метода позиционирования. Например, если приложение предпочитает использовать только спутниковое позиционирование, которое обеспечивает довольно точное позиционирование на открытом воздухе, но может быть энергоёмким, оно может вызвать этот метод со значением QGeoPositionInfoSource::SatellitePositioningMethods. Однако, этот метод следует использовать только в специализированных клиентских приложениях; в большинстве случаев не следует изменять методы позиционирования по умолчанию, так как источник может использовать различные методы позиционирования, которые могут быть полезны для приложения.
Данные NMEA
NMEA — это распространённый текстовый протокол для указания навигационных данных. Для удобства предоставляется QNmeaPositionInfoSource, который позволяет клиентским приложениям читать и распространять данные NMEA в режиме реального времени (например, при потоковой передаче данных со спутникового устройства GPS) или в режиме моделирования (например, при чтении из файла журнала NMEA). В режиме моделирования источник будет генерировать обновления в соответствии со временем метки каждой фразы NMEA, чтобы воспроизвести «повтор» записанных данных.
Как правило, возможности, предоставляемые источником данных местоположения по умолчанию, возвращаемым QGeoPositionInfoSource::createDefaultSource(), наряду с классом QNmeaPositionInfoSource, достаточно для получения данных о местоположении. Однако в некоторых случаях разработчики могут захотеть написать собственный пользовательский источник данных о местоположении.
Пример источника данных местоположения файла журнала (C++) демонстрирует, как наследоваться от QGeoPositionInfoSource для создания пользовательского источника позиционирования.
Примеры
Пример Flickr
Пример Flickr Example использует текущее местоположение для загрузки миниатюрных изображений с Flickr, соответствующих текущему местоположению.
Классы позиционирования
Представляет адрес QGeoLocation |
|
Описывает параметры области или региона, которые нужно отслеживать на предмет близости |
|
Обеспечивает обнаружение изменений близости для заданного набора координат |
|
Определяет круговую географическую область |
|
Определяет географическое положение на поверхности Земли |
|
Представляет основную информацию о местоположении |
|
Определяет географический путь |
|
Определяет географический многоугольник |
|
Содержит информацию, собранную о глобальном положении, направлении и скорости в определённый момент времени |
|
Абстрактный базовый класс для распространения обновлений местоположения |
|
Определяет прямоугольную географическую область |
|
Содержит основную информацию о спутнике |
|
Абстрактный базовый класс для распространения обновлений информации о спутниках |
|
Определяет географическую область |
|
Данные о местоположении, использующие источник данных NMEA |
|
Данные о спутнике, использующие источник данных NMEA |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/location-positioning-cpp.html