百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题
百度、谷歌高德等網(wǎng)絡(luò)地圖經(jīng)緯度偏差糾正以及相關(guān)坐標(biāo)系問題
? (2014-04-29 21:41:23) 轉(zhuǎn)載▼ 標(biāo)簽:? 谷歌地圖?百度地圖?坐標(biāo)偏移計算?火星坐標(biāo) | 分類:?GIS |
如果百度地圖的經(jīng)緯度是(x,y)實(shí)際的應(yīng)該是(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). 參見:http://blog.sina.com.cn/s/blog_47522f7f0101e43b.html 后來經(jīng)過自己驗證,的卻差不多。 下面講一下網(wǎng)絡(luò)發(fā)布的地圖的偏差問題: 參見微信上高德LBS應(yīng)用開發(fā),原創(chuàng)的一篇帖子:http://mp.weixin.qq.com/s?__biz=MzA5MDE4MDMyOQ==&mid=200196710&idx=1&sn=1c455262dc9164b50d9af279b39fc689&uin=MjEzNjQ5MzMwMQ==
摘要:各種坐標(biāo)體系之間如何轉(zhuǎn)換?到底有哪些坐標(biāo)體系?什么是火星坐標(biāo)?為什么我的坐標(biāo)在地圖上顯示會有偏移?本文詳細(xì)解答以上問題。最后給出坐標(biāo)拾取工具。
一、坐標(biāo)體系
首先我們要明白,開發(fā)者能接觸到哪些坐標(biāo)體系呢?
第一種分類:
1、GPS,WGS-84,原始坐標(biāo)體系。一般用國際標(biāo)準(zhǔn)的GPS記錄儀記錄下來的坐標(biāo),都是GPS的坐標(biāo)。很可惜,在中國,任何一個地圖產(chǎn)品都不允許使用GPS坐標(biāo),據(jù)說是為了保密。GPS坐標(biāo)形式如圖,度分秒形式的經(jīng)緯度:
2、GCJ-02,國測局02年發(fā)布的坐標(biāo)體系。又稱“火星坐標(biāo)”。在中國,必須至少使用GCJ-02的坐標(biāo)體系。比如谷歌,騰訊,高德都在用這個坐標(biāo)體系。GCJ-02也是國內(nèi)最廣泛使用的坐標(biāo)體系。
3、其他坐標(biāo)體系。一般都是由GCJ-02進(jìn)過偏移算法得到的。這種體系就根據(jù)每個公司的不同,坐標(biāo)體系都不一樣了。比如,百度和搜狗就使用自己的坐標(biāo)體系,與其他坐標(biāo)體系不兼容。
第二種分類:
首先明白,所有坐標(biāo)體系的原點(diǎn),都是非洲。
1、經(jīng)緯度。這個是球面坐標(biāo),對于北京來說,就是(116.38817139.935961)這樣的坐標(biāo)。比如騰訊、高德、百度都是這樣的經(jīng)緯度坐標(biāo)。谷歌是經(jīng)緯度順序?qū)懛吹慕?jīng)緯度坐標(biāo)。
如果是度分秒坐標(biāo),需要進(jìn)行轉(zhuǎn)換,才能得到這樣的經(jīng)緯度坐標(biāo)。詳見坐標(biāo)轉(zhuǎn)換。
2、墨卡托坐標(biāo)。平面坐標(biāo),相當(dāng)于是直線距離,數(shù)字一般都比較大,像這樣的。(215362.0002133333599526.00034912192)
墨卡托坐標(biāo),主要用于程序的后臺計算。直線距離嘛,加加減減幾乎計算方便。
搜狗地圖API就是直接使用的墨卡托坐標(biāo)。
二、坐標(biāo)轉(zhuǎn)換
在各種web端平臺,或者高德、騰訊、百度上取到的坐標(biāo),都不是GPS坐標(biāo),都是GCJ-02坐標(biāo),或者自己的偏移坐標(biāo)系。
比如,你在谷歌地圖API,高德地圖API,騰訊地圖API上取到的,都是GCJ-02坐標(biāo),他們?nèi)叶际峭ㄓ玫?#xff0c;也適用于大部分地圖API產(chǎn)品,以及他們的地圖產(chǎn)品。
例外,百度API上取到的,是BD-09坐標(biāo),只適用于百度地圖相關(guān)產(chǎn)品。
例外,搜狗API上取到的,是搜狗坐標(biāo),只適用于搜狗地圖相關(guān)產(chǎn)品。
例外,谷歌地球,googleearth上取到的,是GPS坐標(biāo),而且是度分秒形式的經(jīng)緯度坐標(biāo)。在國內(nèi)不允許使用。必須轉(zhuǎn)換為GCJ-02坐標(biāo)。
1、度分秒坐標(biāo)轉(zhuǎn)換為經(jīng)緯度
比如,在GPS記錄儀,或者googleearth上采集到的是39°31'20.51,那么應(yīng)該這樣換算,31分就是31/60度,20.51秒就是20.51/3600度,結(jié)果就是39+ 31/60 + 20.51/3600 度。
2、GPS轉(zhuǎn)換為GCJ-02坐標(biāo)
谷歌,高德,騰訊的地圖API官網(wǎng)上,都不直接提供這樣的坐標(biāo)轉(zhuǎn)換。如果要得到GCJ-02坐標(biāo),最好在他們的地圖上直接取點(diǎn),或者通過地址解析得到。(這個工具我后續(xù)會貼出來的。我就愛干這樣的事情,哈哈。)
不過,在網(wǎng)上搜到了這樣的接口,該接口的type=1就是GPS轉(zhuǎn)到GCJ-02的墨卡托坐標(biāo)。請大家對接口保密,哈哈。詳見:
http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro
3、GCJ-02與BD-09之間互轉(zhuǎn)
國測局GCJ-02坐標(biāo)體系(谷歌、高德、騰訊),與百度坐標(biāo)BD-09體系的轉(zhuǎn)換,在CSDN上有很詳細(xì)的講解:
http://blog.csdn.net/coolypf/article/details/8569813
轉(zhuǎn)換算法如下:
不過也有更簡單的算法,線性算法(lat和lng是經(jīng)緯度,球面坐標(biāo)):
To_B是轉(zhuǎn)到百度,To_G是轉(zhuǎn)到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、經(jīng)緯緯度轉(zhuǎn)成墨卡托
網(wǎng)上也有詳細(xì)講解:
http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245
內(nèi)容如下:
在WebGIS的開發(fā)中經(jīng)常用到的地圖投影為Web墨卡托和WGS84,故歌地圖,bingmaps,百度地圖,mapabc,mapbar,以及ArcGISonline上的大部分地圖為Web墨卡托地圖,ArcGIS online上最開始發(fā)布的地圖投影為WGS84。
在開發(fā)過程中很多時候會遇到不同坐標(biāo)系之間互轉(zhuǎn)的問題,特別是底圖使用Web墨卡托,定位(GPS,wifi等)信號坐標(biāo)為WGS84坐標(biāo)的時候,那么通用解決方案就是寫一個坐標(biāo)參考系的轉(zhuǎn)換庫,類似于proj4,但一般情況下很少用到那么多的參考系之間的互轉(zhuǎn),并且在客戶端實(shí)現(xiàn)或者調(diào)用proj4都是一件很困難或者麻煩的事情,大多數(shù)情況下我們實(shí)現(xiàn)Web墨卡托坐標(biāo)與WGS84坐標(biāo)互轉(zhuǎn)就可以了。
下面是使用objective-c實(shí)現(xiàn)的Web墨卡托坐標(biāo)與WGS84坐標(biāo)互轉(zhuǎn)程序,當(dāng)然也可以使用其他語言來實(shí)現(xiàn),使用起來比較簡單和方便。
?
//經(jīng)緯度轉(zhuǎn)墨卡托
-(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;
??? returnmercator ;
}
//墨卡托轉(zhuǎn)經(jīng)緯度
-(CGPoint )Mercator2lonLat:(CGPoint ) mercator
{
??? CGPointlonLat;
??? 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;
??? returnlonLat;
}
三、坐標(biāo)偏移
如果您的坐標(biāo)在轉(zhuǎn)換之后,還有偏移,那么考慮以下幾個方面。
A、原始坐標(biāo)系弄錯,比如以為自己是GPS坐標(biāo),但其實(shí)已經(jīng)是GCJ-02坐標(biāo)。
解決方案:請確保采集到的數(shù)據(jù)是哪個坐標(biāo)體系,需要轉(zhuǎn)換到哪個坐標(biāo)系,再進(jìn)行坐標(biāo)轉(zhuǎn)換。
B、原始坐標(biāo)準(zhǔn)確度不夠
解決方案:如果您是GPS坐標(biāo),請確保采集GPS數(shù)據(jù)時,搜到至少4顆以上的衛(wèi)星。并且GPS數(shù)據(jù)準(zhǔn)不準(zhǔn),還取決于周圍建筑物的高度,越高越不準(zhǔn),因為有遮擋。
如果本來就是GCJ-02坐標(biāo),在不同地圖放大級別的時候,看到的地方可能不一樣。比如你在地圖級別4(國家)取到的坐標(biāo),放大到地圖12級(街道)時,坐標(biāo)就偏了。請確保在地圖最大放大級別時,拾取坐標(biāo)。
C、度分秒的概念混淆
比如,在googleearth上采集到的是39°31'20.51,那么應(yīng)該這樣換算,31分就是31/60度,20.51秒就是20.51/3600度,結(jié)果就是39+ 31/60 + 20.51/3600 度。
D、經(jīng)緯度順序?qū)懛戳?br /> 有些公司(比如高德,百度,騰訊)是先經(jīng)度,再緯度,即Point(lng lat)。但谷歌坐標(biāo)的順序恰好相反,是(latlng)。
四、坐標(biāo)拾取工具
既然在國內(nèi)必須至少使用GCJ-02的坐標(biāo)系,而GCJ-02,“火星坐標(biāo)”是在國內(nèi)最廣泛使用的坐標(biāo)體系。那么,我們就來看看,如何直接獲取到GCJ-02坐標(biāo)唄。
請大家把這段代碼保存到記事本里,然后后綴名改為.html,記得用UTF-8編碼來保存。然后雙擊這個文件,就能打開網(wǎng)頁了。
火星坐標(biāo):?
地址:?
說明:
1、鼠標(biāo)滾輪可以縮放地圖,拖動地圖。
2、點(diǎn)擊地圖,即可獲得GCJ-02的經(jīng)緯度坐標(biāo),地址。
打開之后,是這樣的:
點(diǎn)擊一下地圖,即可獲得GCJ-02坐標(biāo),地址:
demo地址:http://zhaoziang.com/amap/picpoint.html
總結(jié)
以上是生活随笔為你收集整理的百度、谷歌高德等网络地图经纬度偏差纠正以及相关坐标系问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的duplicate用法_Jav
- 下一篇: JavaMail学习6 发送邮件