本站域名已变更为https://blog.67v.cn,全新首页即将发布,尽情期待!!!

火星坐标与百度坐标互转

有时候百度地图的api接口提供了坐标互转,然而有一定的额度限制,那么经过百度发现了一个不错的转换思路,代码如下:

code
/**
 * 火星坐标转为百度坐标,GCJ为火星坐标,BD为百度坐标
 * @param {Object[]} arr 
 * @param {Number} arr.lng - 经度
 * @param {Number} arr.lat - 纬度
 * @param {Number} n - 保留小数点后几位
 * @returns {Object} 结构同入参arr
 */
function GCJ_to_BD (arr, n) {
  var result = [];
  var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  if (!n) {
    n = 7
  }
  m = Math.pow(10, n);
  for (var i = 0; i < arr.length; i++) {
    var x = arr[i].lng,
      y = arr[i].lat;
    var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
    var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
    var bd_lon = z * Math.cos(theta) + 0.0065;
    var bd_lat = z * Math.sin(theta) + 0.006;
    var obj = {}
    obj.lng = Math.round(bd_lon * m) / m;
    obj.lat = Math.round(bd_lat * m) / m;
    result.push(obj);
  }
  return result;
}


//参数同上
function BD_to_GCJ(arr, n) {
  var result = [],
    m;
  var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
  if (!n) {
    n = 7
  }
  m = Math.pow(10, n);
  for (var i = 0; i < arr.length; i++) {
    var x = arr[i].lng - 0.0065,
      y = arr[i].lat - 0.006;
    var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
    var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
    var gg_lon = z * Math.cos(theta);
    var gg_lat = z * Math.sin(theta);
    var obj = {}
    obj.lng = Math.round(gg_lon * m) / m;
    obj.lat = Math.round(gg_lat * m) / m;
    result.push(obj);
  }
  return result;
}

读完了点一下,作者能得积分

赞赏

如果这篇内容帮到了你,不妨请作者喝杯咖啡

分享 微博 QQ

发表评论

发表评论