地图覆盖物:折线与多边形完全指南
引言
如果说 Marker 是地图上的'图钉',那 Polyline(折线)和 Polygon(多边形)就是地图上的'绳子'和'圈地'。矢量图形是地图业务的核心,无论是物流路线、行政区域还是电子围栏,都离不开它们。但这部分功能比 Marker 复杂得多,涉及几何算法、渲染性能和交互逻辑。
画点容易画线难,画完还得防穿帮。你以为画个折线就是连几个点?坐标系偏一点,线就飘到海里去了;多边形少个闭合点,区域就漏风了。今天咱们就把这些矢量覆盖物彻底搞懂,避免在实际项目中踩坑。
学习目标
- 掌握矢量图形创建:分清 Polyline 和 Polygon 的区别,尤其是路径 path 的数据结构。
- 理解闭合与非闭合:明白为什么多边形必须首尾相连,而折线不需要,避免渲染异常。
- 精通样式定制:线条颜色、宽度、虚线样式、填充色、透明度,确保视觉表现符合需求。
- 编辑与交互能力:如何实现拖拽编辑顶点?如何判断点在多边形内?这些是业务刚需。
- 性能与精度平衡:海量坐标点如何简化?如何避免自相交图形导致的渲染错误?
核心原理与流程
很多开发者只会调 API,不懂原理。一旦遇到奇葩需求,比如'我要画一个带孔洞的多边形',就容易束手无策。其实 Polyline 和 Polygon 的本质是矢量路径数据,通过地图引擎投影到屏幕,再用 Canvas 或 SVG 绘制。
原理深度解析:
- 坐标投影:经纬度需要转换成屏幕像素。矢量图形是一串点,计算量是 N 倍。如果路径有 1000 个点,每次地图移动都要重新计算 1000 次投影,这就是卡顿的根源。
- 闭合逻辑:Polygon 要求首尾坐标一致(或者引擎自动闭合),否则填充区域会出错。Polyline 则是开放的,首尾不相连。
- 渲染层级:矢量图形通常绘制在地图瓦片之上,Marker 之下(默认情况)。可以通过 zIndex 调整,但要注意大量矢量图形会触发 GPU 加速或降级为 CPU 渲染。
实战代码详解
以下是实用代码片段,请替换为您的有效 Key 后运行。
1. 创建折线与多边形
// 1. 定义路径数据
const path = [
[116.397428, 39.90923],
[116.407428, 39.91923],
[116.387428, 39.91923]
];
// 2. 创建折线 Polyline
const polyline = new AMap.Polyline({
path: path,
strokeColor: "#FF33FF",
strokeWeight: 6,
strokeStyle: "solid",
map: map
});
// 3. 创建多边形 Polygon
polygon = .({
: path,
: ,
: ,
: ,
: map
});


