项目场景:
项目场景:在微信小程序中,用户提供门店坐标,前端展示一个按钮,点击可以打开小程序导航
问题描述
使用了用户提供的坐标,可以成功打开小程序地图,但是导航位置与实际地址的位置有偏差,不是用户所在的门店地址
原因分析:
百度了一下关于坐标间的相关问题,发现以下情况:
1.
谷歌,腾讯,高德,他们使用的坐标体系是GCJ-02。
国测局02年发布的坐标体系。又称“火星坐标”。也是国内最广泛使用的坐标体系。
2.百度和搜狗 使用的坐标体系是通过GCJ-02进过偏移算法得到的。
这种体系就根据每个公司的不同,坐标体系都不一样了。这种方法得出来的坐标与其他坐标体系不兼容
【以上记录来自[百度地图和高德地图的坐标互相转换]】
既然知道了用户提供的坐标是与其他坐标不兼容,而我们使用的是小程序的腾讯地图。那可以确认用户提供的坐标第二种情况。那我们需要确认用户的坐标是哪家导航提供的坐标。
最好的方案呢,是直接跟用户确认这个坐标是由哪一家导航提供的,如果用户给不了答案
那我们退而求其次,可以先去确认几家大头的导航,看是不是他们其中一个导航
可以通过这个网页去确认是否为百度地图提供的坐标,定位正确那说明是百度提供的坐标
其他地图的坐标你们可以自己去查一查,我就不展开讲了
解决方案:
那么我这边确认了用户是通过百度地图获取到的坐标,那我们就可以找一找解决办法了
以下解决方案来自[百度地图和高德地图经纬度坐标转换方法]
转换后的坐标可以通过这个网页去确认位置。高德平台坐标拾取器
/**
* 百度地图坐标 转 高德地图坐标
* @param {*} lng 经度
* @param {*} lat 纬度
* @returns
*/
export function toAMap(lng, lat) {
const X_PI = Math.PI * 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 amap_lng = z * Math.cos(theta);
let amap_lat = z * Math.sin(theta);
return {
longitude: amap_lng, // 经度
latitude: amap_lat, // 纬度
}
}
结尾废话
对于坐标的转换,个人建议是由后台处理成腾讯地图的坐标在发回到前端,这样可以保证其他位置体系都能正常运行,前端能够做的处理也没办法做到全面