在实际开发无人机地面站或车辆监控平台时,实时绘制运动目标的轨迹是一个核心需求。早期的简单实现方式是每次接收到新的坐标点后,直接将标记点“跳跃”到该位置,这会导致移动过程不连续,视觉体验较差。随后,我们尝试使用各大地图厂商提供的轨迹动画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));
}
功能特性
地图核心功能
- 多内核支持:默认集成百度地图,可无缝切换至高德、天地图、腾讯、谷歌等地图服务。
- 在线/离线模式:支持离线地图加载,满足无网络环境下的部署需求。
- 丰富交互:支持地图控件(缩放、比例尺、绘图工具)、覆盖物(标记、折线、多边形)的添加、删除与交互。
- 坐标转换:内置WGS-84(GPS)、GCJ-02(火星)、BD-09(百度)等多种坐标系间的离线双向转换。
- 路径规划与轨迹:支持驾车、步行等路径规划,并可将规划结果用于动态轨迹平滑移动,该功能是本文所述实时平滑移动的基础。
- 跨平台与跨组件:支持Qt Widgets和Qt Quick(QML)框架,可编译部署到Windows、Linux、macOS及Android系统。
高级特性
- 轨迹回放:支持导入历史轨迹数据进行平滑回放演示。
- 海量点处理:提供点聚合和海量点示例,优化大量标记点时的渲染性能与交互体验。
- 行政区划:可下载、加载并交互式编辑省市区域的轮廓边界数据。
- 多浏览器内核:内置封装好的浏览器组件,支持WebEngine、WebKit及Miniblink内核。
项目资源
|