1. 程式人生 > >位置資訊座標轉換(GCJ02座標、WGS84座標、bd09座標之間的轉換)

位置資訊座標轉換(GCJ02座標、WGS84座標、bd09座標之間的轉換)

       現在幾乎每一個App都會收集使用者位置資訊,App得到的座標大多是通過高德地圖等SDK獲取的,當使用這些座標進行webGIS視覺化的時候會發現各種偏離狀況,座標不對,疊加錯位。這是由於不同SDK獲取到的座標可能屬於不同座標系,想要針對不同地圖的地圖將手中的座標資料轉換成相吻合的資料,可以採用coordtransform庫來解決這一問題。

首先,瞭解現如今網際網路座標系的現狀。

1. 地球座標 (WGS84)

  • 國際標準,從GPS裝置中取出的資料的座標系
  • 國際地圖提供商使用的座標系

2. 火星座標 (GCJ-02)  也叫國測局座標系

  • 中國標準,從國行移動裝置中定位獲取的座標資料使用這個座標系
  • 國家規定: 國內出版的各種地圖系統(包括電子形式),必須至少採用GCJ-02對地理位置進行首次加密。

3. 百度座標 (BD-09)

  • 百度標準,百度 SDK,百度地圖,Geocoding 使用
  • 百度在火星座標上來了個二次加密

其次,裝置與座標系對應關係

1. 從裝置獲取經緯度(GPS)座標

  • 百度SDK,可以獲取百度座標(bd09,預設)或者火星座標(GCJ02)
  • IOS原生定位庫,可以獲取WGS84座標
  • 高德SDK,可以獲取GCJ02座標

2. 網際網路線上地圖使用的座標系

- 火星座標系:

  • ios地圖(其實是高德)
  • Google國內地圖(.cn域名下)
  • 搜搜、阿里雲、高德地圖、騰訊

- 百度座標系:

  • 百度地圖

- WGS84座標系:

  • Google國外地圖
  • osm地圖等國外地圖

最後,使用coordtransform庫進行座標轉換

該庫有NodeJS、瀏覽器、python以及命令列等用法,我參與的專案是需要從網頁上將座標以WGS84座標匯出,因此採用了瀏覽器方式,其他方法請參考連結文件。關鍵程式碼如下:

function exportWGS84Excel () {
    ......

	$.ajax({
	    url:'/trace/web_getLocationList',
	    dataType: "json",
	    type: 'POST',
	    data:{"StartDate":startDate,"EndDate":endDate,"GroupID":GroupID,"UserID":UserID},
	    success:function (json) {
	        if(json!= null) {
	            for (var i = 0; i < json.recs.length; i++) {  
	          	    //國測局座標轉wgs84座標
	          		var gcj02towgs84 = coordtransform.gcj02towgs84(json.recs[i].Longitude, json.recs[i].Latitude);
	          		json.recs[i].Longitude = gcj02towgs84[0];
	          		json.recs[i].Latitude = gcj02towgs84[1];
	          	}  
	          	 JSONToExcelConvertor(json, "匯出記錄");  
	         } 
	     },
	     error: function () {
	         alert("error page="+page);
	     }
	});	
}

                 

 

感謝:https://github.com/wandergis/coordtransform#%E5%9C%B0%E7%90%83%E5%9D%90%E6%A0%87-wgs84