2016-11-09 3 views
0

私は<の注釈を持つMapViewを持っています。地図が読み込まれると、ズームしてthisのようにこれらの注釈の中心にマップします。ただし、リンクされたメソッドは、注釈が180度の子午線(経度が-180から+180まで折り返す部分)にまたがっている場合は機能しません。たとえそれらが本来の子午線の周りに集中していても、注釈を強くズームすることはできますか?例えばズームMapViewは、180度の子午線に注釈を表示します。

、IはX(0179)とy(0、-179)がある場合、私は2度の経度の幅を含む矩形をしたいと思い、IOSのためのない358

答えて

0

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

この方法は、完全ではありません。

関連する問題