定位(C++)

定位

Qt 地理定位 API 的定位组件涉及某些地方的地理位置、大小和地址。定位包含一个QGeoCoordinate类,其中包含纬度、经度和海拔高度(以米为单位)。QGeoLocation包含一个QGeoCoordinate,以及地址和大小信息(一个边界框),使得位置可以不仅仅是数学点。可以监控进入或离开定义的边界框区域。API 还允许开发者控制位置信息的源。

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

  • 报告位置的时间日期
  • 报告该位置的设备的速度
  • 报告位置的海拔(海平面以上高度)
  • 设备相对于真北的航向,以度为单位

这些数据可以通过各种方法提取。最著名的定位方法之一是 GPS(全球定位系统),这是一个公开可用的系统,使用来自地球轨道卫星接收到的无线电波信号来计算接收器的精确位置和时间。另一种流行的方法是通过使用当前为接收设备提供服务的基站标识符的“基站标识符定位”。这些以及其他定位方法都可以与位置 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() 返回的默认位置数据源的数据。

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) 来实现。如果没有设置更新间隔,或者以0的值调用 setUpdateInterval(),则源将使用默认间隔或其他内部逻辑来确定何时提供更新。

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

NMEA 数据

NMEA(http://en.wikipedia.org/wiki/NMEA_0183)是一种常见的基于文本的协议,用于指定导航数据。为了方便起见,提供了 QNmeaPositionInfoSource 以使客户端应用程序能够以实时模式(例如,从GPS设备流式传输时)或模拟模式(例如,从NMEA日志文件读取时)读取和分发NMEA数据。在模拟模式下,源将根据每个NMEA语句的时间戳发出更新,从而生成记录数据的“回放”。

通常,默认位置源(由 QGeoPositionInfoSource::createDefaultSource() 返回)以及 QNmeaPositionInfoSource 类提供的功能足以检索位置数据。然而,在某些情况下,开发者可能希望编写他们自己的自定义位置数据源。

日志文件位置源示例(C++)演示了如何继承 QGeoPositionInfoSource 来创建自定义定位源。

例子

日志文件位置源示例

日志文件位置源示例演示了如何将日志文件位置源继承为QGeoPositionInfoSource来创建自定义的位置源。

天气信息示例

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

定位类

QGeoAddress

表示QGeoLocation的地址

QGeoAreaMonitorInfo

描述了用于 proximity 监测的区域或区域的参数

QGeoAreaMonitorSource

启用对指定坐标集的位置变化检测

QGeoCircle

定义一个圆形地理区域

QGeoCoordinate

定义地球表面上的地理位置

QGeoLocation

表示有关位置的基本信息

QGeoPath

定义一个地理路径

QGeoPolygon

定义一个地理多边形

QGeoPositionInfo

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

QGeoPositionInfoSource

位置更新分布的抽象基类

QGeoRectangle

定义一个地理矩形区域

QGeoSatelliteInfo

包含有关卫星的基本信息

QGeoSatelliteInfoSource

卫星信息更新的抽象基类

QGeoShape

定义一个地理区域

QNmeaPositionInfoSource

使用NMEA数据源的定位信息

QNmeaSatelliteInfoSource

使用NMEA数据源的卫星信息

© 2024 Qt公司。在此包含的文档贡献的版权归各自的所有者所有。此处提供的文档根据免费软件基金会发布的GNU自由文档许可(FDL)版本1.3的条款进行许可。Qt及其相关标志是芬兰及其它国家和地区Qt公司的商标。所有其他商标均为各自所有者的财产。