Bootstrap

WGS84坐标转BD-09坐标(wgs84转百度)

推荐使用方法2 !!! 

 Web服务API | 百度地图API SDK

 方法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
          },

        ]

;