wx.openLocation地图坐标踩坑

361 阅读2分钟

常见坐标系

  • CGCS2000,天地图坐标系,与GPS一样,偏移较小

  • GCJ02,火星坐标系,将GPS坐标做偏移之后的数据,国测局坐标(国内地图推荐,如高德、腾讯)

  • EPSG:3857,等同于900913,由墨卡托投影而来(最初 Web Mercator 被拒绝分配EPSG 代码。于是大家普遍使用 EPSG:900913(Google的数字变形) 的非官方代码来代表它)

  • BD-09:,百度地图使用坐标系

  • WGS84(World Geodetic System 1984)是一个全球定位系统(GPS)使用的地理坐标系统,也是目前国际上广泛使用的地球参考框架。WGS84 坐标系统是由美国国防部开发的,它提供了一个全球统一的坐标标准,用于定位和导航。

  • EPSG:4326,等同于WGS84坐标系

微信 js sdk

使用微信内置地图查看位置接口
wx.openLocation({
  latitude: 0, // 纬度,浮点数,范围为90 ~ -90
  longitude: 0, // 经度,浮点数,范围为180 ~ -180。
  name: '', // 位置名
  address: '', // 地址详情说明
  scale: 1, // 地图缩放级别,整型值,范围从1~28。默认为最大
  infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
});

获取地理位置接口

wx.getLocation({
  type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
  success: function (res) {
    var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
    var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
    var speed = res.speed; // 速度,以米/每秒计
    var accuracy = res.accuracy; // 位置精度
  }
});

腾讯地图api 转换

image.png

发现用了腾讯api转换精度还是有问题,最后上网找

function transformFromBaiduToGCJ (latitude, longitude) {  
    var xPi = 3.14159265358979324 * 3000.0 / 180.0;  
    var x = longitude - 0.0065;  
    var y = latitude - 0.006;  
    var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * xPi);  
    var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * xPi);  
    var a_latitude = z * Math.sin(theta);  
    var a_longitude = z * Math.cos(theta);  
    return {  
        latitude: a_latitude,  
        longitude: a_longitude  
    };  
};

还得用这么古老的方式

百度地图api 转换

image.png

链接

  1. lbsyun.baidu.com/faq/api?tit…
  2. lbs.qq.com/service/web…