WGS84、GCJ02、BD09 坐標系之間的轉換算法


 

 

https://github.com/wandergis/coordtransform

coordtransform 坐標轉換


一個提供了百度坐標(BD09)、國測局坐標(火星坐標,GCJ02)、和WGS84坐標系之間的轉換的工具模塊。

python版本:https://github.com/wandergis/coordTransform_py

命令行版本(支持模塊或在命令行直接轉換geojson數據):https://github.com/wandergis/coordtransform-cli

go語言社區版本:https://github.com/qichengzx/coordtransform


支持node、瀏覽器(AMD方式和直接引用方式)

為什么寫這個模塊

隨着移動互聯網的興起,幾乎每一個app都會去收集用戶位置,如果恰好你在處理與地理定位相關的代碼,並且不了解地理坐標系的話,肯定要被我大天朝各種坐標系搞暈。寫這個模塊的目的也是因為項目中app獲取的坐標是百度sdk獲取的,在做webgis可視化的時候各種偏,各種坐標不對,疊加錯位。

當前互聯網地圖的坐標系現狀

地球坐標 (WGS84)

  • 國際標准,從 GPS 設備中取出的數據的坐標系
  • 國際地圖提供商使用的坐標系

火星坐標 (GCJ-02)也叫國測局坐標系

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

百度坐標 (BD-09)

  • 百度標准,百度 SDK,百度地圖,Geocoding 使用
  • (本來就亂了,百度又在火星坐標上來個二次加密)

開發過程需要注意的事

  • 從設備獲取經緯度(GPS)坐標

      	如果使用的是百度sdk那么可以獲得百度坐標(bd09)或者火星坐標(GCJ02),默認是bd09
      	如果使用的是ios的原生定位庫,那么獲得的坐標是WGS84
      	如果使用的是高德sdk,那么獲取的坐標是GCJ02
    
  • 互聯網在線地圖使用的坐標系

      火星坐標系:
      		iOS 地圖(其實是高德)
      		Google國內地圖(.cn域名下)
      		搜搜、阿里雲、高德地圖、騰訊
      百度坐標系:
      		當然只有百度地圖
      WGS84坐標系:
      		國際標准,谷歌國外地圖、osm地圖等國外的地圖一般都是這個
    

舉個例子

筆者所在的公司app使用的是百度的sdk,需要對定位坐標做web可視化效果,百度地圖提供的js api滿足不了需求,選用leaflet來做可視化,這里要說到百度地圖了,它使用的坐標系和切圖的原點都不一致,並且其加偏還是非線性的,因此無法利用常用的加載方法去加載,放棄使用它的底圖,選用了符合標准的高德底圖,高德底圖使用的是國測局坐標也就是GCJ02坐標系,如果簡單的將app獲取的經緯度疊加上去,就有可能你本來在百度大廈的位置就顯示在西二旗地鐵站了甚至更遠,因此需要將bd09轉成gcj02坐標系,這個時候這個庫就有了用武之地,對點批量轉換再加載到底圖上,就可以讓點顯示在本應該出現的位置。

另外如果你拿到了一些WGS84的坐標,想加載到各種底圖上就可以根據這個庫在底圖坐標系和你的數據坐標系之間進行轉換。希望對大家有用吧。

安裝(install)

npm install coordtransform

示例用法(Example&Usage)

1 NodeJs用法

//國測局坐標(火星坐標,比如高德地圖在用),百度坐標,wgs84坐標(谷歌國外以及絕大部分國外在線地圖使用的坐標)
var coordtransform=require('coordtransform');
//百度經緯度坐標轉國測局坐標
var bd09togcj02=coordtransform.bd09togcj02(116.404, 39.915);
//國測局坐標轉百度經緯度坐標
var gcj02tobd09=coordtransform.gcj02tobd09(116.404, 39.915);
//wgs84轉國測局坐標
var wgs84togcj02=coordtransform.wgs84togcj02(116.404, 39.915);
//國測局坐標轉wgs84坐標
var gcj02towgs84=coordtransform.gcj02towgs84(116.404, 39.915);
console.log(bd09togcj02);
console.log(gcj02tobd09);
console.log(wgs84togcj02);
console.log(gcj02towgs84);
//result
//bd09togcj02:   [ 116.39762729119315, 39.90865673957631 ]
//gcj02tobd09:   [ 116.41036949371029, 39.92133699351021 ]
//wgs84togcj02:  [ 116.41024449916938, 39.91640428150164 ]
//gcj02towgs84:  [ 116.39775550083061, 39.91359571849836 ]

2 瀏覽器用法 直接引用目錄內的index.js,會有一個coordtransform的全局對象暴露出來,也支持用AMD加載器加載

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>coordTransform</title>
</head>
<body>
<h1>請按F12打開控制台查看結果</h1>
<script src="index.js"></script>
<script>
    //國測局坐標(火星坐標,比如高德地圖在用),百度坐標,wgs84坐標(谷歌國外以及絕大部分國外在線地圖使用的坐標)
    //百度經緯度坐標轉國測局坐標
    var bd09togcj02 = coordtransform.bd09togcj02(116.404, 39.915);
    //國測局坐標轉百度經緯度坐標
    var gcj02tobd09 = coordtransform.gcj02tobd09(116.404, 39.915);
    //wgs84轉國測局坐標
    var wgs84togcj02 = coordtransform.wgs84togcj02(116.404, 39.915);
    //國測局坐標轉wgs84坐標
    var gcj02towgs84 = coordtransform.gcj02towgs84(116.404, 39.915);
    console.log(bd09togcj02);
    console.log(gcj02tobd09);
    console.log(wgs84togcj02);
    console.log(gcj02towgs84);
    //result
    //bd09togcj02:   [ 116.39762729119315, 39.90865673957631 ]
    //gcj02tobd09:   [ 116.41036949371029, 39.92133699351021 ]
    //wgs84togcj02:  [ 116.41024449916938, 39.91640428150164 ]
    //gcj02towgs84:  [ 116.39775550083061, 39.91359571849836 ]
</script>
</body>
</html>

todos

  • 墨卡托坐標
  • geojson轉換
  • 批量轉換
  • turf插件
  • leaflet插件

sometipes

對於做GIS的人來說,底圖對我們還是很重要的,有時候看國外的底圖很好看,換上之后發現坐標位置全部不對,因此寫了這個包幫助大家完成坐標的轉換,也准備寫成一個leaflet的擴展,方便大家的使用,喜歡的童鞋請star,O(∩_∩)O


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM