正在做的一个微信公众号的项目要求根据用户输入的地址获取经纬度, 并导航到指定位置, 之前头脑一热用了百度的API做定位, 现在要做导航需要调用微信的SDK, 发现百度获取的经纬度是加密过的BD09格式, 需要转换成国测局GCJ02标准, 试着用了百度给的转换API, 发现需要解决跨域问题, 平时族头疼的就是跨域问题, 果断放弃, 这才有了下面这个方法.
先是微信SDK获取用户自己的位置
wx.getLocation({
type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {}
});
然后是获取导航位置
function getShopLocation() {
var map = new BMap.Map("container");
map.centerAndZoom('黑龙江省哈尔滨市南岗区'); // 获取用户录入的地区
var localSearch = new BMap.LocalSearch(map);
localSearch.setSearchCompleteCallback(function (searchResult) {
var poi = searchResult.getPoi(0);
console.log('BD09: ' + poi.point.lng); // 经度
console.log('BD09: ' + poi.point.lat); // 纬度
});
localSearch.search('黑龙江省哈尔滨市南岗区学府路哈尔滨理工大学');
}
重点来了, 坐标转换
function bMapTransWXMap(lng, lat) {
let x_pi = 3.14159265358979324 * 3000.0 / 180.0;
let x = lng - 0.0065;
let y = lat - 0.006;
let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
let lngs = z * Math.cos(theta);
let lats = z * Math.sin(theta);
console.log('GCJ02-----' + lngs)
console.log('GCJ02-----' + lats)
}
这里转换出来的坐标就是火星坐标了
最后就是调起导航了
function navigation(latitude, longitude) {
wx.openLocation({
latitude: latitude, // 纬度,浮点数,范围为90 ~ -90
longitude: longitude, // 经度,浮点数,范围为180 ~ -180。
name: '哈尔滨理工大学西区', // 位置名
address: '黑龙江省哈尔滨市南岗区学府路哈尔滨理工大学', // 地址详情说明
scale: 21, // 地图缩放级别,整形值,范围从1~28。默认为最大
// infoUrl: 'https://www.baidu.com/' // 在查看位置界面底部显示的超链接,可点击跳转
});
}
到此为止导航功能就实现了