地图经纬度转换(百度,高德,谷歌,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,单位:米

注:[插件github地址](GitHub - hujiulong/gcoord: 地理坐标系转换工具)

参考:[墨卡托坐标系与经纬度坐标系互相转换](墨卡托坐标系与经纬度坐标系互相转换 - 简书 (jianshu.com))

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐