小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Objective 地球坐標(biāo)到火星坐標(biāo)系轉(zhuǎn)換

 南山岳麓書院 2015-05-22

今天在一個項目中需要用到地球坐標(biāo)系到火星坐標(biāo)系的轉(zhuǎn)換,找了好幾種實現(xiàn)方法,但都無法在iOS6以上的系統(tǒng)中使用,最后找到了一個C#的轉(zhuǎn)換算法,對照著寫了一個iOS版的,在這里分享給大家。

地球坐標(biāo)和火星坐標(biāo)的具體含義可以見:http://blog.sina.com.cn/s/blog_7581a4c301015230.html

目前網(wǎng)上的方法主要有以下幾種:

1.在iOS4.3之前的系統(tǒng)上通過私有類MKLocationManager中的_applyChinaLocationShift來轉(zhuǎn)換地球坐標(biāo)到火星坐標(biāo)。這種方法有兩個問題,一個是調(diào)用了私有api,另一個是在iOS5之后的系統(tǒng)不能用了。

2.利用MKMapView中的isShowUserLocation進行定位,這種方法也有兩個問題,一個是必須要創(chuàng)建MKMapView才行,二是無法實現(xiàn)后臺定位。

3.利用MapABC API中的GPSToOffSetByPoint:方法進行坐標(biāo)轉(zhuǎn)換,本人并沒有對這種方法進行嘗試,因為實現(xiàn)起來比較麻煩,還得申請API Key。

4.對地球坐標(biāo)系與火星坐標(biāo)系建立一一映射關(guān)系,并將這個關(guān)系存到數(shù)據(jù)庫中,通過數(shù)據(jù)庫進行轉(zhuǎn)換。這種方法的問題是數(shù)據(jù)庫體積較大,不適用于移動客戶端程序。

5.利用高德、百度地圖提供的在線api進行轉(zhuǎn)換,這種方法的問題是不能離線進行轉(zhuǎn)換,實用性不強。

6.利用已有的算法將地球坐標(biāo)系轉(zhuǎn)換到火星坐標(biāo)系

本人最后采用的是第六種方法,參考的C#算法鏈接如下:https://on4wp7./SourceControl/changeset/view/21483#353936

轉(zhuǎn)換得到的OC代碼如下:

  1. const double a = 6378245.0;  
  2. const double ee = 0.00669342162296594323;  
  3.   
  4. + (CLLocation *)transformToMars:(CLLocation *)location {  
  5.     //是否在中國大陸之外  
  6.     if ([[self class] outOfChina:location]) {  
  7.         return location;  
  8.     }  
  9.     double dLat = [[self class] transformLatWithX:location.coordinate.longitude - 105.0 y:location.coordinate.latitude - 35.0];  
  10.     double dLon = [[self class] transformLonWithX:location.coordinate.longitude - 105.0 y:location.coordinate.latitude - 35.0];  
  11.     double radLat = location.coordinate.latitude / 180.0 * M_PI;  
  12.     double magic = sin(radLat);  
  13.     magic = 1 - ee * magic * magic;  
  14.     double sqrtMagic = sqrt(magic);  
  15.     dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI);  
  16.     dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * M_PI);  
  17.     return [[CLLocation alloc] initWithLatitude:location.coordinate.latitude + dLat longitude:location.coordinate.longitude + dLon];  
  18. }  
  19.   
  20. + (BOOL)outOfChina:(CLLocation *)location {  
  21.     if (location.coordinate.longitude < 72.004 || location.coordinate.longitude > 137.8347) {  
  22.         return YES;  
  23.     }  
  24.     if (location.coordinate.latitude < 0.8293 || location.coordinate.latitude > 55.8271) {  
  25.         return YES;  
  26.     }  
  27.     return NO;  
  28. }  
  29.   
  30. + (double)transformLatWithX:(double)x y:(double)y {  
  31.     double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));  
  32.     ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0;  
  33.     ret += (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0;  
  34.     ret += (160.0 * sin(y / 12.0 * M_PI) + 320.0 * sin(y * M_PI / 30.0)) * 2.0 / 3.0;  
  35.     return ret;  
  36. }  
  37.   
  38. + (double)transformLonWithX:(double)x y:(double)y {  
  39.     double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));  
  40.     ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0;  
  41.     ret += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0;  
  42.     ret += (150.0 * sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0 * M_PI)) * 2.0 / 3.0;  
  43.     return ret;  
  44. }  

將以上代碼放到任意一個類中,使用靜態(tài)方法transformToMars:對地球坐標(biāo)進行轉(zhuǎn)換即可。

以下為最后轉(zhuǎn)換的結(jié)果:

  1. mapkit得到的坐標(biāo):40.006498, 116.328022  
  2. CLLocationManager得到的坐標(biāo):40.005196, 116.321890  
  3. 算法轉(zhuǎn)換出來的坐標(biāo):40.006500, 116.328023  

由以上結(jié)果可以看出該算法的精度比較高,誤差在10米之內(nèi)。


如果大家覺得對自己有幫助的話,還希望能幫頂一下,謝謝:)
轉(zhuǎn)載請注明出處,謝謝!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多