遇到的问题
项目是uniapp开发得h5网页,问题是位置定位不准确吧,也算是这个项目历史遗留的问题,这个项目初期,前端获取经纬度是通过 腾讯的 jsApi 去获取的,但是后端存储的医院经纬度是百度地图的,所以改造前端经纬度的任务自然而然的就落到了我的头上。
如何去解决的
-
刚开始我想的是使用 h5 提供的 navigator.geolocation.getCurrentPosition(),去获取的,但是由于这个方法需要 https 的支持,以及获取到的经纬度跟后台存储的经纬度还是有偏差,所以放弃了。
-
使用百度地图 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)
})