百度服務獲取座標放置在天地圖上實例

開始之前還是要提前寫一下涉及到的幾個座標系

WGS-84:是國際標準,GPS座標(Google Earth使用、或者GPS模塊)
GCJ-02:中國座標偏移標準,Google Map、高德、騰訊使用
BD-09:百度座標偏移標準,Baidu Map使用

CGCS2000:天地圖使用


先以北京華賓公司爲例,地址是“北京市西城區西安門大街107號”,百度地圖上是如下位置

訪問百度WEB服務API,找到“正/逆地理編碼”-“地理編碼”,可以用這個輸入上面公司的地址,返回座標。

調用接口如下,得到座標

116.38426468294915,39.928903206383797

訪問百度API示例,查看定位點

可以看到是有一點偏差的。


下面將百度的BD-09座標轉成WGS84(CGCS2000可以看作和WGS84“毫無差別”),放到天地圖上。

百度地圖沒有提供直轉的方法,因此需要將BD-09先轉成GCJ-02,再轉WGS84。

回到百度WEB服務API,找到座標轉換,根據參數說明,from爲5,to爲3。

結果爲116.37782967212564,39.92277118837159。調用結果如下:

GCJ-02座標轉WGS84網上很容易查到,也放在這裏吧

var PI = 3.14159265358979324;
function transformGCJ2WGS(gcjLat, gcjLon) {
    let d = delta(gcjLat, gcjLon)
    return {
        'lat': gcjLat - d.lat,
        'lon': gcjLon - d.lon
    }
}

function delta(lat, lon) {
    let a = 6378245.0 //  a: 衛星橢球座標投影到平面地圖座標系的投影因子。
    let ee = 0.00669342162296594323 //  ee: 橢球的偏心率。
    let dLat = transformLat(lon - 105.0, lat - 35.0)
    let dLon = transformLon(lon - 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)
    dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI)
    return {
        'lat': dLat,
        'lon': dLon
    }
}
function transformLat(x, y) {
    let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x))
    ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0
    ret += (20.0 * Math.sin(y * PI) + 40.0 * Math.sin(y / 3.0 * PI)) * 2.0 / 3.0
    ret += (160.0 * Math.sin(y / 12.0 * PI) + 320 * Math.sin(y * PI / 30.0)) * 2.0 / 3.0
    return ret
}
function transformLon(x, y) {
    let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x))
    ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0
    ret += (20.0 * Math.sin(x * PI) + 40.0 * Math.sin(x / 3.0 * PI)) * 2.0 / 3.0
    ret += (150.0 * Math.sin(x / 12.0 * PI) + 300.0 * Math.sin(x / 30.0 * PI)) * 2.0 / 3.0
    return ret
}

調用transformGCJ2WGS(注意參數是緯度在前)方法,返回116.37159805544552,39.921379265627216。分別將上述座標放到天地圖demo中,查看如下:

對比圖(天地圖-百度地圖)

由此可見,偏差不大。鑑於時間不夠,只能選取一個點來測試,有時間再選其他點嘗試下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章