Позиционирование (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/qt-5.9/location-positioning-cpp.html