推荐使用方法2 !!!
方法1
定义一个待转换的坐标数组。
// 待转换的坐标数组
var points = [
new BMap.Point(116.404, 39.915),
new BMap.Point(121.48044, 31.236985),
new BMap.Point(113.952051, 22.538413),
// ...
];
数据格式为
points = [
{
lat: 32.40957500210635,
lng: 120.51806889999999
},
{
lat: 32.40957500210111,
lng: 120.51806889999999
},
{
lat: 32.40957500210222,
lng: 120.51806889999999
},
]
创建转换器对象并调用translate()方法进行坐标转换。需要注意的是,一次最多只能同时转换100个坐标。因此,在实际使用中,我们需要对待转换的坐标数组进行分组,每次转换不超过100个坐标,再将结果合并到转换后的坐标数组中。
// 创建转换器对象
var convertor = new BMap.Convertor();
// 对原始坐标数组进行分组,每组100个坐标以内
var groups = [];
var len = points.length;
for (var i = 0; i < len;) {
groups.push(points.slice(i, i + 100));
i += 100;
}
// 遍历每个分组,调用translate()方法进行坐标转换,并处理回调函数返回的结果
var baiduPoints = [];
function onConvertComplete(result) {
if (result.status === 0) {
baiduPoints = baiduPoints.concat(result.points);
if (baiduPoints.length === len) {
// 所有坐标转换完成后,baiduPoints数组中即为转换后的百度坐标
// do something with baiduPoints here
}
} else {
alert("坐标转换失败");
}
}
for (var i = 0; i < groups.length; i++) {
convertor.translate(groups[i], 1, 5, onConvertComplete);
}
在上述代码中,首先对原始坐标数组进行分组,每组最多100个坐标。然后遍历每个分组,调用
translate()
方法将该分组所包含的所有坐标转换为百度坐标。回调函数中将返回的百度坐标合并到baiduPoints
数组中,如果所有分组的坐标转换完成后,baiduPoints.length
达到总坐标数,则表示所有坐标已经转换完成,可以进行下一步处理了。需要注意的是,在实际开发中,百度地图API应该尽量避免同时请求过多的接口,否则可能会引起网络请求延迟或者其他问题。因此,在进行批量坐标转换时,应该根据实际情况控制并发请求的数量,以保证接口的稳定性和响应速度。
方法2
新建 utils/wgs84ToBd09.js 文件(复制粘贴即可,注意修改本文件的id)
/**
* WGS84转GCj02
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
* @param lng // 120.63014 (并非字符串)
* @param lat // 32.394913 (并非字符串)
* @param args // 其他的参数,传入格式为 {aaa: "aaa",bbb: "bbb",ccc: "ccc"}
* @DEMO: wgs84ToGcj02ToBd09Public(120.63014, 32.394913, {aaa: "aaa",bbb: "bbb",ccc: "ccc"})
* @returns {*[{aaa: "aaa",bbb: "bbb",ccc: "ccc",latitude: 32.414345685248584,longitude: 120.52607270431302}]}
* @Intro: 先将WGS84坐标转火星坐标再将火星坐标转百度坐标
*/
export function wgs84ToGcj02ToBd09Public(lng, lat, ...args) {
const xPI = (3.14159265358979324 * 3000.0) / 180.0;
const PI = 3.1415926535897932384626;
const a = 6378245.0;
const ee = 0.00669342162296594323;
// WGS84转GCj02
let dlat = transformlat(lng - 105.0, lat - 35.0);
let dlng = transformlng(lng - 105.0, lat - 35.0);
let radlat = (lat / 180.0) * PI;
let magic = Math.sin(radlat);
magic = 1 - ee * magic * magic;
let sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI);
dlng = (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * PI);
let mglat = lat + dlat;
let mglng = lng + dlng;
// 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
let z =
Math.sqrt(mglng * mglng + mglat * mglat) + 0.00002 * Math.sin(mglat * xPI);
let theta = Math.atan2(mglat, mglng) + 0.000003 * Math.cos(mglng * xPI);
let bdlng = z * Math.cos(theta) + 0.0065;
let bdlat = z * Math.sin(theta) + 0.006;
// return [bdlng, bdlat]
/* Object.assign({}, target, source),其中第一个参数是一个空对象,第二个参数是目标对象,第三个参数是源对象。该方法会将源对象中不存在于目标对象中的属性复制到目标对象中,而不会覆盖目标对象中已经存在的同名属性。 */
return Object.assign({}, {longitude: bdlng, latitude: bdlat}, ...args);
}
function transformlat(lng, lat) {
const PI = 3.1415926535897932384626;
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 * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
2.0) /
3.0;
ret +=
((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) * 2.0) /
3.0;
ret +=
((160.0 * Math.sin((lat / 12.0) * PI) + 320 * Math.sin((lat * PI) / 30.0)) *
2.0) /
3.0;
return ret;
}
function transformlng(lng, lat) {
const PI = 3.1415926535897932384626;
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 * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
2.0) /
3.0;
ret +=
((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) * 2.0) /
3.0;
ret +=
((150.0 * Math.sin((lng / 12.0) * PI) +
300.0 * Math.sin((lng / 30.0) * PI)) *
2.0) /
3.0;
return ret;
}
使用
import { wgs84ToGcj02ToBd09 } from "@/utils/wgs84ToBd09";
// arr 是转换前的点位数据
arr.forEach((item, index) => {
helpArrRes.push(wgs84ToGcj02ToBd09(item.lng, item.lat, {id: item.clusterId}))
})
// arr 数据格式如下
arr = [
{
lng: 123123123123,
lat: 13123123,
clusterId: 1
},
{
lng: 12312311223,
lat: 1312333,
clusterId: 2
},
{
lng: 12312312323,
lat: 12412412412,
clusterId: 3
},
]