一:关于小程序集成集成百度地图SDK可以参考百度地图开放平台官方文档:http://lbsyun.baidu.com/index.php?title=wxjsapi
二:集成百度SDK后获取定位经纬度,发现有一定的偏差,此时可以采用百度地图官网提供的纠偏接口进行经纬度的纠偏,纠偏接口地址:https://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=113.540124&y=23.517846
参数说明:from=0 代表传入真实经纬度 to=4 代表转换成百度纠偏后的经纬度 x和y代表需要纠偏的经纬度
接口返回结果:{"error":0,"x":"MTEzLjU1MTgwNzMy","y":"MjMuNTIxMjMzOTEwNjQ2"}
接口返回参数说明:x、y分别是纠偏后的经纬度值,base64编码格式,大家可根据base64编码转换成明码,如果是在百度地图上定位则不需要转换,他们API支持这格式。
在小程序中:可以使用小程序本身携带的网络请求工具请求纠偏接口:
//获取百度坐标
getBdLocation: function() {
var that = this;
var BMap = new bmap.BMapWX({
ak: '百度地图开放平台注册应用时生成的AK'
});
var fail = function(data) {
console.log(data)
};
var success = function(data) {
wxMarkerData = data.wxMarkerData;
that.setData({
markers: wxMarkerData
});
wx.request({
url: 'https://api.map.baidu.com/ag/coord/convert',
data: {
from: 0,
to: 4,
x: wxMarkerData[0].longitude,
y: wxMarkerData[0].latitude,
},
method:'GET',
header: {
'content-type': 'application/json' // 默认值
},
success(res) {//获取纠偏后的经纬度
var longitude = Base64.decode(res.data.x);
var latitude = Base64.decode(res.data.y);
console.log(res.data)
that.setData({
location: {
latitude: latitude,
longitude: longitude
}
});
}
})
}
BMap.regeocoding({
fail: fail,
success: success,
iconPath: '../../img/marker_red.png',
iconTapPath: '../../img/marker_red.png'
});
},
Basee64编解码工具类
function base64_encode(str) { // 编码,配合encodeURIComponent使用
var c1, c2, c3;
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var i = 0, len = str.length, strin = '';
while (i < len) {
c1 = str.charCodeAt(i++) & 0xff;
if (i == len) {
strin += base64EncodeChars.charAt(c1 >> 2);
strin += base64EncodeChars.charAt((c1 & 0x3) << 4);
strin += "==";
break;
}
c2 = str.charCodeAt(i++);
if (i == len) {
strin += base64EncodeChars.charAt(c1 >> 2);
strin += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
strin += base64EncodeChars.charAt((c2 & 0xF) << 2);
strin += "=";
break;
}
c3 = str.charCodeAt(i++);
strin += base64EncodeChars.charAt(c1 >> 2);
strin += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
strin += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
strin += base64EncodeChars.charAt(c3 & 0x3F)
}
return strin
}
function base64_decode(input) { // 解码,配合decodeURIComponent使用
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = base64EncodeChars.indexOf(input.charAt(i++));
enc2 = base64EncodeChars.indexOf(input.charAt(i++));
enc3 = base64EncodeChars.indexOf(input.charAt(i++));
enc4 = base64EncodeChars.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
return utf8_decode(output);
}
function utf8_decode(utftext) { // utf-8解码
var string = '';
let i = 0;
let c = 0;
let c1 = 0;
let c2 = 0;
while (i < utftext.length) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
} else if ((c > 191) && (c < 224)) {
c1 = utftext.charCodeAt(i + 1);
string += String.fromCharCode(((c & 31) << 6) | (c1 & 63));
i += 2;
} else {
c1 = utftext.charCodeAt(i + 1);
c2 = utftext.charCodeAt(i + 2);
string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));
i += 3;
}
}
return string;
}
module.exports = {
encode: base64_encode,
decode: base64_decode
}