首页 > 解决方案 > 如何在 MKMapSnapshotter 上绘制 CLLocationCoordinate2Ds(在 mapView 打印图像上绘制)

问题描述

我有带有数组的 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...
        }
    }
}

如何在此图像上放置叠加层?或者也许还有其他方法可以解决这个问题。

标签: iosswiftmapkitmkmapsnapshotter

解决方案


不幸的是,您必须自己绘制它们。幸运的是,MKSnapshot有一种方便的point(for:)方法可以将快照内的a 转换CLLocationCoordinate2D为 a 。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
    }
}

然后是以下地图视图(坐标, as MKPolyline,由 渲染mapView(_:rendererFor:),像往常一样):

在此处输入图像描述

上面的代码将创建这个finalImage

在此处输入图像描述


推荐阅读