缩放MapView以显示第180个子午线的注释

时间:2016-11-09 05:39:46

标签: swift maps mkmapview mapkit coordinates

我有一个带有< 5注释的MapView。加载地图时,我想放大这些注释的地图中心,例如this。但是,当注释分布在第180个子午线(经度从-180到-180)时,链接的方法不起作用。即使它们聚集在本初子午线周围,我如何才能稳健地缩放注释?

例如,如果我有x(0,179)和y(0,-179),那么我想要一个宽度为2度经度的包含矩形,而不是358。

1 个答案:

答案 0 :(得分:0)

MapKit for 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))
    }
}

这种方法并不完美,因为它以点的平均值为中心,而不是使最远点与边缘的距离相等。