Позиционирование (C++)
Позиционирование
Компонент позиционирования API Qt Location связан с географическим положением, размером и адресом места. Позиционирование содержит класс QGeoCoordinate, содержащий широту, долготу и высоту в метрах. QGeoLocation содержит QGeoCoordinate плюс информацию об адресе и размерах (прямоугольник ограничивающей рамки), так что позиции могут быть больше, чем просто математические точки. Можно отслеживать перемещения в пределах или за пределами определенных областей ограничивающей рамки. API также позволяет разработчику контролировать источник информации о местоположении.
Данные местоположения включают точно определённое положение на поверхности Земли — как предоставляется координатами широты и долготы — вместе с сопутствующими данными, такими как:
- Дата и время, в которые было сообщено о положении
- Скорость устройства, которое сообщило о положении
- Высота сообщённого положения (высота над уровнем моря)
- Азимут устройства в градусах, относительно истинного севера
Эти данные могут быть извлечены различными способами. Один из наиболее известных методов позиционирования — GPS (Глобальная система позиционирования), общедоступная система, которая использует радиоволновые сигналы, принимаемые со спутников, вращающихся вокруг Земли, для расчёта точного положения и времени приёмника. Другой популярный метод — «Позиционирование по идентификатору ячейки», который использует идентификатор ячейки соты, которая в данный момент обслуживает приёмное устройство, для расчёта его приблизительного местоположения. Эти и другие методы позиционирования могут использоваться с API Location; единственное требование к источнику данных местоположения в API — это предоставление координат широты и долготы со значением даты/времени, с возможностью предоставления других указанных выше атрибутов.
Источники данных местоположения создаются путём наследования от QGeoPositionInfoSource и предоставления объектов QGeoPositionInfo через сигнал QGeoPositionInfoSource::positionUpdated(). Клиенты, которым требуются данные о местоположении, могут подключиться к сигналу positionUpdated() и вызвать startUpdates() или requestUpdate(), чтобы инициировать распределение данных о местоположении. Распределение данных о местоположении может быть остановлено путём вызова функции stopUpdates().
На некоторых платформах может быть доступен источник позиций по умолчанию. Вызовите QGeoPositionInfoSource::createDefaultSource() для создания экземпляра источника позиций по умолчанию; метод возвращает 0, если для платформы нет источника по умолчанию.
Если возникает проблема с доступом к источнику информации, то генерируется сигнал error().
Класс QGeoAreaMonitorSource позволяет клиентским приложениям получать уведомления, когда принимающее устройство вошло или вышло из определённой области, заданной координатами и радиусом. Если платформа поддерживает мониторинг области, QGeoAreaMonitorSource::createDefaultMonitor() возвращает экземпляр монитора области по умолчанию.
Информацию о спутниках также можно распространять через класс 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 в режиме реального времени (например, при потоковой передаче данных со спутникового устройства) или в режиме моделирования (например, при чтении из файла журнала NMEA). В режиме моделирования источник будет генерировать обновления в соответствии со временем отметки каждого предложения NMEA, чтобы воспроизвести «воспроизведение» записанных данных.
Как правило, возможности, предоставляемые источником позиций по умолчанию, возвращённым QGeoPositionInfoSource::createDefaultSource(), наряду с классом QNmeaPositionInfoSource, достаточны для получения данных о местоположении. Однако в некоторых случаях разработчики могут захотеть написать свой собственный источник данных о местоположении.
Пример «Источник позиций файла журнала» (C++) демонстрирует, как наследовать от QGeoPositionInfoSource, чтобы создать пользовательский источник позиционирования.
Примеры
Пример Flickr
Пример Flickr использует текущее местоположение для загрузки миниатюрных изображений из Flickr, относящихся к текущему местоположению.
Классы позиционирования
Представляет адрес QGeoLocation |
|
Описывает параметры области или региона, которые необходимо отслеживать для близости |
|
Включает возможность обнаружения изменений близости для набора заданных координат |
|
Определяет круговую географическую область |
|
Определяет географическое положение на поверхности Земли |
|
Представляет основные сведения о местоположении |
|
Определяет географический путь |
|
Определяет географический многоугольник |
|
Содержит информацию, собранную о глобальном положении, направлении и скорости в определённый момент времени |
|
Абстрактный базовый класс для распространения обновлений местоположения |
|
Определяет прямоугольную географическую область |
|
Содержит основные сведения о спутнике |
|
Абстрактный базовый класс для распространения обновлений информации о спутниках |
|
Определяет географическую область |
|
Информация о местоположении, использующая источник данных NMEA |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/location-positioning-cpp.html