本页内容

定位(C++)

定位

Qt Location API 的“定位”组件用于处理某个地点的地理位置、面积和地址。定位组件包含一个 `QGeoCoordinate ` 类,其中包含以米为单位的纬度、经度和海拔高度。`QGeoLocation ` 包含一个 `QGeoCoordinate ` 以及地址和面积信息(一个边界框),从而使位置信息不仅限于数学坐标点。 可以监控进入或离开定义的边界框区域的移动情况。该 API 还允许开发者控制位置信息的来源。

位置数据涉及地球表面上一个精确定位的点——由经纬度坐标提供——以及相关数据,例如:

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

这些数据可通过多种方法提取。最著名的定位方法之一是GPS(全球定位系统),这是一个公开可用的系统,它利用从地球轨道卫星接收的无线电波信号,计算接收器的精确位置和时间。 另一种常见的方法是“基站标识定位”,它利用当前为接收设备提供服务的基站的基站标识来计算其大致位置。 这些及其他定位方法均可与 Location API 配合使用;API 内对位置数据源的唯一要求是,其必须提供带日期/时间值的经纬度坐标,并可选择提供上述列出的其他属性。

位置数据源的创建方式是继承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_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:
    voidpositionUpdated(constQGeoPositionInfo&info)
    {
        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++ 插件中,利用用户的当前位置从 Web 服务中获取本地内容。

定位类

QGeoAddress

表示 QGeoLocation 的地址

QGeoAreaMonitorInfo

描述需要进行邻近性监测的区域或范围的参数

QGeoAreaMonitorSource

支持检测指定坐标集的邻近状态变化

QGeoCircle

定义一个圆形地理区域

QGeoCoordinate

定义地球表面的地理位置

QGeoLocation

表示有关位置的基本信息

QGeoPath

定义一条地理路径

QGeoPolygon

定义一个地理多边形

QGeoPositionInfo

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

QGeoPositionInfoSource

用于分发位置更新的抽象基类

QGeoRectangle

定义一个矩形地理区域

QGeoSatelliteInfo

包含有关卫星的基本信息

QGeoSatelliteInfoSource

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

QGeoShape

定义一个地理区域

QNmeaPositionInfoSource

使用 NMEA 数据源的位置信息

QNmeaSatelliteInfoSource

使用NMEA数据源的卫星信息

© 2026 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.