談?wù)劵鹦亲鴺?biāo)與地圖坐標(biāo)的那點(diǎn)坑

火星

? ? ?火星坐標(biāo)?你在逗我玩兒探越?沒(méi)錯(cuò)狡赐,哈哈,在天朝總有一些詞我們要去學(xué)習(xí)的钦幔。

1.火星坐標(biāo)是個(gè)什么鬼枕屉?

? ? ?我們知道在具有地圖顯示的app里,一定會(huì)用到定位功能鲤氢,通常情況下搀擂,我們的手機(jī)都自帶GPS模塊,如果我們用GPS定位卷玉,你會(huì)發(fā)現(xiàn)哨颂,基本上都有一定的偏差。這是因?yàn)檎鲇诎踩紤]相种,沒(méi)有采用國(guó)際通用的WGS84坐標(biāo)系威恼,而是在標(biāo)準(zhǔn)坐標(biāo)系上加了一些偏移,這樣的坐標(biāo)系就被稱(chēng)為“火星坐標(biāo)系”。我們來(lái)詳細(xì)看一下在iOS地圖開(kāi)發(fā)中的這幾個(gè)名詞:

(1)地球坐標(biāo)(WGS84)

國(guó)際通用標(biāo)準(zhǔn)箫措,規(guī)定GPS 設(shè)備中取出的原始數(shù)據(jù)應(yīng)該是地球坐標(biāo)缭黔。

(2)火星坐標(biāo)(GCJ-02)

適用于國(guó)內(nèi),行貨iphone的 GPS模塊獲取的也是這個(gè)坐標(biāo)系蒂破。國(guó)內(nèi)地圖供應(yīng)商基本使用該坐標(biāo)系對(duì)位置進(jìn)行加密馏谨。

2.不同的坐標(biāo)系對(duì)工程師有什么影響?

? ? ?打個(gè)比方附迷,我們要開(kāi)發(fā)一款跑步的應(yīng)用惧互,比如咕咚,我們發(fā)現(xiàn)前幾個(gè)月運(yùn)動(dòng)的數(shù)據(jù)喇伯,在我們卸載重新安裝后仍然能展示出來(lái)喊儡。這里,咕咚將我們的運(yùn)動(dòng)記錄上傳到了服務(wù)器稻据,下次使用app的時(shí)候艾猜,會(huì)自動(dòng)將我們的舊數(shù)據(jù)同步到本地,避免數(shù)據(jù)丟失捻悯。

? ? ?那么在這種場(chǎng)景下匆赃,針對(duì)不同的平臺(tái),android和iOS今缚,如果雙方?jīng)]有約定好運(yùn)動(dòng)過(guò)程中GPS定位的點(diǎn)的格式算柳,就會(huì)出現(xiàn)偏移的現(xiàn)在,明明在android上面看的軌跡是一樣樣子姓言,在iOS上確發(fā)生了偏移瞬项,這種問(wèn)題就是不同坐標(biāo)系的典型影響,造成的直接后果就是用戶(hù)蒙圈了何荚,體驗(yàn)不太好囱淋。

3.iOS開(kāi)發(fā)中那些api會(huì)涉及?

? ? ?在使用iOS的定位功能主要使用CLLocationManager餐塘,從 CLLocationManager 取出來(lái)的經(jīng)緯度直接顯示到 MKMapView上妥衣,我們發(fā)現(xiàn)會(huì)有一定的偏差,這就是將地球坐標(biāo)(前者)直接塞到了火星坐標(biāo)(MKMapView)唠倦,導(dǎo)致軌跡點(diǎn)的偏移称鳞。

通過(guò)總結(jié)對(duì)比,我們發(fā)現(xiàn)iOS地圖稠鼻,以及國(guó)內(nèi)大部分地圖冈止,如高德、Gogole等顯示的經(jīng)緯度都是火星坐標(biāo)系候齿,除了百度使用自己的坐標(biāo)系熙暴,而google地圖則使用的是地球坐標(biāo)闺属。所以要兼顧android的地圖使用方式,將兩個(gè)平臺(tái)的坐標(biāo)進(jìn)行統(tǒng)一周霉。

4.平臺(tái)統(tǒng)一的方案

? ? ?為了確保不同的平臺(tái)掂器,最終顯示的效果是一致的,就需要二者上報(bào)到服務(wù)端的軌跡點(diǎn)的坐標(biāo)系是一致的俱箱。如果你的app只是在國(guó)內(nèi)使用国瓮,那情況相對(duì)簡(jiǎn)單,如果是國(guó)際化的app狞谱,則稍微復(fù)雜點(diǎn)乃摹。我們以前者為例,android使用高德地圖跟衅,采用的是火星坐標(biāo)系孵睬,iOS使用內(nèi)置地圖,同樣是高德地圖伶跷。

軌跡點(diǎn)上傳下載方案

其中掰读,使用到的WGS84轉(zhuǎn)為GCJ-02的代碼實(shí)現(xiàn)如下,網(wǎng)上可以很容易搜索到:

+(CLLocationCoordinate2D)transformFromWGSToGCJ:(CLLocationCoordinate2D)wgsLocation

{

CLLocationCoordinate2D adjustLoc;

if([selfisLocationOutOfChina:wgsLoc]){

adjustLoc = wgsLoc;

}else{

doubleadjustLat = [selftransformLatWithX:wgsLoc.longitude-105.0withY:wgsLoc.latitude-35.0];

doubleadjustLon = [selftransformLonWithX:wgsLoc.longitude-105.0withY:wgsLoc.latitude-35.0];

doubleradLat = wgsLoc.latitude/180.0* pi;

doublemagic = sin(radLat);

magic =1-ee*magic* magic;

doublesqrtMagic = sqrt(magic);

adjustLat = (adjustLat*180.0) / ((a* (1- ee)) / (magic* sqrtMagic) * pi);

adjustLon = (adjustLon*180.0) / (a /sqrtMagic* cos(radLat) * pi);

adjustLoc.latitude= wgsLoc.latitude+ adjustLat;

adjustLoc.longitude= wgsLoc.longitude+ adjustLon;

}

returnadjustLoc;

}

//判斷是不是在中國(guó)叭莫,如果app是國(guó)際版蹈集,可以用來(lái)判斷當(dāng)前定位是否在國(guó)內(nèi)

+(BOOL)isLocationOutOfChina:(CLLocationCoordinate2D)location

{

if(location.longitude<72.004|| location.longitude>137.8347|| location.latitude<0.8293|| location.latitude>55.8271)

returnYES;

returnNO;

}

+(double)transformLatWithX:(double)xwithY:(double)y

{

doublelat = -100.0+2.0* x +3.0* y +0.2*y* y +0.1*x* y +0.2* sqrt(abs(x));

lat += (20.0* sin(6.0*x* pi) +20.0*sin(2.0*x* pi)) *2.0/3.0;

lat += (20.0* sin(y* pi) +40.0* sin(y /3.0* pi)) *2.0/3.0;

lat += (160.0* sin(y /12.0* pi) +3320* sin(y* pi /30.0)) *2.0/3.0;

returnlat;

}

+(double)transformLonWithX:(double)xwithY:(double)y

{

doublelon =300.0+ x +2.0* y +0.1*x* x +0.1*x* y +0.1* sqrt(abs(x));

lon += (20.0* sin(6.0*x* pi) +20.0* sin(2.0*x* pi)) *2.0/3.0;

lon += (20.0* sin(x* pi) +40.0* sin(x /3.0* pi)) *2.0/3.0;

lon += (150.0* sin(x /12.0* pi) +300.0* sin(x /30.0* pi)) *2.0/3.0;

returnlon;

}

5.結(jié)語(yǔ)

? ? ? 通過(guò)以上的講解,想必大家對(duì)iOS定位功能的開(kāi)發(fā)已經(jīng)有了一定程度的理解食寡,多平臺(tái)的兼容性是我們開(kāi)發(fā)大型app的前提雾狈,方案一定要設(shè)計(jì)合理廓潜,提高容錯(cuò)能力抵皱,便于擴(kuò)充。在實(shí)際開(kāi)發(fā)中辩蛋,場(chǎng)景可能比這個(gè)更復(fù)雜呻畸,根據(jù)情況加以選擇,歡迎溝通交流悼院。

? ? ?如果您喜歡我們的文章伤为,點(diǎn)贊就好,您的認(rèn)可是我分享的最大動(dòng)力据途。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绞愚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颖医,更是在濱河造成了極大的恐慌位衩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熔萧,死亡現(xiàn)場(chǎng)離奇詭異糖驴,居然都是意外死亡僚祷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)贮缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辙谜,“玉大人,你說(shuō)我怎么就攤上這事感昼∽岸撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵定嗓,是天一觀(guān)的道長(zhǎng)烂琴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蜕乡,這世上最難降的妖魔是什么奸绷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮层玲,結(jié)果婚禮上号醉,老公的妹妹穿的比我還像新娘。我一直安慰自己辛块,他們只是感情好畔派,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著润绵,像睡著了一般线椰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尘盼,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天憨愉,我揣著相機(jī)與錄音,去河邊找鬼卿捎。 笑死配紫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的午阵。 我是一名探鬼主播躺孝,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼底桂!你這毒婦竟也來(lái)了植袍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤籽懦,失蹤者是張志新(化名)和其女友劉穎于个,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猫十,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡览濒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年呆盖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贷笛。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡应又,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乏苦,到底是詐尸還是另有隱情株扛,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布汇荐,位于F島的核電站洞就,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掀淘。R本人自食惡果不足惜旬蟋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望革娄。 院中可真熱鬧倾贰,春花似錦、人聲如沸拦惋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厕妖。三九已至首尼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間言秸,已是汗流浹背软能。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留井仰,地道東北人埋嵌。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像俱恶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子范舀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容