您的位置:

如何将BD09坐标系转换为WGS84?

一、BD09坐标系和WGS84坐标系介绍

BD09坐标系是百度地图使用的一种经纬度坐标系,它是在GCJ-02基础上加密得到的,因此也称为BD-09MC(百度—09经纬度坐标系)。WGS84坐标系是全球定位系统(GPS)所使用的坐标系,以地球椭球体为基准面,经过多次修正和完善后,已成为世界标准的地理坐标系。由于两个坐标系基准面不同,因此需要进行坐标转换操作。

二、坐标转换方法

坐标转换可以通过数学计算方法和调用第三方API两种方式实现。下面分别介绍这两种方法。

1. 数学计算法

数学计算法需要用到一些公式,转换过程如下:

1)将BD09经纬度转换为BD09墨卡托坐标。BD09经纬度转BD09墨卡托坐标公式如下:
x = lon * 20037508.34 / 180;
y = log(tan((90 + lat) * pi / 360)) / (pi / 180);
y = y * 20037508.34 / 180;

2)将BD09墨卡托坐标转换为WGS84墨卡托坐标(即GCJ-02坐标系)。BD09墨卡托坐标转GCJ-02坐标系的公式如下:
x = x / 20037508.34 * 180;
y = y / 20037508.34 * 180;
y = 180 / pi * (2 * atan(exp(y * pi / 180)) - pi / 2);
gcjLon = x - (cos((a * pi) / 180) * x + sin((a * pi) / 180) * y) + 0.0065;
gcjLat = y - (sin((a * pi) / 180) * x + cos((a * pi) / 180) * y) + 0.006;
a:此处a为偏移角度,中国在地图上的投影采用的是2000国家大地坐标系,该系的常数为54年椭球的偏移量+CGCS2000三维七参数坐标系转换常数,也就是说54年椭球基准面转成2000三维基准面+由CGCS2000转换而成的平面坐标系。
3)将GCJ-02坐标转换为WGS84坐标。具体实现可以使用开源库,如Java语言中的WGS84ToGCJ02和GCJ02ToWGS84方法,也可以使用相关API,如WebService的坐标转换接口。

2. 调用API法

调用API法是使用现有的坐标转换API,如高德地图、百度地图等,通过调用API的方式将BD09坐标系转换为WGS84坐标。

Java代码示例:
public String convertBD09toWGS84(double lat, double lon) throws Exception{
    String lngLat = lon + "," + lat;
    String url = "https://api.map.baidu.com/geoconv/v1/?coords="+lngLat+"&from=5&to=6&ak=your_ak";
    String json = HttpClientUtil.getData(url);
    JSONObject jsonObject = JSONObject.fromObject(json);
    if (jsonObject.getInt("status") != 0){
        throw new Exception("调用API返回异常");
    }
    JSONArray result = jsonObject.getJSONArray("result");
    double wgsLon = ((JSONObject)result.get(0)).getDouble("x");
    double wgsLat = ((JSONObject)result.get(0)).getDouble("y");
    return wgsLat + "," + wgsLon;
}
调用百度地图API,参数解释:
coords:需要转换的坐标,格式为“经度,纬度”,多组坐标之间用英文分号分隔,坐标个数不超过100个。
from:原坐标系,可选值为0、2、3、4、5或6(详情请查阅百度API文档)
to:目标坐标系,可选值同上
ak:开发者密钥,需要用户去百度地图开放平台注册获取。

三、总结

本文主要介绍了BD09坐标系和WGS84坐标系的概念及坐标转换方法。随着地图应用的普及和开发的不断深入,坐标转换的需求越来越多。具体的转换方式可以根据实际情况来选择,比如需要精度更高的可以选择数学计算法,而对于一些简单的应用,调用API就可以满足需求。