开发BUG----关于不同地图之间的坐标问题

项目场景:

项目场景:在微信小程序中,用户提供门店坐标,前端展示一个按钮,点击可以打开小程序导航


问题描述

使用了用户提供的坐标,可以成功打开小程序地图,但是导航位置与实际地址的位置有偏差,不是用户所在的门店地址

原因分析:

百度了一下关于坐标间的相关问题,发现以下情况:

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, // 纬度
  }
}

结尾废话

对于坐标的转换,个人建议是由后台处理成腾讯地图的坐标在发回到前端,这样可以保证其他位置体系都能正常运行,前端能够做的处理也没办法做到全面

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值