Spec-Zone.ru › Qt 5.14

Позиционирование (C++)

Позиционирование

Компонент позиционирования Qt Location API связан с географическим положением, размером и адресом какого-либо места. Позиционирование содержит класс 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, достаточно для извлечения данных о местоположении. Однако в некоторых случаях разработчики могут захотеть написать собственный пользовательский источник данных о местоположении.

Источник данных из файла журнала (C++) демонстрирует, как наследоваться от QGeoPositionInfoSource для создания пользовательского источника позиционирования.

Примеры

Пример Flickr

В примере Flickr используется текущее местоположение для загрузки миниатюрных изображений из Flickr, относящихся к текущему местоположению.

Классы позиционирования

QGeoAddress

Представляет адрес QGeoLocation

QGeoAreaMonitorInfo

Описывает параметры области или региона для отслеживания близости

QGeoAreaMonitorSource

Обеспечивает обнаружение изменений близости для заданного набора координат

QGeoCircle

Определяет круглую географическую область

QGeoCoordinate

Определяет географическую точку на поверхности Земли

QGeoLocation

Представляет основную информацию о местоположении

QGeoPath

Определяет географический маршрут

QGeoPolygon

Определяет географический многоугольник

QGeoPositionInfo

Содержит информацию, собранную о глобальном местоположении, направлении и скорости в определённый момент времени

QGeoPositionInfoSource

Абстрактный базовый класс для распространения обновлений местоположения

QGeoRectangle

Определяет прямоугольную географическую область

QGeoSatelliteInfo

Содержит основную информацию о спутнике

QGeoSatelliteInfoSource

Абстрактный базовый класс для распространения обновлений информации о спутниках

QGeoShape

Определяет географическую область

QNmeaPositionInfoSource

Данные о местоположении с использованием источника данных NMEA

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/location-positioning-cpp.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API