swift - 缩放 MapView 以显示 180 度经线的注释

标签 swift maps mkmapview mapkit coordinates

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

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

最佳答案

iOS 版 MapKit 实际上在 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))
    }
}

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

关于swift - 缩放 MapView 以显示 180 度经线的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40500679/

相关文章:

ios - 使用 Core Data 获取存储的数据

iOS swift : Hide and unhide Nav and tool bars

flutter - 如何在 flutter 中获取我们的实时位置?

ios - MapView 自定义 Pin 图问题

iphone - 在 iOS 5 中检测用户对 MKMapView 的触摸

ios - UITableView 单元格显示不正确的图像,即使将图像设置为 nil 作为 tableView.dequeueReusableCell 的第一步

python - 在 basemap 中绘制包裹路径

swift - iOS Cocoa Pods - 有没有办法只导入谷歌地理编码而不导入整个谷歌地图库?

ios - 将 MKOverlayPathRenderer 作为覆盖添加到 MKMapView 会出现异常

swift - 当主类的父类(super class)是 UICollectionViewCell 时,如何执行Segue或从单元格转到另一个 View