gcoord: 轉換WGS84、GCJ02、BD09座標,轉換百度高德地圖座標系

莫夭發表於2018-02-24

做過地圖相關開發的同學肯定會遇到這樣一個問題:同樣的經緯度座標,在百度地圖和高德地圖上位置不一樣。

crs.jpg

關於座標系

我們通常用經緯度來表示一個地理位置,但是由於一些原因,我們從不同渠道得到的經緯度資訊可能並不是在同一個座標系下。

  • 高德地圖、騰訊地圖以及谷歌中國區地圖使用的是GCJ-02座標系
  • 百度地圖使用的是BD-09座標系
  • 底層介面(HTML5 Geolocation或ios、安卓API)通過GPS裝置獲取的座標使用的是WGS-84座標系

不同的座標系之間可能有幾十到幾百米的偏移,所以在開發基於地圖的產品,或者做地理資料視覺化時,我們需要修正不同座標系之間的偏差。

WGS-84 - 世界大地測量系統

WGS-84(World Geodetic System, WGS)是使用最廣泛的座標系,也是世界通用的座標系,GPS裝置得到的經緯度就是在WGS84座標系下的經緯度。通常通過底層介面得到的定位資訊都是WGS84座標系。

GCJ-02 - 國測局座標

GCJ-02(G-Guojia國家,C-Cehui測繪,J-Ju局),又被稱為火星座標系,是一種基於WGS-84制定的大地測量系統,由中國國測局制定。此座標系所採用的混淆演算法會在經緯度中加入隨機的偏移。

國家規定,中國大陸所有公開地理資料都需要至少用GCJ-02進行加密,也就是說我們從國內公司的產品中得到的資料,一定是經過了加密的。絕大部分國內網際網路地圖提供商都是使用GCJ-02座標系,包括高德地圖,谷歌地圖中國區等。

導航電子地圖在公開出版、銷售、傳播、展示和使用前,必須進行空間位置技術處理。— GB 20263―2006《導航電子地圖安全處理技術基本要求》,4.1

BD-09 - 百度座標系

BD-09(Baidu, BD)是百度地圖使用的地理座標系,其在GCJ-02上多增加了一次變換,用來保護使用者隱私。從百度產品中得到的座標都是BD-09座標系。

解決方案

百度地圖以及高德地圖都提供了一些方法來轉換不同座標系下的座標,但是它們都需要進行網路請求,效能很差。 在春節假期時,我做了一個庫gcoord來做這些事。

gcoord

gcoord主要解決了兩個問題

  • 能將座標在不同座標系下相互轉換
  • 能夠處理GeoJSON

GeoJSON是地理行業一種通用的資料格式,它本質上就是JSON,不過對欄位有一些約定。

gcoord使用起來非常簡單 例如從手機的GPS得到一個經緯度座標,需要將其展示在百度地圖上,則可以通過gcoord將當前座標從WGS-84座標系轉換為BD-09座標系

var result = gcoord.transform(
    [ 116.403988, 39.914266 ],    // 經緯度座標
    gcoord.WGS84,                 // 當前座標系
    gcoord.BD09                   // 目標座標系
);
console.log( result );  // [ 116.41661560068297, 39.92196580126834 ]
複製程式碼

詳細的使用方式請檢視gcoord的文件

歡迎大家star

相關文章