必须使用@dcloudio/uni-plugin-baidu-map官方插件,hbuilderx 3.9+内置支持,manifest.json配置ak后自动注入bmapgl对象;禁用vue-baidu-map等非适配库,因其不兼容小程序与nvue环境。

uni-app 里调用百度地图 API 做定位与检索,不能直接引入 baidu-map-js-api 或 npm install vue-baidu-map —— 这俩在小程序和 nvue 环境下会报 undefined is not a function 或 document is not defined。必须走官方插件通道,且 H5、小程序、App 三端的初始化逻辑、坐标系、返回格式全都不一样。
用哪个插件?@dcloudio/uni-plugin-baidu-map 是唯一靠谱选择
这是 DCloud 官方维护的插件,HBuilderX 3.9+ 已内置支持,manifest.json 配置后自动注入全局 BMapGL 对象(注意是 BMapGL,不是老版 BMap)。别碰 uni-baidu-map 或社区封装的 Vue 组件,它们多数没处理好 iOS 的 info.plist 权限或小程序的 polyfill。
- manifest.json 中填入百度地图 AK:
"baidu_map": {"ak": "你的AK"} - H5 端需确保页面是 HTTPS 协议,否则
BMapGL.Map初始化静默失败,network 面板能看到 403,但控制台无提示 - 微信小程序端不需要额外配置 appid,但必须在「百度地图开放平台」把小程序的包名(如
wx1234567890abcdef)加进白名单,否则LocalSearch.search()返回空数组 - App 端 iOS 必须在
info.plist加NSLocationWhenInUseUsageDescription,否则uni.getLocation直接 fail,后续所有搜索/规划都卡在起点为空
uni.getLocation 拿到的坐标不能直接喂给百度搜索
百度地图 SDK 默认用 GCJ-02 坐标系(国测局加密),而 uni.getLocation 在不同平台返回的坐标系不统一:H5 返回 WGS84,微信小程序返回 gcj02,App 端默认 wgs84。直接传会导致搜索偏移几公里,比如搜“北京南站”却定位到丰台区荒地。
- 正确做法:用
uni.getLocation({type: 'gcj02'})强制统一为 gcj02(仅微信小程序和 App 支持该 type,H5 不支持,得手动转) - H5 端必须调用百度官方坐标转换接口:
BMapGL.Convertor.translate([lng, lat], 1, 5, (data) => {...}),其中1表示 WGS84 输入,5表示转成 BD09LL(百度经纬度) - LocalSearch 构造时一定要传
bounds参数,否则默认全国搜索,结果泛得离谱(只返回“北京市”这种一级行政区);正确写法:new BMapGL.LocalSearch(map, { bounds: new BMapGL.Bounds(swPoint, nePoint) })
搜索结果有了,但地图上不显示 marker 或 polyline
因为 BMapGL.Marker 和 BMapGL.Polyline 是百度原生对象,uni-app 的 <map></map> 组件根本不认。你看到控制台打印出路线数据,不代表它能自动渲染。
- marker 要自己转:
polyline属性必须是数组,每个元素含points(经纬度数组)、color(十六进制,带 #)、width(数字)、arrowLine(布尔值)等字段,不能用百度的strokeColor或setStrokeColor - drivingRoute 返回的
routes[0].path是点数组,但格式是[{lng:xxx,lat:yyy},...],而<map></map>要求points: [{latitude: yyy, longitude: xxx},...]—— 注意 key 名完全相反,且顺序是 lat/long,不是 lng/lat - 搜索结果里的
result.pois每个 poi 的point是{x: lng, y: lat},也要手动映射成{longitude: x, latitude: y}才能塞进<map></map>的markers数组
路径规划成功但起点/终点没标出来?检查 DrivingRoute.search() 的参数顺序
百度 SDK 的 DrivingRoute.search(start, end) 接口,start 和 end 必须是 BMapGL.Point 实例,不是普通对象,也不是字符串地址。传错类型不会报错,但返回的 routes 为空或只有概要信息。
- 错误写法:
drivingRoute.search('北京南站', '首都机场')—— 字符串地址只能用LocalSearch解析,不能直传规划接口 - 正确流程:先用
LocalSearch搜出两个地点的poi.point,再用new BMapGL.Point(poi.point.lng, poi.point.lat)构造起点/终点 - App 端(尤其 iOS)若未开启后台定位权限,
uni.getLocation在页面切后台后可能返回缓存旧坐标,导致规划路线起点漂移;建议加时间戳校验或强制刷新
最常被忽略的是坐标系混用和 polyline 字段名大小写——longitude 写成 lng,latitude 写成 lat,或者 color 少了 #,宽度传了字符串 "6" 而不是数字 6,都会导致地图上什么也不画。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











