關鍵詞:百度圖片坐標和騰訊地圖坐標轉換 | 關于坐標系的學習
時間:2016-6-2 10:13
作者:三月懶驢
認識坐標系
什么叫做坐標系塞弊?地理學得一般般岩睁。唯有在網(wǎng)上隨便找一篇文章糊弄一下大家
地球是一個不規(guī)則橢圓體,GIS中的坐標系定義由基準面和地圖投影兩組參數(shù)確定绝淡,而基準面的定義則由特定橢球體及其對應的轉換參數(shù)確定靠娱。
基準面是利用特定橢球體對特定地區(qū)地球表面的逼近,因此每個國家或地區(qū)均有各自的基準面阴孟。
基準面是在橢球體基礎上建立的晌纫,橢球體可以對應多個基準面税迷,而基準面只能對應一個橢球體。
意思就是無論是谷歌地圖锹漱、搜搜地圖還是高德地圖箭养、百度地圖區(qū)別只是針對不同的大地地理坐標系標準制作的經(jīng)緯度,不存在準不準的問題哥牍,大家都是準的只是參照物或者說是標準不一樣毕泌。
*copy from:haotsp.com *
看完這段長長的文字其實說,你只需要知道地圖的坐標系有很多標準嗅辣!那我們來看看有哪些標準:
- WGS84 :谷歌地圖非中國地區(qū)使用這個標準(地球坐標系)
- GCJ02:騰訊 谷歌 高德地圖中國地圖使用這個標準(火星坐標系)
- BD09:只有百度在用撼泛,因為是百度自己在GCJ02的標準上加密的
這里插一句話。很多GPS芯片獲取經(jīng)緯度都是使用WGS84標準的澡谭,但是中國地理繪測總局規(guī)定了愿题,出版的地圖要按照GCJ02的標準來做。那么很多時候我們吐槽地圖地位不好,其實不能怪硬件設備差潘酗,只不過有一些地圖木有對獲取的坐標系進行轉化就定位造就的超過民用GPS偏差10米的標準杆兵。
解決實際問題
在項目中遇到一個很奇葩的需求,用到百度地圖里面的數(shù)據(jù)仔夺,但是卻要在騰訊地圖去顯示琐脏,于是乎,對于這個坐標系的轉換的必需的缸兔。
用戶面向騰訊地圖日裙,獲取到的坐標系是GCJ02,但是騰訊地圖的API里面惰蜜,只能把BD09坐標系轉換為GCJ02坐標系阅签,而沒有把GCJ02坐標系轉換為BD09坐標系去。因此蝎抽,這個得自己手動寫個轉換政钟。
PS:有的童鞋說,百度地圖的API支持把GCJ02轉成BD09的API啊樟结,但是作為一個有理想的前端养交,當然不希望為了這么一個接口而引入多一個SDK。
以下為轉換算法瓢宦,是不是很簡單……比起引入一個龐大的SDK方便多了吧碎连。
var GCJ02_To_BD09 = function(lng,lat){
var x_pi = 3.14159265358979324 * 3000.0 / 180.0
var x = lng, y = lat
var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi)
var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi)
var newLng = z * Math.cos(theta) + 0.0065
var newLat = z * Math.sin(theta) + 0.006
}
隨手再寫個BD09轉化回去GCJ02的
var BD09_To_GCJ02 = function(lng,lat){
var x = lng - 0.0065, y = lat - 0.006
var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi)
var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi)
lng = z * Math.cos(theta)
lat = z * Math.sin(theta)
}