百度、谷歌高德等網絡地圖經緯度偏差糾正以及相關坐標系問題


 
根據經驗得到的:
(1)百度地圖的差別是(0.01185,-0.00328)
 
如果百度地圖的經緯度是(x,y)實際的應該是(x,y)+(-0.01185,-0.00328)=(x-0.01185,y-0.00328)
 
(2)google Map的差別是(0.0143,-0.014)
如果用getscreen截圖,如果要截的范圍為(x,y),輸入getscreen的為(x-0.0143,y+0.014).
 
后來經過自己驗證,的卻差不多。
 
下面講一下網絡發布的地圖的偏差問題:
 
 

摘要:各種坐標體系之間如何轉換?到底有哪些坐標體系?什么是火星坐標?為什么我的坐標在地圖上顯示會有偏移?本文詳細解答以上問題。最后給出坐標拾取工具。

一、坐標體系
首先我們要明白,開發者能接觸到哪些坐標體系呢?
第一種分類:
1、 GPS,WGS-84,原始坐標體系。一般用國際標准的GPS記錄儀記錄下來的坐標,都是GPS的坐標。很可惜,在中國,任何一個地圖產品都不允許使用GPS坐標,據說是為了保密。GPS坐標形式如圖,度分秒形式的經緯度:

百度、谷歌高德等網絡地圖經緯度偏差糾正以及相關坐標系問題百度、谷歌高德等網絡地圖經緯度偏差糾正以及相關坐標系問題

2、 GCJ-02,國測局02年發布的坐標體系。又稱“火星坐標”。在中國,必須至少使用GCJ-02的坐標體系。比如谷歌,騰訊,高德都在用這個坐標體系。GCJ-02也是國內最廣泛使用的坐標體系

3、其他坐標體系。一般都是由GCJ-02進過偏移算法得到的。這種體系就根據每個公司的不同,坐標體系都不一樣了。比如,百度和搜狗就使用自己的坐標體系,與其他坐標體系不兼容。

 

第二種分類:

首先明白,所有坐標體系的原點,都是非洲。

百度、谷歌高德等網絡地圖經緯度偏差糾正以及相關坐標系問題

1、經緯度。這個是球面坐標,對於北京來說,就是(116.38817139.935961)這樣的坐標。比如騰訊、高德、百度都是這樣的經緯度坐標。谷歌是經緯度順序寫反的經緯度坐標。

如果是度分秒坐標,需要進行轉換,才能得到這樣的經緯度坐標。詳見坐標轉換。

2、墨卡托坐標。平面坐標,相當於是直線距離,數字一般都比較大,像這樣的。(215362.00021333335 99526.00034912192)

墨卡托坐標,主要用於程序的后台計算。直線距離嘛,加加減減幾乎計算方便。

搜狗地圖API就是直接使用的墨卡托坐標。

 

二、坐標轉換

在各種web端平台,或者高德、騰訊、百度上取到的坐標,都不是GPS坐標,都是GCJ-02坐標,或者自己的偏移坐標系。

比如,你在谷歌地圖API,高德地圖API,騰訊地圖API上取到的,都是GCJ-02坐標,他們三家都是通用的,也適用於大部分地圖API產品,以及他們的地圖產品。

例外,百度API上取到的,是BD-09坐標,只適用於百度地圖相關產品。

例外,搜狗API上取到的,是搜狗坐標,只適用於搜狗地圖相關產品。

例外,谷歌地球,google earth上取到的,是GPS坐標,而且是度分秒形式的經緯度坐標。在國內不允許使用。必須轉換為GCJ-02坐標。

 

1、度分秒坐標轉換為經緯度

比如,在GPS記錄儀,或者google earth上采集到的是39°31'20.51,那么應該這樣換算,31分就是31/60度,20.51秒就是20.51/3600度,結果就是39 + 31/60 + 20.51/3600 度。

 

2、 GPS轉換為GCJ-02坐標

谷歌,高德,騰訊的地圖API官網上,都不直接提供這樣的坐標轉換。如果要得到GCJ-02坐標,最好在他們的地圖上直接取點,或者通過地址解析得到。(這個工具我后續會貼出來的。我就愛干這樣的事情,哈哈。)

 

不過,在網上搜到了這樣的接口,該接口的type=1就是GPS轉到GCJ-02的墨卡托坐標。請大家對接口保密,哈哈。詳見:

http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro

 

3、GCJ-02與BD-09之間互轉

國測局GCJ-02坐標體系(谷歌、高德、騰訊),與百度坐標BD-09體系的轉換,在CSDN上有很詳細的講解:

http://blog.csdn.net/coolypf/article/details/8569813

轉換算法如下:

#include   
  
const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
  
void bd_encrypt(double gg_lat, double gg_lon, double &bd_lat, double &bd_lon)  
{  
    double x = gg_lon, y = gg_lat;  
    double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);  
    double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);  
    bd_lon = z * cos(theta) + 0.0065;  
    bd_lat = z * sin(theta) + 0.006;  
}  
  
void bd_decrypt(double bd_lat, double bd_lon, double &gg_lat, double &gg_lon)  
{  
    double x = bd_lon - 0.0065, y = bd_lat - 0.006;  
    double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);  
    double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);  
    gg_lon = z * cos(theta);  
    gg_lat = z * sin(theta);  
}  

js中使用Math.atan2(sqrt,sin,cos)方法即可

 

不過也有更簡單的算法,線性算法(lat和lng是經緯度,球面坐標):

To_B是轉到百度,To_G是轉到GCJ-02。

var TO_BLNG = function(lng){return lng+0.0065;};

var TO_BLAT = function(lat){return lat+0.0060;};

var TO_GLNG = function(lng){return lng-0.0065;};

var TO_GLAT = function(lat){return lat-0.0060;};

 

4、經緯緯度轉成墨卡托

網上也有詳細講解:

http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245

內容如下:

在WebGIS的開發中經常用到的地圖投影為Web墨卡托和WGS84,故歌地圖,bingmaps,百度地圖,mapabc,mapbar,以及ArcGIS online上的大部分地圖為Web墨卡托地圖,ArcGIS online上最開始發布的地圖投影為WGS84。
在開發過程中很多時候會遇到不同坐標系之間互轉的問題,特別是底圖使用Web墨卡托,定位(GPS,wifi等)信號坐標為WGS84坐標的時候,那么通用解決方案就是寫一個坐標參考系的轉換庫,類似於proj4,但一般情況下很少用到那么多的參考系之間的互轉,並且在客戶端實現或者調用proj4都是一件很困難或者麻煩的事情,大多數情況下我們實現Web墨卡托坐標與WGS84坐標互轉就可以了。
下面是使用objective-c實現的Web墨卡托坐標與WGS84坐標互轉程序,當然也可以使用其他語言來實現,使用起來比較簡單和方便。

 

//經緯度轉墨卡托
-(CGPoint )lonLat2Mercator:(CGPoint ) lonLat
{
    CGPoint  mercator;
    double x = lonLat.x *20037508.34/180;
    double y = log(tan((90+lonLat.y)*M_PI/360))/(M_PI/180);
    y = y *20037508.34/180;
    mercator.x = x;
    mercator.y = y;
    return mercator ;
}
//墨卡托轉經緯度
-(CGPoint )Mercator2lonLat:(CGPoint ) mercator
{
    CGPoint lonLat;
    double x = mercator.x/20037508.34*180;
    double y = mercator.y/20037508.34*180;
    y= 180/M_PI*(2*atan(exp(y*M_PI/180))-M_PI/2);
    lonLat.x = x;
    lonLat.y = y;
    return lonLat;
}

 

三、坐標偏移
如果您的坐標在轉換之后,還有偏移,那么考慮以下幾個方面。
A、原始坐標系弄錯,比如以為自己是GPS坐標,但其實已經是GCJ-02坐標。
解決方案:請確保采集到的數據是哪個坐標體系,需要轉換到哪個坐標系,再進行坐標轉換。
B、原始坐標准確度不夠
解決方案:如果您是GPS坐標,請確保采集GPS數據時,搜到至少4顆以上的衛星。並且GPS數據准不准,還取決於周圍建築物的高度,越高越不准,因為有遮擋。
如果本來就是GCJ-02坐標,在不同地圖放大級別的時候,看到的地方可能不一樣。比如你在地圖級別4(國家)取到的坐標,放大到地圖12級(街道)時,坐標就偏了。請確保在地圖最大放大級別時,拾取坐標。
C、度分秒的概念混淆
比如,在google earth上采集到的是39°31'20.51,那么應該這樣換算,31分就是31/60度,20.51秒就是20.51/3600度,結果就是39 + 31/60 + 20.51/3600 度。
D、經緯度順序寫反了
有些公司(比如高德,百度,騰訊)是先經度,再緯度,即Point(lng lat)。但谷歌坐標的順序恰好相反,是(lat lng)。

四、坐標拾取工具
既然在國內必須至少使用GCJ-02的坐標系,而GCJ-02,“火星坐標”是在國內最廣泛使用的坐標體系。那么,我們就來看看,如何直接獲取到GCJ-02坐標唄。
請大家把這段代碼保存到記事本里,然后后綴名改為.html,記得用UTF-8編碼來保存。然后雙擊這個文件,就能打開網頁了。

 

 


說明:

1、鼠標滾輪可以縮放地圖,拖動地圖。

2、點擊地圖,即可獲得GCJ-02的經緯度坐標,地址。

 

打開之后,是這樣的:

百度、谷歌高德等網絡地圖經緯度偏差糾正以及相關坐標系問題

點擊一下地圖,即可獲得GCJ-02坐標,地址:百度、谷歌高德等網絡地圖經緯度偏差糾正以及相關坐標系問題

 

demo地址:http://zhaoziang.com/amap/picpoint.html

 

 

來源:http://blog.sina.com.cn/s/blog_80a9926b0101ktoa.html


免責聲明!

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



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