I just started programming in Swift and I am a complete beginner. I wanted to write a function or class that, by receiving the coordinates, if there is a photo in MKLookAround.request, saves a photo of the desired location using MKLookAround.Snapshotter, but I don't know how to use the mapkit ready classes. I don't want to use swiftUI, I just want to save pictures for a number of coordinates from different places. enter image description here

1

There are 1 best solutions below

6
On BEST ANSWER

You can create a MKLookAroundSceneRequest, grab its scene, and then supply that to MKLookAroundSnapshotter.

func snapshotImage(for coordinate: CLLocationCoordinate2D) async throws -> UIImage {
    guard let scene = try await MKLookAroundSceneRequest(coordinate: coordinate).scene else {
        throw LookaroundError.unableToCreateScene
    }
    let options = MKLookAroundSnapshotter.Options()
    options.size = CGSize(width: 1000, height: 500)
    return try await MKLookAroundSnapshotter(scene: scene, options: options).snapshot.image
}

enter image description here

That uses this Error object:

enum LookaroundError: Error {
    case unableToCreateScene
}

For more information, see WWDC 2022 What’s new in MapKit or check out the use of MKLookAroundSnapshotter in their sample project.


And if you want to write that to a file get either the PNG (pngData) or JPG (jpgData) representation and write it to a file:

let image = try await snapshotImage(for: coordinate)
let url = try FileManager.default
    .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    .appending(component: "test.png")
try image.pngData()?.write(to: url)

Or alternatively, you might want to present a user a UI whereby they can specify what they want to do with the image, via UIActivityViewController:

let share = UIActivityViewController(activityItems: [image], applicationActivities: nil)
self.present(share, animated: true)