iOS7上地球座標繫到火星座標系轉換演算法

來源:互聯網
上載者:User

標籤:style   blog   http   io   color   ar   os   使用   sp   


2013年01月31日 ? 綜合 ? 共 2595字 ? 字型大小 小 中 大 ? 評論關閉

今天在一個項目中需要用到地球座標繫到火星座標系的轉換,找了好幾種實現方法,但都無法在iOS6以上的系統中使用,最後找到了一個C#的轉換演算法,對照著寫了一個iOS版的,在這裡分享給大家。

地球座標和火星座標的具體含義可以見:http://blog.sina.com.cn/s/blog_7581a4c301015230.html

目前網上的方法主要有以下幾種:

1.在iOS4.3之前的系統上通過私人類MKLocationManager中的_applyChinaLocationShift來轉換地球座標到火星座標。這種方法有兩個問題,一個是調用了私人api,另一個是在iOS5之後的系統不能用了。

2.利用MKMapView中的isShowUserLocation進行定位,這種方法也有兩個問題,一個是必須要建立MKMapView才行,二是無法實現後台定位。

3.利用MapABC API中的GPSToOffSetByPoint:方法進行座標轉換,本人並沒有對這種方法進行嘗試,因為實現起來比較麻煩,還得申請API Key。

4.對地球座標系與火星座標系建立一一映射關係,並將這個關係存到資料庫中,通過資料庫進行轉換。這種方法的問題是資料庫體積較大,不適用於移動用戶端程式。

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

6.利用已有的演算法將地球座標系轉換到火星座標系

本人最後採用的是第六種方法,參考的C#演算法連結如下:https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936

轉換得到的OC代碼如下:

const double a = 6378245.0;const double ee = 0.00669342162296594323;+ (CLLocation *)transformToMars:(CLLocation *)location {    //是否在中國大陸之外    if ([[self class] outOfChina:location]) {        return location;    }    double dLat = [[self class] transformLatWithX:location.coordinate.longitude - 105.0 y:location.coordinate.latitude - 35.0];    double dLon = [[self class] transformLonWithX:location.coordinate.longitude - 105.0 y:location.coordinate.latitude - 35.0];    double radLat = location.coordinate.latitude / 180.0 * M_PI;    double magic = sin(radLat);    magic = 1 - ee * magic * magic;    double sqrtMagic = sqrt(magic);    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI);    dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * M_PI);    return [[CLLocation alloc] initWithLatitude:location.coordinate.latitude + dLat longitude:location.coordinate.longitude + dLon];}+ (BOOL)outOfChina:(CLLocation *)location {    if (location.coordinate.longitude < 72.004 || location.coordinate.longitude > 137.8347) {        return YES;    }    if (location.coordinate.latitude < 0.8293 || location.coordinate.latitude > 55.8271) {        return YES;    }    return NO;}+ (double)transformLatWithX:(double)x y:(double)y {    double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));    ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0;    ret += (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0;    ret += (160.0 * sin(y / 12.0 * M_PI) + 320 * sin(y * M_PI / 30.0)) * 2.0 / 3.0;    return ret;}+ (double)transformLonWithX:(double)x y:(double)y {    double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));    ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0;    ret += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0;    ret += (150.0 * sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0 * M_PI)) * 2.0 / 3.0;    return ret;}

將以上代碼放到任意一個類中,使用靜態方法transformToMars:對地球座標進行轉換即可。

以下為最後轉換的結果:

mapkit得到的座標:40.006498, 116.328022CLLocationManager得到的座標:40.005196, 116.321890演算法轉換出來的座標:40.006500, 116.328023

由以上結果可以看出該演算法的精度比較高,誤差在10米之內。

如果大家覺得對自己有協助的話,還希望能幫頂一下,謝謝:)

個人部落格:http://blog.csdn.net/zhaoxy2850

本文地址:http://blog.csdn.net/zhaoxy_thu/article/details/17033347

轉載請註明出處,謝謝!


iOS7上地球座標繫到火星座標系轉換演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.