1. 程式人生 > >校正IOS的GPS座標方法

校正IOS的GPS座標方法

ios系統庫中有兩種定位方式:

1.CLLocationManager

  這種方式得到的座標是有偏移的。

2.MKMapView

  這種方式得到的座標是經過偏移的。

   最近才知道,上面這兩種方式為什麼一個是準的,一個是不準的。原來中國為了保護地理資訊保安,都有規定各個GIS廠商在繪製地圖的時候進行曲線偏移,而且這個演算法還幾年一換。。。具體說明請看上面引用網址。
  CLLocationManager獲得的座標是WGS84座標系
  MKMapView獲得的使用者點是火星座標系

偏移校正方法:
1. 使用IOS的私有類MKLocationManager來計算,這種方法只在 IOS5 以前的系統上可以使用

  這個做法是有風險的,蘋果不允許私有模組被直接呼叫。換句話說,你的軟體可能會被Deny。

  因為是私有模組,我們需要宣告這個類和我們要用到的函式,程式碼如下(需引入framework:MapKit、CoreLocation):

@interface MKLocationManager     
    + (id)sharedLocationManager;       // 建立並獲取MKLocationManager例項  
    - (BOOL)chinaShiftEnabled;        // 判斷IOS系統是否支援計算偏移  
    - (CLLocation*)_applyChinaLocationShift:(CLLocation*)arg;   // 傳入原始位置,計算偏移後的位置  
@end  
在CLLocationManager的位置監聽函式中,我們把newLocation(原始位置),轉換為中國位置
-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  
{  
    if ([[MKLocationManager sharedLocationManager] chinaShiftEnabled]) {  
        newLocation = [[MKLocationManager sharedLocationManager] _applyChinaLocationShift:newLocation];  
        if (newLocation == nil) {  // 很重要,計算location好像是要聯網的,軟體剛啟動時前幾次計算會返回nil。  
            return;  
        }  
    }  
    ...  
}  
這樣,經轉換後的newLocation,已經是中國的位置了。現在在對映到MKMapView上時,會顯示正確的所在位置。

2.使用高德介面做座標偏移校正(高德和MAPABC是一家)

(可刪除"Release-iphonesimulator/libMASearchKit.a"檔案,在模擬器上執行時總是出BUG )

   2、需要在TARGETS -> Summary -> Linked Frameworks and Libraries 中新增如下系統庫:
     QuartzCore,CoreText,CoreLocation,SystemConfiguration,libz,libstdc++6.0.9, libxml2.2, CoreTelephony

   3、在TARGETS -> Build -> Settings -> Other Linker Flags 中新增如下內容: -ObjC,-lMASearchKit (也就是去掉庫檔名前後的lib和.a,並在前面加上-l引數)

首先引入#import "MAMapKit.h", 一般是viewController遵循MASearchDelegate協議
然後在合適的地方使用下面的程式碼:

    //用高德地圖api校正獲取的gps 資料
    MARGCSearchOption* searchOption = [[MARGCSearchOption alloc]init];//初始化SearchOption
    searchOption.config = @"RGC"; //這個是預設的,函式宣告的標頭檔案有註釋
    searchOption.coors = [NSString stringWithFormat:@"%f,%f;",longitude,latitude];//這個可以同時查幾組經緯度值,中間用分號隔開,引數location 是用CLLocationManager獲取的經緯度值
    
    NSString *[email protected]"7c9bca72cfb64b33e868feaa57f9b9c2" ;
    MASearch *search=[[MASearch alloc]initWithSearchKey:Apikey Delegate:self];
    search.delegate=self;//設定代理
    [search gpsOffsetSearchWithOption:searchOption]; //傳入searchoption開始查詢校正後的經緯度
程式執行完 gpsOffsetSearchWithOption:searchOption方法後會呼叫一個MAsearchDelegate的代理方法,並且把呼叫結果返回來,所以你可以在這個代理方法裡執行你的處理邏輯
-(void) gpsOffsetSearch:(MARGCSearchOption *)gpsOffSearchOption Result:(MARGCSearchResult *)result
{
    MARGCItem* rgcInfo = [result.rgcItemArray objectAtIndex:0];  //返回的結果result是一個array來的,因為可以同時查詢很多組經緯度值,不過我上面程式碼我只寫了一組,所以只取第一個object就行了     
    currentLocation.longitude = [rgcInfo.x floatValue];        //取出經度值
    currentLocation.latitude = [rgcInfo.y floatValue];  //取出緯度值
 }

高德api地址: http://code.autonavi.com/

MAPABC地址:http://code.mapabc.com/

相關推薦

校正IOS的GPS座標方法

ios系統庫中有兩種定位方式: 1.CLLocationManager   這種方式得到的座標是有偏移的。 2.MKMapView   這種方式得到的座標是經過偏移的。    最近才知道,上面這兩種方式為什麼一個是準的,一個是不準的。原來中國為了保護地理資訊保安,都有規

百度墨卡託座標轉百度經緯度座標方法實現【C#版本】

轉載,原文地址:https://www.cnblogs.com/niudieyi/p/8706951.html 該方法參考了 https://blog.csdn.net/qq_16664325/article/details/67639684 這篇文章中主要是Java版本的,我把它

Android的座標系及獲取View的座標方法

android中有兩種座標系,分別稱之為Android座標系和檢視座標系。 我們經常在自定義View,在測量和繪製時會用到這些,只有我們弄清楚它們才能保證不出錯。下面我們來談談它們的定義及區別吧。 一、Android座標系和檢視座標系 (1)And

iOS 獲取圓環終點位置的座標方法 (UIBezierPath 終點位置)

目標是下圖的情況: 畫一個圓弧,在圓弧結束位置放置一個紅色圓點 這需要先假想一個座標系效果如下 由於貝塞爾曲線是順時針方向繪製的,所以可以順時針想像成四個象限 獲取位置方法步驟: 1、確定所在的角度是多少 2、確定象限 3、後通正弦餘弦函式來確定x、y值 4、最終得出在

JQuery 獲得絕對,相對位置的座標方法

獲取頁面某一元素的絕對X,Y座標,可以用offset()方法:(body屬性設定margin :0;padding:0;) var X = $('#DivID').offset().top; var Y = $('#DivID').offset().left; 獲取相對

已知任意平面方程,推導座標旋轉變換的結論與方法(進階篇),願願原創。

作為本部落格《已知任意平面方程,推導座標旋轉變換的結論與方法,願願原創。》(連結:https://blog.csdn.net/tom_xuzg/article/details/83034006)的姊妹篇,本文將繼續探討,座標旋轉變換,不同之處,上一篇用了三次旋轉變換,這一篇要用兩次旋轉變換。上一篇結

unity3d中使用不同方法獲得position對應的座標系統

inspector面板 通過inspector面板上獲得的transform屬性均屬於本地座標系。 注意:inspector面板上的rotation是尤拉角。 使用程式碼得到 使用transform.position系列方法得到的座標屬於世界座標系。 注意:transform

ENVI FLAASH大氣校正常見錯誤及解決方法(轉載)

ENVI FLAASH大氣校正常見錯誤及解決方法(轉載) 本文彙總了ENVI FLAASH大氣校正模組中常見的錯誤,並給出解決方法,分為兩部分:執行錯誤和結果錯誤。前面是錯誤提示及說明,後面是錯誤解釋及解決方法。 FLAASH對輸入資料型別有以下幾個要

已知任意平面方程,推導座標旋轉變換的結論與方法(終極篇),願願原創。

本文將繼續探討,座標旋轉變換,不同之處,上兩篇各用三次,兩次旋轉變換,這一篇要用一次旋轉變換。 如下圖: 如圖,還是任意的平面方程,o2-xy面,在該平面上,如棕色和草綠色箭頭所示,我們的目標是,經過一次選擇,達到我們的o2-x‘’y‘’z‘’與o2-xyz重合的目的(也就是,棕色軸與

ArcGIS和COORD軟體進行座標七引數轉換的方法

一、資料引數注意事項 1.我們使用的測繪資料,例如: X  2835697.754   X為緯度  (7位數) Y  613544.641   Y為經度  (6位數) 如果是: X  2835697.754 &

Python視覺化中Matplotlib(4.三種設定樣式方法、設定座標刻度以及標籤、設定顯示出特殊字元)

1.三種設定方式   (1)向方法傳入關鍵字引數 上一節已經總結過,一直在使用   (2)對例項使用一系列的setter方法           具體的方法直接看程式碼  import matplotli

SLAM中“camera類中座標轉換"方法解讀

/* p_p : position_pexil ; p_c:position_camera ; p_w : position_world ; T_c_w : 歐式矩陣(包含R,t資訊) from camera to world cpp功能:實現關於pexil,camera,worl

獲取滑鼠座標的的方法(相容性)

在一些DOM操作中我們經常會跟元素的位置打交道,滑鼠互動式一個經常用到的方面,令人失望的是不同的瀏覽器下會有不同的結果甚至是有的瀏覽器下沒結果,這篇文章就上滑鼠點選位置座標獲取做一些簡單的總結,沒特殊宣告程式碼在IE8,FireFox,Chrome下進行測試相容 滑

計算機圖形學-----齊次座標、空間變換矩陣和通用的建模方法

齊次座標系 齊次座標系是為了區分空間點和向量的。三維空間中, ( x ,

處理echarts地圖省份座標重疊的方法

//修改地圖省份重疊問題 var chinaEchartsObj = echarts.getMap('china'); var geoJSONChina = chinaEchartsObj.geoJson; var allDefProvince = geoJSONChina.

SLAM中“camera類中座標轉換"方法解讀

/* p_p : position_pexil ; p_c:position_camera ; p_w : position_world ; T_c_w : 歐式矩陣(包含R,t資訊) from camera to world cpp功能:實現關於pe

多重檢驗中的FDR錯誤控制方法與p-value的校正及Bonferroni

    資料分析中常碰見多重檢驗問題 (multiple testing).Benjamini於1995年提出一種方法,通過控制FDR(False Discovery Rate)來決定P值的域值. 假設你挑選了R個差異表達的基因,其中有S個是真正有差異表達的,另外有V個其實是

Cocos2d中獲取錨點所在座標方法

在平常拼UI的時候,我們經常會想獲取一個Node所在的位置,但是寫起來有時候會很繁瑣。比如我們先建立了一個精靈,如下: local sp = cc.Sprite:create("XXX.png") sp:setAnchorPoint(0,0.5) s

關於 QGraphicsScene場景中觸發事件使用event->pos()獲取座標為0 的解決方法

需求         場景類對元素(QGraphicsItem)操作,如平移縮放等等,需要獲取當前滑鼠座標。   入坑         如下圖,獲取座標一直為0    

Android 根據座標獲取控制元件方法

/** * 根據座標獲取相對應的子控制元件<br> * 在Activity使用 * * @param x座標 * @param y座標 * @return 目標V