uniapp中使用百度地图jsApi遇到的问题

175 阅读2分钟

遇到的问题

项目是uniapp开发得h5网页,问题是位置定位不准确吧,也算是这个项目历史遗留的问题,这个项目初期,前端获取经纬度是通过 腾讯的 jsApi 去获取的,但是后端存储的医院经纬度是百度地图的,所以改造前端经纬度的任务自然而然的就落到了我的头上。

如何去解决的

  1. 刚开始我想的是使用 h5 提供的 navigator.geolocation.getCurrentPosition(),去获取的,但是由于这个方法需要 https 的支持,以及获取到的经纬度跟后台存储的经纬度还是有偏差,所以放弃了。

  2. 使用百度地图 jsApi 获取位置。 由于我们这个项目不知道怎么搞搞得,我使用在线链接,老是获取不到 BMapGL 实例。在vue组件中用动态创建script标签得方式也还是不成。期间我自己去创建了新得项目去测试,结果在其他项目都可以,就我们这个项目不成。后面实在没办法了,就自己封装了一个js文件,通过组件中引入js文件去使用。(当然,也可以使用 npm 安装,或者下载js文件)

下面是使用步骤:

  • 首先创建一个js文件:

这边有个坑,请求百度地图在线文件得时候如果写成http得话,ios是会报错,安卓没有问题

const AK = '你自己得AK'; //需要去百度开发者平台去申请
export function loadBaiduMap() {
  return new Promise((resolve, reject) => {
    if (typeof BMap !== 'undefined') {
      resolve(BMap);
      return true;
    }
    window.onBMapCallback = function() {
      resolve(BMap);
    };
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = `https://api.map.baidu.com/api?v=2.0&ak=${AK}&callback=onBMapCallback`;
    script.onerror = reject;
    document.head.appendChild(script);
  });
}
  • 在组件中使用
//导入封装好的js
import {loadBaiduMap} from '@/common/map/baidu-map.js'

loadBaiduMap().then((BMap)=>{
    var getlocation = new BMap.Geolocation() //创建实例

    getlocation.getCurrentPosition(p=>{
        if(p){
            console.log("p",p)
            that.position.latitude = p.latitude;
            that.position.longitude = p.longitude;
            uni.setStorageSync('position', that.position)
            that.getHospitalInfo()
        }else{
            console.log("未获取到位置")
            that.position.latitude = ''
            that.position.longitude = ''
            uni.setStorageSync('position', that.position)
            that.getHospitalInfo()
        }

    })
}).catch((err)=>{
    console.log('百度地图加载失败',err)
})