定位(C++)

定位

Qt Location API 的 "定位"(Positioning)组件与某个地点的地理位置、大小和地址有关。定位包含一个QGeoCoordinate 类,其中包含以米为单位的纬度、经度和海拔高度。QGeoLocation 包含QGeoCoordinate 以及地址和大小信息(边界框),因此位置可以不仅仅是数学上的点。可以监控进入或离开定义边界框区域的移动。应用程序接口还允许开发人员控制位置信息的来源。

位置数据包括地球表面的精确定位(由经纬度坐标提供)以及相关数据,如

  • 报告位置的日期和时间
  • 报告位置的设备的速度
  • 报告位置的高度(海拔高度)
  • 设备的方位(相对于真北的度数

这些数据可以通过多种方法提取。最著名的定位方法之一是 GPS(全球定位系统),这是一种公开可用的系统,利用从地球轨道卫星接收到的无线电波信号来计算接收器的精确位置和时间。另一种流行的方法是 "小区标识符定位",它使用当前为接收设备提供服务的小区站点的小区标识符来计算接收设备的大致位置。这些定位方法和其他定位方法均可与定位应用程序接口一起使用;在应用程序接口中,对定位数据源的唯一要求是提供带有日期/时间值的经纬度坐标,并可选择提供上述其他属性。

位置数据源通过子类化QGeoPositionInfoSource 并通过QGeoPositionInfoSource::positionUpdated() 信号提供QGeoPositionInfo 对象来创建。需要位置数据的客户端可以连接到positionUpdated() 信号,并调用startUpdates() 或requestUpdate() 来触发位置数据的分发。位置数据分发可通过调用stopUpdates() 函数停止。

某些平台上可能有默认位置源。调用QGeoPositionInfoSource::createDefaultSource() 创建默认位置源的实例。如果平台上没有可用的默认位置源,该方法将返回nullptr

如果在访问信息源时出现问题,则会发出errorOccurred() 信号。

通过QGeoAreaMonitorSource 类,客户端应用程序可以在接收设备移入或移出特定区域时收到通知,该区域由坐标和半径指定。如果平台提供对区域监控的内置支持,QGeoAreaMonitorSource::createDefaultSource() 方法会返回默认区域监控器的实例。

卫星信息也可以通过QGeoSatelliteInfoSource 类发布。如果平台有默认卫星数据源,则调用QGeoSatelliteInfoSource::createDefaultSource() 创建该数据源的实例。或者,客户端也可以对其进行子类化,以提供自定义的卫星数据源。

从数据源请求位置数据

要从数据源接收数据,请连接到positionUpdated() 信号,然后调用startUpdates() 或requestUpdate() 开始。

下面是一个客户端从默认位置数据源接收数据的示例,数据由QGeoPositionInfoSource::createDefaultSource() 返回:

classMyClass :publicQObject
{Q_OBJECTpublic: 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:voidpositionUpdated(constQGeoPositionInfo信息)    {
        qDebug() << "Position updated:" << info;
    };

控制数据源的各个方面

QGeoPositionInfoSource::setUpdateInterval() 方法可用于控制接收位置更新的速度。例如,如果客户端应用程序只要求每 30 秒更新一次,则可以调用setUpdateInterval(30000) 。如果没有设置更新间隔,或者调用setUpdateInterval() 时的值为 0,那么数据源会使用默认间隔或其他内部逻辑来决定何时提供更新。

QGeoPositionInfoSource::setPreferredPositioningMethods()允许客户端应用程序请求使用某种类型的定位方法。例如,如果应用程序倾向于只使用卫星定位,这种方法可以提供相当精确的室外定位,但会耗费大量电力资源,应用程序可以调用QGeoPositionInfoSource::SatellitePositioningMethods 值的此方法。不过,这种方法只应在专门的客户端应用程序中使用;在大多数情况下,不应更改默认定位方法,因为信号源内部可能会使用多种对应用程序有用的定位方法。

NMEA 数据

NMEA是一种基于文本的通用协议,用于指定导航数据。为方便起见,QNmeaPositionInfoSource 允许客户端应用程序以实时模式(例如,从 GPS 设备流式传输时)或模拟模式(例如,从 NMEA 日志文件读取时)读取和分发 NMEA 数据。在模拟模式下,信号源将根据每个 NMEA 句子的时间戳发送更新,以产生记录数据的 "重放"。

一般来说,由QGeoPositionInfoSource::createDefaultSource() 和QNmeaPositionInfoSource 类返回的默认位置源提供的功能足以检索位置数据。不过,在某些情况下,开发人员可能希望编写自己的自定义位置数据源。

日志文件定位源(C++)示例演示了如何子类化QGeoPositionInfoSource 以创建自定义定位源。

示例

日志文件定位源示例

日志文件定位源示例演示了如何子类化QGeoPositionInfoSource 以创建自定义定位源。

天气信息示例

天气信息示例展示了如何在 QML 的 C++ 插件中使用用户当前位置从网络服务中检索本地内容。

定位类

QGeoAddress

代表 QGeoLocation 的地址

QGeoAreaMonitorInfo

描述要监控的区域的参数

QGeoAreaMonitorSource

可检测指定坐标集的邻近性变化

QGeoCircle

定义一个圆形地理区域

QGeoCoordinate

定义地球表面的地理位置

QGeoLocation

代表位置的基本信息

QGeoPath

定义地理路径

QGeoPolygon

定义地理多边形

QGeoPositionInfo

包含特定时间点收集的全球位置、方向和速度信息

QGeoPositionInfoSource

位置更新分配的抽象基类

QGeoRectangle

定义矩形地理区域

QGeoSatelliteInfo

包含卫星的基本信息

QGeoSatelliteInfoSource

用于分发卫星信息更新的抽象基类

QGeoShape

定义一个地理区域

QNmeaPositionInfoSource

使用 NMEA 数据源的定位信息

QNmeaSatelliteInfoSource

使用 NMEA 数据源的卫星信息

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.