几年前刚开始做地图项目时,觉得 Marker 是最麻烦的——图标大小、拖拽、点击反馈,一堆事。直到接手了一个需要绘制电子围栏和物流路线的需求,才发现 Polyline 和 Polygon 才是真正的大坑。
这些矢量覆盖物看着简单:给一串坐标,连起来就行。但实际做起来,坐标系偏一点线就飞到海里去,多边形少个闭合点填充区域就漏风,编辑器的内存泄漏更是防不胜防。下面聊聊我踩过的坑和一些还不错的处理方式。
坐标投影是性能的命门
矢量图形和 Marker 最大的不同:Marker 只需要算一次投影,移图时位置跟着变就行;而 Polyline 或 Polygon 有 N 个点,每次移动或缩放地图,每个点都要重新投影到屏幕像素。路径点一多,卡顿就来了。
曾经有个需求要在地图上画一条长途货车的行驶轨迹,后端返回了 2000 个坐标点。直接扔进 path 里,中低端安卓机上帧率直接掉到个位数。后来用 Douglas-Peucker 算法把点简化到 200 个左右,肉眼几乎看不出形状差异,但性能提升明显。这类简化算法不需要自己撸,npm 上能找到好几个实现,比如 simplify-js。
另外,如果线条样式复杂(渐变、阴影),GPU 的负担也会上去。业务里能纯色就别加特效,尤其是移动端。
创建折线和多边形
高德的 API 很直白,但几个细节容易忽略。
const path = [
[116.397428, 39.90923],
[116.407428, 39.91923],
[116.387428, 39.91923]
];
// 折线
const polyline = new AMap.Polyline({
path: path,
strokeColor: "#FF33FF",
strokeWeight: 6,
strokeStyle: "solid",
map: map
});
// 多边形
const polygon = new AMap.Polygon({
path: path,
fillColor: "#00B2FF",
fillOpacity: 0.4,
strokeColor: "#FF33FF",
map: map
});
这里 Polygon 的 path 首尾点不需要重复传,SDK 会自动闭合。如果你手动写了首尾相同点,有些地图引擎会报重复点警告,高德倒还好,但习惯上别那么干。
编辑与交互
让用户拖拽编辑多边形顶点是很多业务(比如选址)的基本需求。高德提供了 ,但用完一定要 ,否则地图拖拽会异常。


