1. 高德地图API在微信小程序中的基础配置
第一次在微信小程序里集成高德地图时,我被官方文档绕得头晕。后来发现其实只需要三步就能搞定基础配置,这里分享我的踩坑经验。首先去高德开放平台注册账号,创建应用获取key时要注意选择"微信小程序"平台类型,这个key是小程序调用地图服务的通行证。
在app.js中初始化地图服务时,建议把amap-wx.js文件放在项目根目录的libs文件夹里。我遇到过路径引用错误的问题,后来发现是相对路径写错了。正确的初始化代码应该这样写:
// app.js var amapFile = require('./libs/amap-wx.js'); App({ onLaunch() { this.globalData.myAmapFun = new amapFile.AMapWX({ key: '你的高德key' }); }, globalData: { myAmapFun: null } })在页面配置文件index.json中需要声明map组件权限,这个容易遗漏。我建议直接在app.json的全局配置里添加:
{ "permission": { "scope.userLocation": { "desc": "你的位置信息将用于地图定位" } } }实际开发中遇到过定位失败的情况,后来发现是没处理用户拒绝授权的场景。完整的定位请求应该包含失败回调:
wx.authorize({ scope: 'scope.userLocation', success() { /* 已授权 */ }, fail() { /* 引导用户手动开启 */ } })2. 自定义地图标点的核心技巧
默认的蓝色水滴图标实在太丑了,设计师给的UI稿里是圆形徽标。我试过直接修改iconPath,但发现两个坑:首先是图标尺寸不可控,其次点击区域还是原图大小。最终方案是用透明图标+自定义气泡的组合拳。
具体实现时,markers配置要特别注意这几个参数:
- iconPath:设置为1px透明png
- width/height:必须与透明图尺寸一致
- customCallout:控制气泡显示位置
markers: [{ id: 1, iconPath: '/assets/transparent.png', width: 2, height: 2, latitude: 39.92, longitude: 116.46, customCallout: { display: 'ALWAYS', anchorX: 0, anchorY: -20 } }]气泡样式要在wxml里用cover-view实现,这里有个大坑:cover-view的层级问题。实测发现z-index在真机上经常失效,解决方案是用官方推荐的slot="callout"写法:
<map> <cover-view slot="callout"> <cover-view class="custom-marker"> <!-- 气泡内容 --> </cover-view> </cover-view> </map>动态切换选中状态时,我最初用wx:if导致闪烁严重。后来改用样式切换方案性能提升明显:
.custom-marker { transition: all 0.3s; } .active-marker { transform: scale(1.2); filter: drop-shadow(0 0 5px rgba(0,0,0,0.3)); }3. 动态气泡的交互设计与实现
气泡交互最麻烦的是点击事件穿透问题。微信的bindcallouttap在安卓机上经常不触发,我的解决方案是用bindmarkertap+自定义气泡组合。
实现步骤:
- 给每个marker设置唯一id
- 点击时记录当前选中id
- 通过数据驱动更新气泡样式
Page({ data: { activeMarkerId: null }, handleMarkerTap(e) { this.setData({ activeMarkerId: e.markerId }) } })气泡的三角形指示器是个难点。最初尝试用CSS绘制,发现cover-view不支持border-style。最终方案是用图片实现,但要注意@2x和@3x适配:
<cover-image src="{{activeMarkerId===id?'active-triangle.png':'normal-triangle.png'}}" class="triangle-indicator" />动画效果要用wx.createAnimation实现。有个细节:动画结束后要手动更新布局,否则可能出现空白间隙:
animation.translateY('-50%').step({ timingFunction: 'ease-out' }) this.setData({ animationData: animation.export() }, () => { // 动画完成回调 })4. 性能优化与常见问题排查
当地图点超过100个时,会出现明显卡顿。经过测试,优化方案如下:
- 分区域加载:根据可视范围动态更新markers
- 简化气泡DOM:移除不必要的嵌套view
- 使用纯色替代渐变背景
// 视口变化时重新计算可见markers onRegionChange(e) { const {latitude, longitude} = this.data const visibleMarkers = allMarkers.filter(marker => { return getDistance(latitude, longitude, marker.latitude, marker.longitude) < 5000 }) this.setData({markers: visibleMarkers}) }常见问题解决方案:
- 图标不显示:检查图片路径是否在微信白名单
- 气泡错位:调整anchorX/anchorY值
- 点击无效:确认marker-id与数据id一致
真机调试时发现iOS和安卓表现不一致,特别是z-index问题。最终采用平台判断代码:
const info = wx.getSystemInfoSync() if (info.platform === 'android') { // 安卓特殊处理 }内存泄漏是个隐形杀手。在页面unload时要记得清理定时器和事件监听:
onUnload() { this.mapCtx = null clearTimeout(this.timer) }