地图组件怎么用
地图是小程序里很常用的一个组件,外卖、出行、找店、签到这些场景都离不开它。用起来也不难:在页面里放一个 map 标签,给定经纬度和缩放级别,地图就渲染出来了。
map 组件默认占满容器,可以设置 latitude、longitude 控制中心点,scale 控制缩放级别。要在地图上画点,就用 markers 传一组标记,每个标记带上 id、经纬度和气泡标题。
使用前记得先在后台开通地图相关的权限并申请密钥,不同平台的 key 不能混用。调不通的,八成是 key 配错或者服务没开通。
- 地图map 组件与标记。
- 定位授权与精度选择。
- 周边搜索与距离排序。
- 性能低频定位与页面回收。
定位与授权
拿到用户位置,通常用 wx.getLocation。第一次调用会触发授权弹窗,用户拒绝之后就再也拿不到位置,所以要先问清楚用途,别在用户没预期的时候弹。
wx.getLocation({
type: 'gcj02',
isHighAccuracy: true,
success: function (res) {
var lat = res.latitude;
var lng = res.longitude;
}
});
type 用 gcj02,这是国内坐标系,和地图厂商的坐标一致,直接用就行。isHighAccuracy 会走更高精度的定位,但更费电,后台运行或者只需要大概范围的时候关掉它。
另外,定位失败要准备兜底:用户拒绝授权、在室内、开飞行模式,都要有对应的提示和降级方案,别让整个页面卡死在「加载中」。
标记与周边搜索
地图上要展示的门店、车辆、工单,都可以用 markers 渲染。点标记弹出详情,用 bindmarkertap 事件绑定点击。
<map latitude="lat" longitude="lng" markers="markers"
bindmarkertap="onMarkerTap" scale="14">
</map>
周边搜索一般走后端:前端把经纬度传给服务端,服务端调地图服务商的 POI 搜索接口,把附近的店算好再返回。不要把密钥放在前端,搜索逻辑放在服务端更安全。
搜索接口一般支持按分类过滤,比如餐饮、酒店、加油站。返回结果要按距离排序展示,距离近的排前面,用户看着才直观。
距离计算与排序
两点之间算距离,别自己在端上写球面公式,地图服务商都提供距离计算接口,直接调就行。数据量大时在服务端批量算好,再连同列表一起返回。
| 场景 | 精度 | 频率 |
|---|---|---|
| 找附近门店 | 几百米 | 进页面一次 |
| 路线导航 | 高精度 | 持续低频 |
| 后台打卡 | 低精度 | 定时低频 |
排序时注意把「距离」和「热度」一起考虑,纯按距离排会把热门店压到后面。加权公式可以做成服务端配置,运营想调就调,不用发版。
列表和地图建议联动:点列表里的店,地图上的标记高亮并移动视野;拖动地图,列表跟着换成当前区域的结果。两边状态同步好,用户就不会觉得地图是地图、列表是列表,体验会顺很多。
性能与电量
地图组件本身比较重,页面里能放一个就放一个。需要持续定位的场景,记得在页面隐藏或者退出时把定位监听停掉,不然耗电很厉害。
定位是按需的,不是常驻的。用户离开页面,就该把监听收掉。
markers 数量也别一次塞太多,几百个标记同时渲染会卡。先按当前视野裁剪,只画看得见的区域,滚动地图时再增量更新。
另外,地图相关的页面在 iOS 和安卓上的表现有差异,真机测试要两台都跑一遍。特别是地图全屏覆盖原生导航栏这类细节,模拟器看不出来,只有真机才暴露问题。
隐私方面也要讲清楚:用户授权位置是有理由的,弹窗文案把用途写明白,比如「用于查找附近门店」。用户拒绝之后再次询问要克制,给一个手动开启入口就好,别反复弹。
常见位置坑
| 坑 | 后果 | 应对 |
|---|---|---|
| key 配错 | 地图空白 | 按平台核对密钥 |
| 坐标系混用 | 位置偏移 | 统一用 gcj02 |
| 用户拒授权 | 功能不可用 | 说明用途再引导开启 |
| 监听不释放 | 耗电发热 | 页面退出时停止监听 |
落地清单
- 密钥放服务端,前端只传经纬度。
- 定位失败要有降级提示。
- 距离和热度一起排序。
- 标记按视野裁剪,增量渲染。
- 离开页面及时停掉定位监听。
位置能力用得好,是贴心;用得糙,是隐私和电量的双重消耗。