yandex / mapkit-ios-demo

MapKit iOS demo
Other
84 stars 26 forks source link

Смещение карты к определенному пользователем региону #7

Closed remenkoff closed 4 years ago

remenkoff commented 6 years ago

Здравствуйте!

Никак не найду аналог метода setRegion (было в 1й версии API). Получается, что смещать карту можно только с помощью метода move экземпляра YMKMap с двумя перегрузками: move(_ with: YMKCameraPosition) и move(_ with: YMKCameraPosition, animationType: YMKAnimation, cameraCallback: YMKMapCameraCallback?); однако YMKCameraPosition оперирует только координатой (будущий центр карты) и масштабом, но не областью с конкретным центром и конкретным размером.

Свойство visibleRegion только для чтения. В лучшем случае мне может помочь метод visibleRegion(_ with: YMKCameraPosition), и то в извращениях, типа проверки вхождения моего региона (прямоугольника) в видимый прямоугольник для определенно настроенной камеры в цикле, который, отталкиваясь от центра региона, будет отдалять камеру... 🙈 Было бы здорово получать и, наоборот, - YMKCameraPosition из YMKVisibleRegion, чтобы потом передать его в метод move.

Или все же есть решение моей проблемы из коробки?

Спасибо!

p.s.: сейчас использую следующее решение:

            let zoomStep: Float = 0.5
            let zoomLimit = mapView.mapWindow.map!.getMinZoom() + 4.0
            var nextZoom = mapView.mapWindow.map!.getMaxZoom() - 4.0
            var nextCameraPosition: YMKCameraPosition!
            var isAllPlacemarksVisible = false

            repeat {
                nextCameraPosition = YMKCameraPosition(target: centerPoint, zoom: nextZoom, azimuth: 0.0, tilt: 0.0)
                isAllPlacemarksVisible = mapView.mapWindow.map!.visibleRegion(with: nextCameraPosition).contains(regionToMove)
                nextZoom -= zoomStep
            } while !isAllPlacemarksVisible && nextZoom > zoomLimit

            mapView.mapWindow.map!.move(with: nextCameraPosition)

Ну, и extension, разумеется:

    /// Checks if the current region is contains the provided one.
    ///
    /// - Parameters:
    ///   - region: Region to check.
    ///
    /// - Returns: Whether the provided region is located inside the current.
    public func contains(_ region: YMKVisibleRegion) -> Bool {
        return self.asCGRect().contains(region.asCGRect())
    }

    /// Converts current region (NSObject) to CGRect structure.
    ///
    /// - Returns: Converted CGRect struct.
    public func asCGRect() -> CGRect {
        return CGRect(
            x: self.topLeft.longitude,
            y: self.topLeft.latitude,
            width: self.topRight.longitude - self.topLeft.longitude,
            height: self.bottomLeft.latitude - self.topLeft.latitude
        )
    }

...но учитывая, что я четко знаю к какой области и с каким масштабом нужно сдвинуть карту, все эти костыли кажутся нелепыми, как минимум)))

eberkovich commented 5 years ago

Здравствуйте,

Предполагалось, что для этого будет использоваться: YMKMap::cameraPositionWithBoundingBox, результат которого будет передан в YMKMap::cameraPosition.

yadik64 commented 1 year ago

Вот мое решение

func moveToCenterOfObjects(map: YMKMap, objects: [YMKPoint]) {
        let poligone = YMKPolygon(outerRing: YMKLinearRing(points: objects),
                                  innerRings: [])
        var cameraPosition = map.cameraPosition(with: YMKGeometry(polygon: poligone),
                                                azimuth: 0,
                                                tilt: 0,
                                                focus: nil)
        cameraPosition = YMKCameraPosition(target: cameraPosition.target,
                                           zoom: cameraPosition.zoom - 0.5,
                                           azimuth: cameraPosition.azimuth,
                                           tilt: cameraPosition.tilt)
        map.move(with: cameraPosition)
    }
nsleader commented 1 year ago

Вот мое решение

        var cameraPosition = map.cameraPosition(with: YMKGeometry(polygon: poligone),

такой функции нет

yadik64 commented 1 year ago

Вот мое решение

        var cameraPosition = map.cameraPosition(with: YMKGeometry(polygon: poligone),

такой функции нет

Очень жаль что у вас ее нет, однако, в документации она присутствует и в моем проекте отрабатывает отлично. https://yandex.ru/dev/mapkit/doc/ru/Swift/YMKMap#camerapositionwithazimuthtiltfocus

nsleader commented 1 year ago

Очень жаль что у вас ее нет, однако, в документации она присутствует и в моем проекте отрабатывает отлично. https://yandex.ru/dev/mapkit/doc/ru/Swift/YMKMap#camerapositionwithazimuthtiltfocus

Спасибо, оказывается не обновился.