Как нарисовать CLLocationCoordinate2Ds на MKMapSnapshotter (рисование на mapView печатное изображение) - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть mapView с массивом CLLocationCoordinate2D.Я использую эти местоположения, чтобы рисовать линии на моем mapView, используя MKPolyline.Теперь я хочу сохранить его как UIimage.Я обнаружил, что есть класс MKMapSnapshotter, но, к сожалению, я не могу рисовать наложения на нем: «Объекты Snapshotter не захватывают визуальные представления каких-либо наложений или аннотаций, создаваемых вашим приложением».Так что я получаю только пустое изображение карты.Есть ли способ получить изображение с моими оверлеями?

private func generateImageFromMap() {
    let mapSnapshotterOptions = MKMapSnapshotter.Options()
    guard let region = mapRegion() else { return }
    mapSnapshotterOptions.region = region
    mapSnapshotterOptions.size = CGSize(width: 200, height: 200)
    mapSnapshotterOptions.showsBuildings = false
    mapSnapshotterOptions.showsPointsOfInterest = false


    let snapShotter = MKMapSnapshotter(options: mapSnapshotterOptions)
    snapShotter.start() { snapshot, error in
        guard let snapshot = snapshot else {
//do something with image .... 
            let mapImage = snapshot...
        }
    }
}

Как мне наложить на это изображение?Или, может быть, есть и другой способ решения этой проблемы.

1 Ответ

0 голосов
/ 14 февраля 2019

К сожалению, вы должны нарисовать их самостоятельно.К счастью, MKSnapshot имеет удобный point(for:) метод для преобразования CLLocationCoordinate2D в CGPoint в снимке.

Например, предположим, что у вас есть массив CLLocationCoordinate2D:

private var coordinates: [CLLocationCoordinate2D]?

private func generateImageFromMap() {
    guard let region = mapRegion() else { return }

    let options = MKMapSnapshotter.Options()
    options.region = region
    options.size = CGSize(width: 200, height: 200)
    options.showsBuildings = false
    options.showsPointsOfInterest = false

    MKMapSnapshotter(options: options).start() { snapshot, error in
        guard let snapshot = snapshot else { return }

        let mapImage = snapshot.image

        let finalImage = UIGraphicsImageRenderer(size: mapImage.size).image { _ in

            // draw the map image

            mapImage.draw(at: .zero)

            // only bother with the following if we have a path with two or more coordinates

            guard let coordinates = self.coordinates, coordinates.count > 1 else { return }

            // convert the `[CLLocationCoordinate2D]` into a `[CGPoint]`

            let points = coordinates.map { coordinate in
                snapshot.point(for: coordinate)
            }

            // build a bezier path using that `[CGPoint]`

            let path = UIBezierPath()
            path.move(to: points[0])

            for point in points.dropFirst() {
                path.addLine(to: point)
            }

            // stroke it

            path.lineWidth = 1
            UIColor.blue.setStroke()
            path.stroke()
        }

        // do something with finalImage
    }
}

Затем следующий вид карты (с координатами, такими как MKPolyline, визуализируется mapView(_:rendererFor:), как обычно):

enter image description here

Приведенный выше код создаст это finalImage:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...