有时候百度地图的api接口提供了坐标互转,然而有一定的额度限制,那么经过百度发现了一个不错的转换思路,代码如下:
/**
* 火星坐标转为百度坐标,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;
}
评论前必须登录