2016-11-09 39 views
0

我有一個帶有< 5註解的MapView。加載地圖時,我想放大以在這些註釋上居中放置地圖,如this。但是,當註釋分佈在第180個子午線(經度從-180到+180)時,鏈接方法不起作用。即使它們聚集在主要子午線周圍,我如何可靠地放大註釋?縮放MapView以顯示第180個子午線的註釋

例如,如果我有X(0179)和y(0,-179),那麼我願意與兩個度經度的寬度,而不是358。

回答

0

MapKit含矩形爲iOS實際上具有在一個的MKMapView內置的功能,做到這一點:

showAnnotations(annotations: [MKAnnotation], animated: Bool) 

但是,此功能不會提供超過縮放級別的控制,所以我仍然不得不使自己的功能。這裏是僞代碼:

zoomToAnnotations(annotations, zoomLimit) { 
    // calculate the midpoint as the average latitude and longitude 
    average_latitude = mean(a.coordinate.latitude for a in annotations) 
    average_longitude = atan2(mean(sin(a.coordinate.longitude) for a in annotations), mean(cos(a.coordinate.longitude) for a in annotations)) // be careful with degrees and radians in real code 
    regular_midpoint = coordinate(average_latitude, average_longitude) 
    // subtract 180 from longitude for the midpoint of the region crossing the meridian 
    meridian_midpoint = coordinate(average_latitude, average_longitude - 180.0) 
    if (meridian_midpoint.longitude < -180) { 
     meridian_midpoint.longitude += 360.0 
    } 

    // work out which region will be smaller and center map there 
    meridian_sum = sum(a.coordinate.distance(meridian_midpoint) for a in annotations) 
    regular_sum = sum(a.coordinate.distance(regular_midpoint) for a in annotations) 
    regular_max_distance = max(a.coordinate.distance(regular_midpoint) for a in annotations) 
    if meridian_sum < regular_sum { 
     meridian_max_distance = max(a.coordinate.distance(meridian_midpoint) for a in annotations) 
     centerMapWithRadius(meridian_midpoint, max(zoomLimit, meridian_max_distance)) 
    } else { 
     regular_max_distance = max(a.coordinate.distance(regular_midpoint) for a in annotations) 
     centerMapWithRadius(regular_midpoint, max(zoomLimit, regular_max_distance)) 
    } 
} 

這種方法是不完美的,因爲它的點,而不是具有最遠點從邊緣的距離相等的均值中心。