Подтвердить что ты не робот

Увеличить MKMapView для соответствия точкам полилинии

У меня есть массив allCollections, который содержит программно созданные массивы CLLocations, которые пользователь записал через мое приложение iOS. Каждая подматрица во всех клетках содержит все точки местоположения в выполненном отпуске.

Я вытаскиваю MKPolylines из CLLocations в массивах allCollections для представления этих отключений в MKMapView. Мой вопрос таков: с добавлением полилиний к карте, как бы я мог программно масштабировать и центрировать карту, чтобы отобразить их все?

4b9b3361

Ответ 1

-(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];
}

Ответ 2

-(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];
}

Ответ 3

Вы можете пропустить все CLLocations записи координат max/min и использовать их для установки вида rect, как это делается по этому вопросу iOS MKMapView zoom, чтобы показать все маркеры.

Или вы можете пройти через каждый из своих накладок и получить их boundingMapRect, затем использовать MKMapRectUnion (http://developer.apple.com/library/ios/documentation/MapKit/Reference/MapKitFunctionsReference/Reference/reference.html#//apple_ref/c/func/MKMapRectUnion), чтобы объединить их все, пока у вас не будет один MKMapRect, который будет охватывать все их и использовать для установки вида.

[mapView setVisibleMapRect:zoomRect animated:YES]

Этот вопрос показывает простой цикл, объединяющий макеты в объединениях, как я предположил: MKMapRect слишком сильно увеличивает масштаб

Ответ 4

в быстрой:

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

это будет масштабировать/панорамировать, чтобы соответствовать всем наложениям с небольшим буфером

Ответ 5

Swift 3 версия превосходного кода 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)
    }

Ответ 6

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

Ответ 7

@Fundtimer указал на правильный путь. Единственное, что Padding нужно отрегулировать в соответствии с визуальными потребностями, таким образом он будет поддерживать все остальные наложения, а последующее - общее решение для всех оверлеев.

-(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];
}

Ответ 8

У меня есть другое решение этой проблемы

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

Надеюсь, это кому-нибудь пригодится