一、座標(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.00021333335 99526.00034912192)墨卡託座標(biāo),
主要用於進(jìn)程的後臺計(jì)算。直線距離嘛,加加減減幾乎計(jì)算方便。
搜狗地圖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)叶际峭ㄓ玫?,也適用於大部分地圖API產(chǎn)品,
以及他們的地圖產(chǎn)品。
例外,百度API上取到的,是BD-09座標(biāo),只適用於百度地圖相關(guān)產(chǎn)品。
例外,搜狗API上取到的,是搜狗座標(biāo),只適用於搜狗地圖相關(guān)產(chǎn)品。
例外,谷歌地球,google earth上取到的,是GPS座標(biāo),
而且是度分秒形式的經(jīng)緯度座標(biāo)。在國內(nèi)不允許使用。必須轉(zhuǎn)換為GCJ-02座標(biāo)。
4、經(jīng)緯緯度轉(zhuǎn)成墨卡託 三、座標(biāo)偏移 如果您的座標(biāo)在轉(zhuǎn)換之後,還有偏移,那麼考慮以下幾個方面。 百度地圖座標(biāo)與蘋果自帶地圖經(jīng)緯度之間的相互轉(zhuǎn)換方法:
/// 百度座標(biāo)轉(zhuǎn)高德座標(biāo)
(CLLocationCoordinate2D)GCJ02FromBD09:(CLLocationCoordinate2D)coor
{
CLLocationDegrees x_pi = 3.14159265358979324 * 3000.0 / 180.0;
CLLocationDegrees x = coor.longitude - 0.0065, y = coor.latitude - 0.006;
CLLocationDegrees z = sqrt(x * x y * y) - 0.00002 * sin(y * x_pi);
CLLocationDegrees theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
CLLocationDegrees gg_lon = z * cos(theta);
CLLocationDegrees gg_lat = z * sin(theta);
return CLLocationCoordinate2DMake(gg_lat, gg_lon);
}
// 高德座標(biāo)轉(zhuǎn)百度座標(biāo)
(CLLocationCoordinate2D)BD09FromGCJ02:(CLLocationCoordinate2D)coor
{
CLLocationDegrees x_pi = 3.14159265358979324 * 3000.0 / 180.0;
CLLocationDegrees x = coor.longitude, y = coor.latitude;
CLLocationDegrees z = sqrt(x * x y * y) 0.00002 * sin(y * x_pi);
CLLocationDegrees theta = atan2(y, x) 0.000003 * cos(x * x_pi);
CLLocationDegrees bd_lon = z * cos(theta) 0.0065;
CLLocationDegrees bd_lat = z * sin(theta) 0.006;
return CLLocationCoordinate2DMake(bd_lat, bd_lon);
}
開源項(xiàng)目JZLocationConverter:https://github.com/JackZhouCn/JZLocationConverter python版本# -*- coding: utf-8 -*-
import math
x_pi = 3.14159265358979324 * 3000.0 / 180.0
def bd_encrypt(gg):
x = gg['gg_lon']
y = gg['gg_lat']
z = math.sqrt(x * x y * y) 0.00002 * math.sin(y * x_pi)
theta = math.atan2(y, x) 0.000003 * math.cos(x * x_pi)
bd_lon = z * math.cos(theta) 0.0065
bd_lat = z * math.sin(theta) 0.006
return {'bd_lon':bd_lon, 'bd_lat':bd_lat}
def bd_decrypt(bd):
x = bd['bd_lon'] - 0.0065
y = bd['bd_lat'] - 0.006;
z = sqrt(x * x y * y) - 0.00002 * sin(y * x_pi);
theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
gg_lon = z * cos(theta);
gg_lat = z * sin(theta);
return {'gg_lon':gg_lon, 'gg_lat':gg_lat}
收藏學(xué)習(xí),轉(zhuǎn)自:https://segmentfault.com/a/1190000003023989 |
|