Позиционирование (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 Example используется текущее местоположение для скачивания миниатюрных изображений из Flickr, соответствующих текущему местоположению.
Классы позиционирования
Представляет адрес QGeoLocation |
|
Описывает параметры области или региона, которые должны отслеживаться на предмет близости |
|
Обеспечивает обнаружение изменений близости для заданного набора координат |
|
Определяет круглую географическую область |
|
Определяет географическую точку на поверхности Земли |
|
Представляет основные сведения о местоположении |
|
Определяет географический путь |
|
Определяет географический многоугольник |
|
Содержит информацию, полученную о глобальном местоположении, направлении и скорости в определённый момент времени |
|
Абстрактный базовый класс для распространения обновлений положения |
|
Определяет прямоугольную географическую область |
|
Содержит основные сведения о спутнике |
|
Абстрактный базовый класс для распространения обновлений информации о спутниках |
|
Определяет географическую область |
|
Данные местоположения, использующие источник данных NMEA |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/location-positioning-cpp.html