Spec-Zone.ru › Qt 5.13

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

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

Примеры

Пример Flickr

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

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

QGeoAreaMonitorInfo

Описывает параметры области или региона, которые необходимо отслеживать на предмет близости

QGeoAreaMonitorSource

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

QGeoAddress

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

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.13/location-positioning-cpp.html

Spec-Zone.ru

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