2010-07-06 56 views
5

我需要知道從中心地圖到屏幕另一側的距離(以公里爲單位)(並且如果縮放更改距離將會改變)。使用mapkit計算以米爲單位的半徑

我需要這個功能

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{ 
} 

任何想法如何,我可以做到這一點來實現此功能?

由於

回答

17

的MKMapView具有名爲centerCoordinate(CLLocationCoordinate2D)屬性和區域(MKCoordinateRegion)。區域是一個結構是:

typedef struct { 
    CLLocationDegrees latitudeDelta; 
    CLLocationDegrees longitudeDelta; 
}MKCoordinateSpan 

您應該能夠創造另一個角度來看,基於centerCoordinate,讓我們說,加入latitudeDelta你北緯財產或centerCoordinate,並使用CLLocation的方法計算距離:

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location 

像這樣的事情

MkMapView * mapView; // init somewhere 
MKCoordinateRegion region = mapView.region; 
CLLocationCoordinate2D centerCoordinate = mapView.centerCoordinate; 
CLLocation * newLocation = [[[CLLocation alloc] initWithLatitude:centerCoordinate.latitude+region.span.latitudeDelta longitude:centerCoordinate.longitude] autorelease]; 
CLLocation * centerLocation = [[[CLLocation alloc] initWithLatitude:centerCoordinate.latitude:longitude:centerCoordinate.longitude] autorelease]; 
CLLocationDistance distance = [centerLocation distanceFromLocation:newLocation]; // in meters 

而剛剛計算出每一個代表觸發一定的方法(決定你需要時間:MKMapViewDelegate )

+0

這是一個偉大的答案。 – sudo 2014-03-19 22:03:18

+0

很棒的答案!非常感謝! – Andres 2014-04-25 00:23:34

+3

'centerCoordinate.latitude + region.span.latitudeDelta'必須是'centerCoordinate.latitude + region.span.latitudeDelta/2'才能得到正確的半徑。 – 2014-09-12 12:37:45

0

由於矩形不是圓形,因此無法獲得半徑。

但是你仍然可以從一個地區的中心獲得最遠的距離。 重複使用與上述相同的想法,但嵌入在一個快速擴展中。

extension MKCoordinateRegion { 
    func distanceMax() -> CLLocationDistance { 
     let furthest = CLLocation(latitude: center.latitude + (span.latitudeDelta/2), 
          longitude: center.longitude + (span.longitudeDelta/2)) 
     let centerLoc = CLLocation(latitude: center.latitude, longitude: center.longitude) 
     return centerLoc.distanceFromLocation(furthest) 
    } 
} 

使用

let radius = mapView.region.distanceMax()