http://bbs.amap.com/thread-18617-1-1.html#rd?sukey=cbbc36a2500a2e6c2b0b19115118ace519002ff3a52731f1388ddf5bf3a144e9ae715c2253b0bba87b05dcc82d6c0e74javascript
摘要:各類座標體系之間如何轉換?到底有哪些座標體系?什麼是火星座標?爲何個人座標,在地圖上顯示會有偏移?本文詳細解答以上問題。最後給出座標拾取工具。
---------------------------------------------------------------------------------------------------------------------------
1、座標體系
首先咱們要明白,開發者能接觸到哪些座標體系呢?
第一種分類:
一、 GPS,WGS-84,原始座標體系。通常用國際標準的GPS記錄儀記錄下來的座標,都是GPS的座標。很惋惜,在中國,任何一個地圖產品都不容許使用GPS座標,聽說是爲了保密。GPS座標形式如圖,度分秒形式的經緯度:
二、 GCJ-02,國測局02年發佈的座標體系。又稱「火星座標」。在中國,必須至少使用GCJ-02的座標體系。好比谷歌,騰訊,高德都在用這個座標體系。GCJ-02也是國內最普遍使用的座標體系。
三、 其餘座標體系。通常都是由GCJ-02進過偏移算法獲得的。這種體系就根據每一個公司的不一樣,座標體系都不同了。好比,百度和搜狗就使用本身的座標體系,與其餘座標體系不兼容。
第二種分類:
首先明白,全部座標體系的原點,都是非洲。
一、 經緯度。這個是球面座標,對於北京來講,就是(116.38817139.935961)這樣的座標。好比騰訊、高德、百度都是這樣的經緯度座標。谷歌是經緯度順序寫反的經緯度座標。
若是是度分秒座標,須要進行轉換,才能獲得這樣的經緯度座標。詳見座標轉換。
二、 墨卡託座標。平面座標,至關因而直線距離,數字通常都比較大,像這樣的。(215362.00021333335 99526.00034912192)
墨卡託座標,主要用於程序的後臺計算。直線距離嘛,加加減減幾乎計算方便。
搜狗地圖API就是直接使用的墨卡託座標。
2、座標轉換
在各類web端平臺,或者高德、騰訊、百度上取到的座標,都不是GPS座標,都是GCJ-02座標,或者本身的偏移座標系。
好比,你在谷歌地圖API,高德地圖API,騰訊地圖API上取到的,都是GCJ-02座標,他們三家都是通用的,也適用於大部分地圖API產品,以及他們的地圖產品。
例外,百度API上取到的,是BD-09座標,只適用於百度地圖相關產品。
例外,搜狗API上取到的,是搜狗座標,只適用於搜狗地圖相關產品。
例外,谷歌地球,google earth上取到的,是GPS座標,並且是度分秒形式的經緯度座標。在國內不容許使用。必須轉換爲GCJ-02座標。
一、度分秒座標轉換爲經緯度
好比,在GPS記錄儀,或者google earth上採集到的是39°31'20.51,那麼應該這樣換算,31分就是31/60度,20.51秒就是20.51/3600度,結果就是39 + 31/60 + 20.51/3600 度。
二、 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
三、GCJ-02與BD-09之間互轉
國測局GCJ-02座標體系(谷歌、高德、騰訊),與百度座標BD-09體系的轉換,在CSDN上有很詳細的講解:
http://blog.csdn.net/coolypf/article/details/8569813
不過也有更簡單的算法,線性算法(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;};
四、經緯緯度轉成墨卡託
網上也有詳細講解:
http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245
五、各家API公司座標轉換接口的申請
通常須要將您的公司名稱、項目名稱、項目簡介、聯繫人和聯繫方式,發郵件至地圖API公司的商務部,通過申請,才能使用。
下面是他們的聯繫方式:
高德地圖
|
|
百度地圖
|
|
騰訊地圖
|
|
谷歌地圖
|
這個,國內沒有公交接口,你們應該不會再使用了吧。
|
(你們發現沒,高德是api,騰訊和百度是mapapi,說明什麼?)
3、座標偏移
若是您的座標在轉換以後,還有偏移,那麼考慮如下幾個方面。
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)。
4、座標拾取工具
既然在國內必須至少使用GCJ-02的座標系,而GCJ-02,「火星座標」是在國內最普遍使用的座標體系。那麼,咱們就來看看,如何直接獲取到GCJ-02座標唄。
請你們把這段代碼保存到記事本里,而後後綴名改成.html,記得用UTF-8編碼來保存。而後雙擊這個文件,就能打開網頁了。
<!
DOCTYPE HTML
>
<
html
>
<
head
>
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=utf-8"
>
<
title
>火星座標拾取
</
title
>
<
script
language
="javascript"
src
="http://webapi.amap.com/maps?v=1.2&key=6260f3e133c146a76f7c210c2786aec9"
></
script
>
<
style
>
#iMap
{
height
:
500px
;
width
:
600px
;
float
:
left
;
}
.info
{
float
:
left
;
margin
:
0 0 0 10px
;
}
label
{
width
:
80px
;
float
:
left
;
}
</
style
>
</
head
>
<
body
onLoad
="mapInit()"
>
<
div
id
="iMap"
></
div
>
<
div
class
="info"
>
<
p
><
label
>火星座標:
</
label
><
span
id
="lnglat"
>
</
span
></
p
>
<
p
><
label
>地址:
</
label
><
span
id
="iAddress"
>
</
span
></
p
>
</
br
>
<
p
>說明:
</
p
>
<
p
>一、鼠標滾輪能夠縮放地圖,拖動地圖。
</
p
>
<
p
>二、點擊地圖,便可得到GCJ-02的經緯度座標,地址。
</
p
>
</
div
>
</
body
>
<
script
language
="javascript"
>
var
mapObj;
var
lnglatXY;
//
初始化地圖
function
mapInit(){
var
opt
=
{ level:
13
//
設置地圖縮放級別
center:
new
AMap.LngLat(
116.397428
39.90923
)
//
設置地圖中心點
} mapObj
=
new
AMap.Map(
"
iMap
"
opt); AMap.event.addListener(mapObj
'
click
'
getLnglat);
//
點擊事件
}
function
geocoder() {
var
MGeocoder;
//
加載地理編碼插件
mapObj.plugin([
"
AMap.Geocoder
"
]
function
() { MGeocoder
=
new
AMap.Geocoder({ radius:
1000
extensions:
"
all
"
});
//
返回地理編碼結果
AMap.event.addListener(MGeocoder
"
complete
"
geocoder_CallBack);
//
逆地理編碼
MGeocoder.getAddress(lnglatXY); });
//
加點
var
marker
=
new
AMap.Marker({ map:mapObj icon:
new
AMap.Icon({ image:
"
http://api.amap.com/Public/images/js/mark.png
"
size:
new
AMap.Size(
58
30
) imageOffset:
new
AMap.Pixel(
-
32
-
0
) }) position: lnglatXY offset:
new
AMap.Pixel(
-
5
-
30
) }); mapObj.setFitView();}
//
回調函數
function
geocoder_CallBack(data) {
var
address;
//
返回地址描述
address
=
data.regeocode.formattedAddress;
//
返回結果拼接輸出
document.getElementById(
"
iAddress
"
).innerHTML
=
address;}
//
鼠標點擊,獲取經緯度座標
function
getLnglat(e){ mapObj.clearMap();
var
x
=
e.lnglat.getLng();
var
y
=
e.lnglat.getLat(); document.getElementById(
"
lnglat
"
).innerHTML
=
x
+
"
"
+
y; lnglatXY
=
new
AMap.LngLat(xy); geocoder();}
</
script
>
</
html
>
打開以後,是這樣的:
點擊一下地圖,便可得到GCJ-02座標,地址: