2012-02-21 84 views
2

在基於位置的應用程序中,我們使用MKMapPoints存儲位置,例如當前用戶位置。瞭解MKCoordinateFromMapPoint行爲

當我們試圖對的MKMapView使用此位置,以設置初始顯示的區域(在用戶放大),我們將它轉​​換爲一個CLLocationCoordinate2D

有一個convernience方法爲:namenly:MKCoordinateForMapPoint,但在測試過程中會產生奇怪的結果。

MKMapPoint mapPoint = MKMapPointMake(51.96, 6.3); // My area ;) 
    CLLocationCoordinate2D automagicCoordinate = MKCoordinateForMapPoint(mapPoint); 
    CLLocationCoordinate2D manualCoordinate = CLLocationCoordinate2DMake(mapPoint.x, mapPoint.y); 

我期望automagicCoordinate和manualCoordinate都完全一樣。 但是當我檢查它在調試器中我得到以下結果:

automagicCoordinate.latitude = (CLLocationDegrees) 85.05 
automagicCoordinate.longitude = (CLLocationDegrees) -179.99 

manualCoordinate.latitude = (CLLocationDegrees) 51.96 
manualCoordinate.longitude = (CLLocationDegrees) 6.3 

如何來與方法創建的座標是不正確的?

回答

7

一個MKMapPoint不是一個經度和緯度。如果是這樣,你不需要一個函數來將它「轉換」爲座標。

作爲位置感知編程指南解釋了Understanding Map Geometry部分:

的地圖點在所述墨卡托地圖投影的x和y值。地圖點用於許多地圖相關的計算而不是地圖座標,因爲它們簡化了計算中涉及的數學。

documentation for MKMapPoint是清晰的:

如果你的項目在全球的彎曲表面在一個平面上, 你得到的是一個地圖的二維版本,其中經度 線出現平行。 ...

地圖點的實際單位被綁定到使用的基礎單位 來繪製MKMapView的內容,但您不應該直接需要 擔心這些單位。 ...

將地圖相關數據保存到文件時,應始終保存 座標值(緯度和經度),而不是地圖點。

地圖點51.96, 6.3對應於地圖投影左上角的座標。如果要使用座標(經度,緯度),請使用CLLocationCoordinate2D以避免混淆。

(技術上可以使用MKMapPoint結構來存儲您的座標值,但當時他們並不需要被轉換成座標和錯誤類型的使用只會導致混亂。)