0
我有一个带有< 5注解的MapView。加载地图时,我想放大以在这些注释上居中放置地图,如this。但是,当注释分布在第180个子午线(经度从-180到+180)时,链接方法不起作用。即使它们聚集在主要子午线周围,我如何可靠地放大注释?缩放MapView以显示第180个子午线的注释
例如,如果我有X(0179)和y(0,-179),那么我愿意与两个度经度的宽度,而不是358。
我有一个带有< 5注解的MapView。加载地图时,我想放大以在这些注释上居中放置地图,如this。但是,当注释分布在第180个子午线(经度从-180到+180)时,链接方法不起作用。即使它们聚集在主要子午线周围,我如何可靠地放大注释?缩放MapView以显示第180个子午线的注释
例如,如果我有X(0179)和y(0,-179),那么我愿意与两个度经度的宽度,而不是358。
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))
}
}
这种方法是不完美的,因为它的点,而不是具有最远点从边缘的距离相等的均值中心。