腾讯经纬度转百度,百度转GCJ02

// 腾讯坐标转百度坐标
export const txMapToBdMap = (lng, lat) => {
  const x_pi = (3.14159265358979324 * 3000.0) / 180.0
  const x = lng
  const y = lat
  const z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi)
  const theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi)
  const lngs = z * Math.cos(theta) + 0.0065
  const lats = z * Math.sin(theta) + 0.006

  return { lng: lngs, lat: lats }
}
export const CoordinateUtil = {
  x_pi: (3.14159265358979324 * 3000.0) / 180.0,
  // pai
  pi: 3.1415926535897932384626,
  // 离心率
  ee: 0.00669342162296594323,
  // 长半轴
  a: 6378245.0,
  //  // 百度转国测局
  //  bd09togcj02: function(bd_lon, bd_lat) {
  //      let x = bd_lon - 0.0065;
  //      let y = bd_lat - 0.006;
  //      let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * CoordinateUtil.x_pi);
  //      let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * CoordinateUtil.x_pi);
  //      let gg_lng = z * Math.cos(theta);
  //      let gg_lat = z * Math.sin(theta);
  //      return {
  //          lng: gg_lng,
  //          lat: gg_lat
  //      }
  //  },
  // 百度转84
  bd09togcj02: function (bd_lon, bd_lat) {
    let x = bd_lon - 0.0065
    let y = bd_lat - 0.006
    let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * CoordinateUtil.x_pi)
    let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * CoordinateUtil.x_pi)
    let gg_lng = z * Math.cos(theta)
    let gg_lat = z * Math.sin(theta)
    return CoordinateUtil.gcj02towgs84(gg_lng, gg_lat)
  },
  // 国测局转百度
  gcj02tobd09: function (lng, lat) {
    let z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * CoordinateUtil.x_pi)
    let theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * CoordinateUtil.x_pi)
    let bd_lng = z * Math.cos(theta) + 0.0065
    let bd_lat = z * Math.sin(theta) + 0.006
    return {
      lng: bd_lng,
      lat: bd_lat
    }
  },
  // 国测局转84
  gcj02towgs84: function (lng, lat) {
    let dlat = CoordinateUtil.transformlat(lng - 105.0, lat - 35.0)
    let dlng = CoordinateUtil.transformlng(lng - 105.0, lat - 35.0)
    let radlat = (lat / 180.0) * CoordinateUtil.pi
    let magic = Math.sin(radlat)
    magic = 1 - CoordinateUtil.ee * magic * magic
    let sqrtmagic = Math.sqrt(magic)
    dlat = (dlat * 180.0) / (((CoordinateUtil.a * (1 - CoordinateUtil.ee)) / (magic * sqrtmagic)) * CoordinateUtil.pi)
    dlng = (dlng * 180.0) / ((CoordinateUtil.a / sqrtmagic) * Math.cos(radlat) * CoordinateUtil.pi)
    let mglat = lat + dlat
    let mglng = lng + dlng
    //  return {
    //      lng: lng * 2 - mglng,
    //      lat: lat * 2 - mglat
    //  };
    return [lng * 2 - mglng, lat * 2 - mglat]
  },
  // 经度转换
  transformlat: function (lng, lat) {
    let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng))
    ret += ((20.0 * Math.sin(6.0 * lng * CoordinateUtil.pi) + 20.0 * Math.sin(2.0 * lng * CoordinateUtil.pi)) * 2.0) / 3.0
    ret += ((20.0 * Math.sin(lat * CoordinateUtil.pi) + 40.0 * Math.sin((lat / 3.0) * CoordinateUtil.pi)) * 2.0) / 3.0
    ret += ((160.0 * Math.sin((lat / 12.0) * CoordinateUtil.pi) + 320 * Math.sin((lat * CoordinateUtil.pi) / 30.0)) * 2.0) / 3.0
    return ret
  },
  // 纬度转换
  transformlng: function (lng, lat) {
    let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng))
    ret += ((20.0 * Math.sin(6.0 * lng * CoordinateUtil.pi) + 20.0 * Math.sin(2.0 * lng * CoordinateUtil.pi)) * 2.0) / 3.0
    ret += ((20.0 * Math.sin(lng * CoordinateUtil.pi) + 40.0 * Math.sin((lng / 3.0) * CoordinateUtil.pi)) * 2.0) / 3.0
    ret += ((150.0 * Math.sin((lng / 12.0) * CoordinateUtil.pi) + 300.0 * Math.sin((lng / 30.0) * CoordinateUtil.pi)) * 2.0) / 3.0
    return ret
  },
  getWgs84xy: function (x, y) {
    // 先转 国测局坐标
    let doubles_gcj = CoordinateUtil.bd09togcj02(x, y) // (x 117.   y 36. )
    // 国测局坐标转wgs84
    let doubles_wgs84 = CoordinateUtil.gcj02towgs84(doubles_gcj.lng, doubles_gcj.lat)
    // 返回 纠偏后 坐标
    return doubles_wgs84
  }
}

 

posted @ 2022-12-30 17:53  王小美丶  阅读(88)  评论(0编辑  收藏  举报