在高德地图的实际开发场景中,为选区添加阴影效果能够增强区域的层次感,让用户在地图交互时更清晰地识别选中的范围。高德地图的原生API并没有直接提供选区阴影的配置参数,但是我们可以通过多边形叠加、自定义图层两种方案实现类似阴影的视觉效果。
方案一:使用双层多边形叠加模拟阴影
这种方案的核心思路是创建两个多边形,底层多边形作为阴影层,设置半透明的深色填充和大一点的偏移量,上层多边形作为实际的选区层,两层叠加后就能呈现阴影效果。
实现步骤
- 初始化高德地图实例,配置基础的地图参数
- 定义选区的坐标点数组,作为多边形的边界数据
- 创建阴影层多边形,设置填充色为半透明黑色,对边框做一定偏移
- 创建选区层多边形,设置正常的填充色和边框样式
- 将两个多边形依次添加到地图实例中
示例代码
// 初始化地图
var map = new AMap.Map('container', {
zoom: 13,
center: [116.397428, 39.90923]
});
// 选区坐标点
var path = [
[116.39, 39.91],
[116.40, 39.91],
[116.40, 39.90],
[116.39, 39.90]
];
// 阴影层多边形,偏移0.0005度模拟阴影偏移
var shadowPath = path.map(function(item) {
return [item[0] + 0.0005, item[1] - 0.0005];
});
var shadowPolygon = new AMap.Polygon({
path: shadowPath,
fillColor: '#000000',
fillOpacity: 0.3,
strokeColor: '#000000',
strokeOpacity: 0.3,
strokeWeight: 1
});
// 选区层多边形
var selectPolygon = new AMap.Polygon({
path: path,
fillColor: '#3388ff',
fillOpacity: 0.5,
strokeColor: '#3388ff',
strokeWeight: 2
});
// 将两层多边形添加到地图
map.add(shadowPolygon);
map.add(selectPolygon);
方案二:使用自定义 Canvas 图层绘制阴影
如果选区的形状比较复杂,或者需要更灵活的阴影样式,可以使用高德地图的自定义Canvas图层功能,在Canvas画布上先绘制阴影再绘制选区,最后将图层添加到地图中。
实现步骤
- 创建自定义Canvas图层类,继承AMap.CanvasLayer
- 在图层的绘制方法中,使用Canvas的阴影API绘制选区阴影
- 实例化自定义图层并添加到地图实例
示例代码
// 自定义Canvas图层类
function ShadowCanvasLayer(opts) {
AMap.CanvasLayer.call(this, opts);
}
ShadowCanvasLayer.prototype = new AMap.CanvasLayer();
ShadowCanvasLayer.prototype.constructor = ShadowCanvasLayer;
// 重写绘制方法
ShadowCanvasLayer.prototype.render = function() {
var canvas = this.getCanvas();
var ctx = canvas.getContext('2d');
var bounds = this.getBounds();
var zoom = map.getZoom();
// 清空画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 将经纬度坐标转换为画布像素坐标
var path = [
[116.39, 39.91],
[116.40, 39.91],
[116.40, 39.90],
[116.39, 39.90]
];
var pixelPath = path.map(function(item) {
return map.lngLatToContainer(new AMap.LngLat(item[0], item[1]));
});
// 绘制阴影
ctx.shadowColor = 'rgba(0,0,0,0.4)';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 5;
ctx.shadowOffsetY = 5;
ctx.beginPath();
ctx.moveTo(pixelPath[0].x, pixelPath[0].y);
for (var i = 1; i < pixelPath.length; i++) {
ctx.lineTo(pixelPath[i].x, pixelPath[i].y);
}
ctx.closePath();
ctx.fillStyle = 'rgba(51,136,255,0.5)';
ctx.fill();
// 绘制选区边框
ctx.shadowColor = 'transparent';
ctx.strokeStyle = '#3388ff';
ctx.lineWidth = 2;
ctx.stroke();
};
// 初始化地图
var map = new AMap.Map('container', {
zoom: 13,
center: [116.397428, 39.90923]
});
// 实例化自定义图层并添加
var shadowLayer = new ShadowCanvasLayer({
zIndex: 10
});
shadowLayer.setMap(map);
两种方案对比
我们可以通过下表对比两种方案的适用场景和优缺点:
| 方案 | 实现难度 | 灵活性 | 适用场景 |
|---|---|---|---|
| 双层多边形叠加 | 低 | 一般 | 简单规则选区,不需要复杂阴影样式 |
| 自定义Canvas图层 | 中 | 高 | 复杂选区,需要自定义阴影样式、动画效果 |
需要注意的是,使用双层多边形叠加时,阴影的偏移量需要根据地图的缩放级别做动态调整,避免缩放时阴影偏移过大或过小。自定义Canvas图层方案则需要监听地图的缩放和移动事件,在事件触发时重新调用render方法更新图层内容,保证阴影位置和选区位置始终匹配。
高德地图选区阴影AMap_Polygon地图自定义样式前端地图开发修改时间:2026-06-22 14:27:59