2016-11-09 4 views
0

У меня есть MapView с < 5 аннотаций. Когда карта загружается, я хочу увеличить масштаб, чтобы сосредоточить карту на этих аннотациях, например this. Однако связанный метод не работает, когда аннотации распространяются на 180-й меридиан (где долгота обертывается от -180 до +180). Как я могу надежно масштабировать аннотации, даже если они группируются вокруг простого меридиана?Увеличить картуПосмотреть аннотации к 180-му меридиану

Например, если у меня есть х (0,179) и у (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)) 
    } 
} 

Этот метод не является совершенным, так как он сосредотачивается на среднем точек вместо наличия самых дальних точек, равную расстояния от края.