地理坐標系轉換工具,支持WGS84/GCJ02/BD09等常用坐標系互轉
https://github.com/hujiulong/gcoord
README.md
Gcoord
gcoord(geographic coordinates)是一個處理地理坐標系的JS庫,用來修正百度地圖、高德地圖及其它互聯網地圖坐標系不統一的問題。
支持轉換坐標數組和GeoJSON數據,能在node環境以及所有現代瀏覽器(IE8+)中運行,gzip后僅3kb。
更多信息可以閱讀地理坐標系
Install
通過npm安裝:
npm install gcoord --save
或者直接在頁面中引入:
<script src="https://unpkg.com/gcoord/dist/gcoord.js"></script>
Import
CommonJS:
const gcoord = require('gcoord'); // 或者 const { transform, WGS84, GCJ02 } = require('gcoord');
ES Module:
import gcoord from 'gcoord' // 或者 import { transform, WGS84, GCJ02 } from 'gcoord'
同時也支持AMD和CMD規范
Usage
例如從手機的GPS得到一個經緯度坐標,需要將其展示在百度地圖上,則應該將當前坐標從WGS-84坐標系轉換為BD-09坐標系
var result = gcoord.transform( [116.403988, 39.914266], // 經緯度坐標 gcoord.WGS84, // 當前坐標系 gcoord.BD09 // 目標坐標系 ); console.log(result); // [116.41661560068297, 39.92196580126834]
同時gcoord還可以轉換GeoJSON對象的坐標系,詳細使用方式可以參考API
API
transform(input, from, to)
進行坐標轉換
參數
返回值
示例
// 將GCJ02坐標轉換為WGS84坐標
var result = gcoord.transform([123, 45], gcoord.GCJ02, gcoord.WGS84); console.log(result); // [122.99395597, 44.99804071]
// 轉換GeoJSON坐標
var geojson = { "type": "Point", "coordinates": [123, 45] } gcoord.transform(geojson, gcoord.GCJ02, gcoord.WGS84); console.log(geojson.coordinates); // [122.99395597, 44.99804071]
返回數組或GeoJSON對象(由輸入決定),注意:當輸入為GeoJSON時,transform會改變輸入對象
CRS
CRS為坐標系,目標支持以下幾種坐標系
CRS | 坐標格式 | 說明 |
---|---|---|
gcoord.WGS84 | [lng,lat] | WGS-84坐標系,GPS設備獲取的經緯度坐標 |
gcoord.GCJ02 | [lng,lat] | GCJ-02坐標系,google中國地圖、soso地圖、aliyun地圖、mapabc地圖和高德地圖所用的經緯度坐標 |
gcoord.BD09 | [lng,lat] | BD-09坐標系,百度地圖采用的經緯度坐標 |
gcoord.BD09LL | [lng,lat] | 同BD09 |
gcoord.BD09MC | [x,y] | BD-09米制坐標,百度地圖采用的米制坐標,單位:米 |
gcoord.BD09Meter | [x,y] | 同BD09MC |
gcoord.Baidu | [lng,lat] | 百度坐標系,BD-09坐標系別名,同BD-09 |
gcoord.BMap | [lng,lat] | 百度地圖,BD-09坐標系別名,同BD-09 |
gcoord.AMap | [lng,lat] | 高德地圖,同GCJ-02 |
gcoord.WebMercator | [x,y] | Web Mercator投影,墨卡托投影,同EPSG3857,單位:米 |
gcoord.WGS1984 | [lng,lat] | WGS-84坐標系別名,同WGS-84 |
gcoord.EPSG4326 | [lng,lat] | WGS-84坐標系別名,同WGS-84 |
gcoord.EPSG3857 | [x,y] | Web Mercator投影,同WebMercator,單位:米 |
gcoord.EPSG900913 | [x,y] | Web Mercator投影,同WebMercator,單位:米 |
支持更多坐標系? gcoord的目標是處理web地圖中的坐標,目前支持的坐標系已經能滿足絕大部分要求了,同時gcoord也能保持輕量。如果需要更專業的坐標系處理工具,可以使用proj4js等開源庫
LICENSE
MIT
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
提供了百度坐標(BD09)、國測局坐標(火星坐標,GCJ02)、和WGS84坐標系之間的轉換
https://github.com/wandergis/coordtransform#%E5%9C%B0%E7%90%83%E5%9D%90%E6%A0%87-wgs84
README.md
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方式和直接引用方式)
- GitHub地址:https://github.com/wandergis/coordtransform
- npm地址:https://www.npmjs.com/package/coordtransform
- 項目主頁:http://wandergis.github.io/coordtransform/
為什么寫這個模塊
隨着移動互聯網的興起,幾乎每一個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。