web-dev-qa-db-ja.com

MKMapViewをズームしてポリラインポイントに合わせます

ユーザーがiOSアプリを介して記録したCLLocationsのプログラムで作成された配列を保持する配列allCollectionsがあります。 allCollectionsの各サブ配列は、移動したすべてのロケーションポイントを保持します。

AllCollectionsの配列のCLLocationsからMKPolylinesを描画して、MKMapViewでそれらのトリップを表します。私の質問はこれです:ポリラインがマップに追加された状態で、プログラムでマップをズームおよび中央揃えしてすべてを表示するにはどうすればよいですか?

30
user768339
-(void)zoomToPolyLine: (MKMapView*)map polyline: (MKPolyline*)polyline animated: (BOOL)animated
{
    [map setVisibleMapRect:[polyline boundingMapRect] edgePadding:UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0) animated:animated];
}
66
fundtimer
-(void)zoomToPolyLine: (MKMapView*)map polyLine: (MKPolyline*)polyLine 
animated (BOOL)animated
{
MKPolygon* polygon = 
    [MKPolygon polygonWithPoints:polyLine.points count:polyLine.pointCount];

[map setRegion:MKCoordinateRegionForMapRect([polygon boundingMapRect]) 
     animated:animated];
}
14
Tom

スウィフトで:

if let first = mapView.overlays.first {
    let rect = mapView.overlays.reduce(first.boundingMapRect, combine: {MKMapRectUnion($0, $1.boundingMapRect)})
    mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0), animated: true)
}

これは、小さなバッファですべてのオーバーレイに合わせてズーム/パンします

9
garafajon

max/min座標を記録するすべてのCLLocationsをループし、それを使用して、この質問の場合と同じようにビューrectを設定できます iOS MKMapViewズームですべてのマーカーを表示

または、各オーバーレイを調べてboundingMapRectを取得し、MKMapRectUnionhttp://developer.Apple.com/library/ios/documentation/)を使用することもできます。 MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#// Apple_ref/c/func/MKMapRectUnion )すべてをカバーする1つのMKMapRectができるまでそれらをすべて結合し、それを使用して設定します景色。

[mapView setVisibleMapRect:zoomRect animated:YES]

この質問は、私が提案したように、ユニオンでmaprectsを組み合わせた単純なループを示しています: MKMapRectがズームしすぎています

8
Craig

Swift garafajonの優れたコードのバージョン

    if let first = self.mapView.overlays.first {
        let rect = self.mapView.overlays.reduce(first.boundingMapRect, {MKMapRectUnion($0, $1.boundingMapRect)})
        self.mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets(top: 50.0, left: 50.0, bottom: 50.0, right: 50.0), animated: true)
    }
7
Burf2000

Swift 4 /ファンドタイマーの回答のわずかに変更されたバージョン。

 func setVisibleMapArea(polyline: MKPolyline, edgeInsets: UIEdgeInsets, animated: Bool = false) {
    mapView.setVisibleMapRect(polyline.boundingMapRect, edgePadding: edgeInsets, animated: animated)
}

ルートのポリラインを使用して上記を呼び出し、デフォルトをアニメーション化せずに、10の小さなエッジインセットをすべて追加します。

setVisibleMapArea(polyline: route.polyline, edgeInsets: UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0))
6
Jess

この問題には別の解決策があります

private func mapRegion() -> MKCoordinateRegion? {


    let latitudes = self.coordinates.map { location -> Double in

        return location.latitude
    }

    let longitudes = self.coordinates.map { location -> Double in

        return location.longitude
    }

    let maxLat = latitudes.max()!
    let minLat = latitudes.min()!
    let maxLong = longitudes.max()!
    let minLong = longitudes.min()!

    let center = CLLocationCoordinate2D(latitude: (minLat + maxLat) / 2,
                                        longitude: (minLong + maxLong) / 2)
    let span = MKCoordinateSpan(latitudeDelta: (maxLat - minLat) * 1.3,
                                longitudeDelta: (maxLong - minLong) * 1.3)
    return MKCoordinateRegion(center: center, span: span)
}

ここで、座標はCLLocationCoordinate2Dの配列です。

それが誰かに役立つことを願っています

1

@Fundtimerはそれを正しい方法で指摘しました。唯一のことは、視覚的なニーズに応じてパディングを調整する必要があるということです。そうすれば、他のすべてのオーバーレイをサポートし、以下はすべてのオーバーレイの一般的なソリューションです。

-(void)zoomIntoExistingMapObjectForAnnot:(CustomMapAnnotation *)annot
{
   id overlay = annot.shape;//I have overlay property in custom annotation class.
   [_mapView setVisibleMapRect:[overlay boundingMapRect] edgePadding:UIEdgeInsetsMake(150.0, 150.0, 150.0, 150.0) animated:YES];
}
0
iLearner