必须用 polyline 数组画轨迹线,每个点须为 {latitude: number, longitude: number} 格式;需校验数值类型与范围、坐标系(WGS84)、时间戳顺序,并避免混用 points 与 encodedPolyline。

微信小程序里 uni-app 用 map 组件画运动轨迹,必须用 polyline
微信小程序原生 map 组件不支持 Canvas 绘制或自定义图层,uni-app 的跨平台封装也沿用了这一限制——想划线,只能走 polyline 数组。这不是 bug,是平台能力边界。你传给 polyline 的每个点必须是经纬度对象,且格式严格:{ latitude: number, longitude: number },少一个字段或类型错(比如字符串)都会导致整条线消失,且无任何报错提示。
常见错误现象:
-
polyline数组有值但地图上没线 → 检查每个点的latitude/longitude是否为数字、是否在合法范围内(纬度 ±90,经度 ±180) - 线段突然断开 → 点数组里混入了
null、undefined或空对象 - 轨迹偏移严重 → 原始坐标系不是 WGS84(微信要求),比如用了高德或百度 SDK 回传的 GCJ-02 坐标,必须先转码
onRegionChange 和 bindregionchange 都不能实时更新轨迹线
很多人想边移动边画线,就去监听地图缩放/拖动事件,结果发现 polyline 更新后线没变——因为这些事件只反映用户操作,和定位无关。真正驱动轨迹更新的是定位数据流,不是地图交互。你应该用 uni.getLocation 或 uni.startLocationUpdateBackground(需配置后台定位权限)持续获取位置,再把新坐标 push 到 polyline[0].points 数组中。
注意两点:
- 微信小程序对后台定位有强限制:iOS 必须开启「始终允许」,Android 需声明
android.permission.ACCESS_BACKGROUND_LOCATION并引导用户手动开启;否则进后台几秒就停定位 - 频繁 setData 更新
polyline会卡顿,建议每 3–5 秒合并一次点位,或用节流控制更新频率 - 不要在
onRegionChange里调setData更新polyline,它和定位无关,纯属误导
polyline 的 color 和 width 在 iOS 微信里不生效?检查 encodedPolyline
如果你用的是压缩后的折线(encodedPolyline 字符串),那 color、width、dashArray 这些样式字段会被忽略——这是微信原生 map 的硬性限制,uni-app 无法绕过。必须用原始点数组(points)才能生效。
使用场景判断:
- 轨迹点少于 500 个 → 直接用
points数组,样式可控,开发调试友好 - 轨迹点超 2000 个且需传输节省带宽 → 先用 Polyline 编码算法(如 Google 的
encode函数)压成字符串,但要接受样式不可配 - 别混用:同时传
points和encodedPolyline,微信以encodedPolyline为准,points被丢弃
真机调试时轨迹线“跳变”或“回退”,大概率是坐标时间戳乱序
运动轨迹不是点的简单堆砌,而是按时间顺序的空间序列。如果定位 SDK 返回的点没有按采集时间排序(比如网络延迟导致后发的包先到),或者你手动拼接时顺序写反了,polyline 就会画出诡异折返线。微信不会校验顺序,它只忠实地连点。
解决办法很简单:
- 每次拿到新定位,立刻打上
Date.now()时间戳 - 在 push 到
points前,按时间戳升序重排整个数组(别只排最后几个,避免累积误差) - 加个防抖:如果新点和上一点距离
这点在模拟器里完全暴露不出来,只有真机跑一段时间才会显现。别等上线后被用户截图投诉“路线鬼打墙”。



















