Позиционирование (C++)
Позиционирование
Компонент позиционирования API Qt Location связан с географическим положением, размером и адресом места. Позиционирование содержит класс QGeoCoordinate, содержащий широту, долготу и высоту в метрах. QGeoLocation содержит QGeoCoordinate плюс информацию об адресе и размере (прямоугольник ограничивающей области), так что позиции могут быть больше, чем математические точки. Движение в или из определенных областей ограничивающей области может отслеживаться. API также позволяет разработчику контролировать источник информации о местоположении.
Данные о местоположении включают точно заданное положение на поверхности Земли — как предоставлено координатами широты и долготы — вместе с связанными данными, такими как:
- Дата и время, в которые было сообщено о местоположении
- Скорость устройства, которое сообщило о местоположении
- Высота сообщенного местоположения (высота над уровнем моря)
- Азимут устройства в градусах, относительно истинного севера
Эти данные могут быть извлечены с помощью различных методов. Одним из наиболее известных методов позиционирования является GPS (глобальная система позиционирования), общедоступная система, которая использует радиоволновые сигналы, принимаемые со спутников, вращающихся вокруг Земли, для вычисления точного положения и времени приемника. Другим популярным методом является «позиционирование по идентификатору ячейки», который использует идентификатор ячейки ячейки сотовой связи, которая в настоящее время обслуживает устройство-приемник, для вычисления его приблизительного местоположения. Эти и другие методы позиционирования могут быть использованы с API местоположений; единственное требование к источнику данных о местоположении в 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 в режиме реального времени (например, при потоковой передаче с GPS-устройства) или в режиме моделирования (например, при чтении из файла журнала NMEA). В режиме моделирования источник будет генерировать обновления в соответствии со значением отметки времени каждого предложения NMEA, чтобы воспроизвести «повторное воспроизведение» записанных данных.
Как правило, возможностей, предоставляемых источником позиционирования по умолчанию, возвращаемым QGeoPositionInfoSource::createDefaultSource(), наряду с классом QNmeaPositionInfoSource, достаточно для получения данных о местоположении. Однако в некоторых случаях разработчики могут захотеть написать собственный пользовательский источник данных о местоположении.
Пример Log File Position Source (C++) демонстрирует, как наследоваться от QGeoPositionInfoSource для создания пользовательского источника позиционирования.
Примеры
Пример Flickr
Пример Flickr Example использует текущее местоположение для загрузки миниатюрных изображений из Flickr, относящихся к текущему местоположению.
Классы позиционирования
Представляет адрес QGeoLocation |
|
Описывает параметры области или региона, которые необходимо отслеживать для определения близости |
|
Обеспечивает возможность определения изменений близости для заданного набора координат |
|
Определяет круговую географическую область |
|
Определяет географическое положение на поверхности Земли |
|
Представляет основную информацию о местоположении |
|
Определяет географический маршрут |
|
Определяет географический многоугольник |
|
Содержит информацию, собранную о глобальном положении, направлении и скорости в определённый момент времени |
|
Абстрактный базовый класс для распространения обновлений позиционирования |
|
Определяет прямоугольную географическую область |
|
Содержит основную информацию о спутнике |
|
Абстрактный базовый класс для распространения обновлений информации о спутниках |
|
Определяет географическую область |
|
Информация о местоположении, использующая источник данных NMEA |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/location-positioning-cpp.html