地图经纬度转换(百度,高德,谷歌,Leaflet)

-----因项目需求,要把百度地图的经纬度转换成Leaflet经纬度,感谢leaflet群里一个老哥提供的坐标转换插件(gcoord)-----

常用地图的经纬度一般为这几种格式:GCJ02BD09WGS84(既EPSG:4326)EPSG:3857(基于墨卡托坐标系)

高德、腾讯(使用GCJ02)

  1. GCJ-02坐标系,也称火星坐标系,由中国国家测绘局在02年发布,是在GPS坐标(WGS-84坐标系)基础上经加密后而来。

谷歌(使用GCJ02和WGS84)

  1. 谷歌国内版经纬度用的 GCJ02(又名 国测局 或 火星坐标 )。
    国外版用的是WGS84,通常【GPS设备获取到的原始经纬度和国外的地图厂商使用的都是WGS-84坐标系】,此外它的EPSG编号为EPSG:4326

百度(使用BD09)

  1. BD09坐标,是在的GCJ02基础上再加密得到

Leaflet(默认使用EPSG:3857,也可以使用WGS84)

  1. EPSG:3857是平面坐标系,单位是米,它基于墨卡托投影,例如: [12914838.35, 4814529.9]
  2. 详细解释:GCJ02BD09WGS84都是地理坐标系,球面坐标,单位为,这种坐标方便在地球上定位,但是不方便展示和进行面积距离计算,我们印象中的地图都是平面的,所以就有了另外一种平面坐标系,平面坐标系是通过投影的方式从地理坐标系中转换过来,所以也称为投影坐标系,通常单位为,投影坐标系根据投影方式的不同存在多种,在Web开发的场景里通常使用的是Web墨卡托投影,编号为EPSG:3857,它基于墨卡托投影,把WGS-84坐标系投影成正方形,这是通过舍弃了南北85.051129纬度以上的地区实现的,因为它是正方形,所以一个大的正方形可以很方便的被分割为更小的正方形。

如何将xy轴坐标与经纬度坐标互转

  1. 在一般情况下,想要把EPSG:3857的坐标在球面坐标系上使用时,必须转换成经纬度坐标,方法如下:
//  EPSG3857 xy轴坐标 转 经纬度坐标
const Convert_EPSG3857_To_Default3857 = (lat, lng) => {
  let tempLng = lng/20037508.34*180;
  let tempLat = lat/20037508.34*180;
  tempLat = 180/Math.PI*(2*Math.atan(Math.exp(tempLat*Math.PI/180))-Math.PI/2);
  return {
    lng: lng == 0 ? 0 : tempLng,
    lat: lat == 0 ? 0 : tempLat
  };
};
//  经纬度坐标 转 EPSG3857 xy轴坐标
const Convert_Default3857_To_EPSG3857 = (lat, lng) => {
  let mercator = {};
  let x = lng * 20037508.34 / 180;
  let y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
  y = y * 20037508.34 / 180;
  mercator.x = x;
  mercator.y = y;
  return {
    lng: lng == 0 ? 0 : mercator.x,
    lat: lat == 0 ? 0 : mercator.y
  };
};

各种经纬度坐标互转

  1. 通过插件进行转换
// 百度 转 EPSG3857
const Convert_BD09_To_EPSG3857 = (lat, lng) => {
  // 使用工具将百度经纬度直接转成EPSG:3857
  let result = gcoord.transform(
    [lng, lat],        // 经纬度坐标
    gcoord.BD09,       // 当前坐标系
    gcoord.EPSG3857    // 目标坐标系
  );
  return {
    lng: lng == 0 ? 0 : result[0],
    lat: lat == 0 ? 0 : result[1]
  };
};
// EPSG3857 转 百度
const Convert_EPSG3857_To_BD09 = (lat, lng) => {
  // 使用工具将EPSG:3857经纬度直接转成百度经纬度
  let result = gcoord.transform(
    [lng, lat],    		// 经纬度坐标
    gcoord.EPSG3857,	// 当前坐标系
    gcoord.BD09         // 目标坐标系
  );
  return {
    lng: lng == 0 ? 0 : result[0],
    lat: lat == 0 ? 0 : result[1]
  };
};

注:如想要 leaflet 地图使用源码可私信我或评论区留邮箱

坐标转换(插件 gcoord )

插件使用方法:

// 引入插件 gcoord,(摘自插件文档)
let result = gcoord.transform(
  [116.403988, 39.914266],    // 经纬度坐标
  gcoord.WGS84,               // 当前坐标系
  gcoord.BD09                 // 目标坐标系
);
console.log(result);  // [116.41661560068297, 39.92196580126834]
// 当前坐标和目标坐标就是下面的 CRS,找到对应的值,进行转换即可

附gcoord文档内,各种经纬度说明:

CRS

坐标格式

说明

gcoord.WGS84

[lng,lat]

WGS-84坐标系,GPS设备获取的经纬度坐标

gcoord.GCJ02

[lng,lat]

GCJ-02坐标系,google中国地图、soso地图、aliyun地图、mapabc地图和高德地图所用的经纬度坐标

gcoord.BD09

[lng,lat]

BD-09坐标系,百度地图采用的经纬度坐标

gcoord.BD09LL

[lng,lat]

同BD09

gcoord.BD09MC

[x,y]

BD-09米制坐标,百度地图采用的米制坐标,单位:米

gcoord.BD09Meter

[x,y]

同BD09MC

gcoord.Baidu

[lng,lat]

百度坐标系,BD-09坐标系别名,同BD-09

gcoord.BMap

[lng,lat]

百度地图,BD-09坐标系别名,同BD-09

gcoord.AMap

[lng,lat]

高德地图,同GCJ-02

gcoord.WebMercator

[x,y]

Web Mercator投影,墨卡托投影,同EPSG3857,单位:米

gcoord.WGS1984

[lng,lat]

WGS-84坐标系别名,同WGS-84

gcoord.EPSG4326

[lng,lat]

WGS-84坐标系别名,同WGS-84

gcoord.EPSG3857

[x,y]

Web Mercator投影,同WebMercator,单位:米

gcoord.EPSG900913

[x,y]

Web Mercator投影,同WebMercator,单位:米