polyline更新必须用新数组引用,直接push不会触发重绘或导致android闪退;需全量替换polyline对象;android端因全量重绘引发闪烁,应节流合并点位;ios也建议批量更新;轨迹不连贯多因坐标系错配或非法值,须转wgs84并校验范围。

polyline更新必须用新数组引用,不能直接push
直接对 polyline[0].points 调用 push() 不会触发地图重绘,或者在Android端引发整条线闪退——因为uni-app的响应式系统无法捕获数组内部变更,且原生map组件需要明确的属性级更新信号。
- 必须创建全新polyline对象:
this.polyline = [{ points: [...oldPoints, newPoint], color: '#007AFF', width: 8 }] - 哪怕只加一个点,也要全量替换整个
polyline数组,不能复用旧引用 - 避免嵌套赋值:
this.polyline[0].points.push(newPoint)是无效的,也不会报错,但地图无反应
Android端polyline闪烁的本质是全量重绘
每次 setData 更新 polyline,Android平台上的原生地图SDK会先清空已有折线,再重绘全部点。点越多、更新越频繁,视觉“消失-重现”越明显。
- 节流控制:用
setTimeout或throttle把点位合并,例如每 3 秒 flush 一次缓冲区 - 避免高频定位直连:不要在
uni.onLocationChange回调里立刻更新polyline,先存入队列 - iOS相对稳定,但为统一行为,建议所有平台都采用批量更新策略
轨迹不连贯常因坐标系错配或非法值中断
微信小程序 map 组件只认 WGS84 坐标系,且每个点的 latitude 和 longitude 必须是 number 类型、在合法范围内(纬度 ±90,经度 ±180)。任意一点出错,整条 polyline 就静默失效。
- 检查原始数据来源:高德/百度 SDK 返回的是 GCJ-02,需用开源库如
gcoord转成 WGS84 - 过滤脏数据:
if (typeof lat === 'number' && lat >= -90 && lat ,否则跳过该点 - 禁止混入
null、undefined或空对象:{ latitude: null, longitude: 116 }会导致后续所有点被忽略
markers更新与polyline不同步导致视觉割裂
如果你同时更新 markers(比如终点图标)和 polyline,但两者 setData 时机不同,就会出现线画到一半、终点却已到位的割裂感。
- 务必合并更新:
this.setData({ polyline, markers })一次性提交,不要拆成两次调用 - 确保
markers中起点/终点的id和latitude/longitude在更新前后保持一致,否则微信会当作新 marker 插入而非更新 - 若需动态改变 iconPath,必须连同整个 marker 对象一起替换,不能只改字段











