Я скажу следующее с обычным - я ни в коем случае не разработчик.
Я работаю над небольшим проектом, где я взял существующий файл kml для локаций в Нью-Йорке C. Я преобразовал его в geo json, а затем использовал этот учебник для составления карты этих мест
https://www.raywenderlich.com/7738344-mapkit-tutorial-getting-started#toc -anchor-012
Все хорошо уже. У меня есть geo json, отображающий стандартные маркеры по всей карте, и аннотации направлены к соответствующим заголовкам и т. Д. c.
Теперь я буду sh, чтобы идти дальше, и у меня есть некоторые проблемы и я не уверен на подходе, чтобы взять.
Geo json У меня есть следующий формат для каждой записи:
{"features": [{ "type": "Feature", "properties":{ "Name": "Battery Park 1","gx_media_links": "https://imgur.com/wgcqauR.jpg" },"geometry": { "type": "Point", "coordinates": [ -74.015086, 40.703464 ] } }
Все это прекрасно работает, передавая через как строки. Однако я бы хотел, чтобы в аннотациях были изображения, перечисленные в gx_media_links. т.е. вы нажимаете на маркер, и появляется всплывающая аннотация с jpg, поставляемым в json, вместе с «Name»
Прямо сейчас, если я пройду через gx_media_links в аннотацию, я, очевидно, получу строку url.
Я пытался протолкнуть его как UIImage вместо строки, но, похоже, это не очень помогает ... и я столкнулся с множеством проблем, просто заставить его собрать.
Я понимаю, что мне может понадобиться нажать на URL изображения, загрузить изображение и затем передать его в одно из значений. Если у кого-нибудь есть хорошие уроки, которыми я мог бы следовать, пожалуйста, дайте мне знать. Заранее спасибо!
Я полный нуб к этому, поэтому нужно подробно объяснить, где это возможно, например, где разместить указанный код и т. Д. c! Вот два основных файла, которые я использую.
Заранее спасибо!
Artwork.swift
import Foundation
import MapKit
class Artwork: NSObject, MKAnnotation {
let title: String?
let coordinate: CLLocationCoordinate2D
init(
title: String?,
coordinate: CLLocationCoordinate2D
) {
self.title = title
self.coordinate = coordinate
super.init()
}
@available(iOS 13.0, *)
init?(feature: MKGeoJSONFeature) {
// 1
guard
let point = feature.geometry.first as? MKPointAnnotation,
let propertiesData = feature.properties,
let json = try? JSONSerialization.jsonObject(with: propertiesData),
let properties = json as? [String: Any]
else {
return nil
}
// 3
title = properties["Name"] as? String
coordinate = point.coordinate
super.init()
}
}
А вот и контроллер вида.
import UIKit
import MapKit
private var artworks: [Artwork] = []
@available(iOS 13.0, *)
class ViewController: UIViewController {
@IBOutlet private var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// Set initial location in NYC
let initialLocation = CLLocation(latitude: 40.7180, longitude: -73.9887)
mapView.centerToLocation(initialLocation)
mapView.delegate = self
loadInitialData()
mapView.addAnnotations(artworks)
let nycCenter = CLLocation(latitude: 40.7180, longitude: -73.9887)
let region = MKCoordinateRegion(
center: nycCenter.coordinate,
latitudinalMeters: 50000,
longitudinalMeters: 60000)
mapView.setCameraBoundary(
MKMapView.CameraBoundary(coordinateRegion: region),
animated: true)
let zoomRange = MKMapView.CameraZoomRange(maxCenterCoordinateDistance: 200000)
mapView.setCameraZoomRange(zoomRange, animated: true)
}
}
private extension MKMapView {
func centerToLocation(
_ location: CLLocation,
regionRadius: CLLocationDistance = 5000
) {
let coordinateRegion = MKCoordinateRegion(
center: location.coordinate,
latitudinalMeters: regionRadius,
longitudinalMeters: regionRadius)
setRegion(coordinateRegion, animated: true)
}
}
@available(iOS 13.0, *)
private func loadInitialData() {
// 1
guard
let fileName = Bundle.main.url(forResource: "Weegee_2", withExtension: "geojson"),
let artworkData = try? Data(contentsOf: fileName)
else {
return
}
do {
// 2
let features = try MKGeoJSONDecoder()
.decode(artworkData)
.compactMap { $0 as? MKGeoJSONFeature }
// 3
let validWorks = features.compactMap(Artwork.init)
// 4
artworks.append(contentsOf: validWorks)
} catch {
// 5
print("Unexpected error: \(error).")
}
}
@available(iOS 13.0, *)
extension ViewController: MKMapViewDelegate {
// 1
func mapView(
_ mapView: MKMapView,
viewFor annotation: MKAnnotation
) -> MKAnnotationView? {
// 2
guard let annotation = annotation as? Artwork else {
return nil
}
// 3
let identifier = "artwork"
var view: MKMarkerAnnotationView
// 4
if let dequeuedView = mapView.dequeueReusableAnnotationView(
withIdentifier: identifier) as? MKMarkerAnnotationView {
dequeuedView.annotation = annotation
view = dequeuedView
} else {
// 5
view = MKMarkerAnnotationView(
annotation: annotation,
reuseIdentifier: identifier)
view.canShowCallout = true
view.calloutOffset = CGPoint(x: -5, y: 5)
view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
}
return view
}
}