找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

969

积分

0

好友

123

主题
发表于 前天 03:12 | 查看: 6| 回复: 0

在实际开发无人机地面站或车辆监控平台时,实时绘制运动目标的轨迹是一个核心需求。早期的简单实现方式是每次接收到新的坐标点后,直接将标记点“跳跃”到该位置,这会导致移动过程不连续,视觉体验较差。随后,我们尝试使用各大地图厂商提供的轨迹动画API,例如百度地图的BMapLib.LuShu、天地图的T.CarTrack以及高德地图的marker.moveTo()方法。这些API使用起来非常方便,能够实现平滑移动并可控制速度,但它们有一个共同的局限性:需要预先知晓完整的轨迹点集合。这对于轨迹回放场景非常合适,但在实时轨迹显示中,我们无法预知未来坐标,因此并不适用。

那么,如何实现实时的平滑轨迹移动呢?其底层原理均是通过JavaScript计算两点间的距离,然后使用线性插值算法在这两点之间生成一系列过渡坐标点。通过定时器逐次移动标记点到这些过渡点上,从而形成平滑的轨迹动画效果。既然前端框架/工程化中的JavaScript可以实现,那么在C++/Qt中同样可以。经过验证,我们只需编写一个简单的函数,传入起点、终点和需要插值的点数,即可返回插值后的坐标集合。这种方法不依赖任何特定地图的JS库,仅需基础的地图绘制和标记点移动功能,因此可以轻松兼容百度、高德、腾讯、谷歌等多种地图内核,实现了跨平台的统一解决方案。

平滑轨迹效果演示
多目标轨迹显示
地图交互界面
轨迹设置选项

核心代码解析

以下代码片段展示了如何在Qt中组织数据并驱动实时平滑移动的核心逻辑。关键函数 moveDevice 负责处理每个目标的移动逻辑,而 MapUtil::getLinePoints 则封装了上文提到的线性插值算法。

void frmMapGpsLive::moveDevice(int i, const QString &point) {
    // 如果启用了平滑移动模式
    if (AppConfig::GpsLiveSmooth) {
        QString point1 = markerPoints.at(i);
        double distance = MapUtil::getDistance(point1, point);
        if (distance > 0) {
            // 根据两点间距离动态计算需要插值的点数,距离越大点数越多
            int count = distance / 2;
            QStringList points = MapUtil::getLinePoints(point1, point, count);
            points.removeLast(); // 移除终点,因为终点将由最后一次移动触发
            dstPoints[i] = points; // 存储插值点序列
            return;
        }
    }
    // 非平滑模式,直接跳跃到目标点
    this->moveDevicex(i, point);
}

void frmMapGpsLive::moveDevicex(int i, const QString &point) {
    // 计算标记点从上一个位置移动到新位置的旋转角度
    int angle = MapUtil::getAngle(markerPoints.at(i), point);
    markerPoints[i] = point; // 更新当前位置

    // 执行JavaScript指令,更新地图上的折线和标记点
    this->runJs(QString("addDataByFlag('%1', '%2')").arg(lineFlags.at(i)).arg(point));
    this->runJs(QString("setMarker('%1', null, '%2', %3)").arg(markerFlags.at(i)).arg(point).arg(angle));
}

功能特性

地图核心功能

  1. 多内核支持:默认集成百度地图,可无缝切换至高德、天地图、腾讯、谷歌等地图服务。
  2. 在线/离线模式:支持离线地图加载,满足无网络环境下的部署需求。
  3. 丰富交互:支持地图控件(缩放、比例尺、绘图工具)、覆盖物(标记、折线、多边形)的添加、删除与交互。
  4. 坐标转换:内置WGS-84(GPS)、GCJ-02(火星)、BD-09(百度)等多种坐标系间的离线双向转换。
  5. 路径规划与轨迹:支持驾车、步行等路径规划,并可将规划结果用于动态轨迹平滑移动,该功能是本文所述实时平滑移动的基础。
  6. 跨平台与跨组件:支持Qt Widgets和Qt Quick(QML)框架,可编译部署到Windows、Linux、macOS及Android系统。

高级特性

  1. 轨迹回放:支持导入历史轨迹数据进行平滑回放演示。
  2. 海量点处理:提供点聚合和海量点示例,优化大量标记点时的渲染性能与交互体验。
  3. 行政区划:可下载、加载并交互式编辑省市区域的轮廓边界数据。
  4. 多浏览器内核:内置封装好的浏览器组件,支持WebEngine、WebKit及Miniblink内核。

项目资源




上一篇:2025年全球宕机事件深度剖析:AI编程如何加剧系统稳定性风险
下一篇:Milvus RootCoord源码解析:深度剖析分布式元数据管理与DDL调度引擎
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 03:21 , Processed in 0.117827 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表