Mapkit ve Overlays ile İnteraktif Haritalar oluşturmak
HaritaKit ve Overlays ile Zengin Etkileşimli Harita Yapın
Haritalar sayısız iOS uygulamaları temel bir bileşenidir, yolculuktan gelen paylaşım ve teslimat hizmetleri seyahat rehberleri ve fitness takipçileri için. Apple'ın MapKit framework, geliştiricilere yalnızca bilgilendirici değil, çok interaktif bir şekilde giriş yapan haritalar sunar - ilk kurulumdan itibaren, gerçek Swift kod örneklerini ve en iyi uygulamaları kullanarak.
Projenizde Up MapKit
Bir haritada herhangi bir şey çizebilmeden önce, Xcode projenizi hazırlamanız gerekir. Süreç üç hızlı adım içerir: çerçeveyi ithal etmek, yer izinleri talep etmek ve arayüzünize ek eklemek.
İthalat MapKit ve İstek İzinleri
Open yourFLT:1) Dosyayı açın ve şöyle ekleyin:2. Uygulamanız kullanıcının mevcut konumunu göstermek için, ayrıca yazarın güncellemesini talep etmelisiniz.InurFLT:3), "kullanışta" gibi kısa bir açıklama ile, "Yeni iOS sürümlerinizi göstermek için, aynı zamanda yerdeki konumunuzu da eklemelisiniz.
Bir MKMapView
Harita görüntüleme programı tematik veya Interface Builder kullanarak, aurFLT:0)MapKit View) görüntü kontrolörünizin tuvaline tıkla.
@IBOutlet weak var mapView: MKMapView!
Harita görünümünü tamamen kodda oluşturmak için, bu içerideki ) yer:
let mapView = MKMapView(frame: view.bounds)
mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(mapView)
Haritanın delegesini aşırı kullanım ve bir notasyon görüşlerine çağrılmayı kabul etmek için ayarlamayı unutmayın:
mapView.delegate = self
Map Type ve Başlangıç Bölgesini Seç
MapKit birkaç harita türü sunar: standart, uydu, hibrit ve uçlu varyantlar. Buna göre tipi ayarlayın:
mapView.mapType = .standard // or .satellite, .hybrid, .satelliteFlyover, .hybridFlyover
İlk görünür bir bölge kurmak için, bir koordinat ve yay (latitude and longitude delta) tanımlamak ve “Uygunluk ve uzunluk” olarak adlandırılır:
let center = CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194)
let span = MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)
let region = MKCoordinateRegion(center: center, span: span)
mapView.setRegion(region, animated: false)
Bir düzgün kullanıcı deneyimi için, görüntülediğiniz verilere göre daha uygun bir yer ayarla. Ayrıca www.FLT:13) veya ) tüm aşırılıkları ve bir notasyonları otomatik olarak ayarlamak için bölgeyi ayarlayabilirsiniz.
MapKit'te Overlays Anlamak
Overlays harita parçalarının üstünde çizilen herhangi bir görsel unsurdur.Belgelerin aksine (bu, bir çağrı ile tek puandır), Overlays, rastgele şekiller kaplayabilir: çizgiler, poligonlar, çevreler, hatta özel görüntüler. HaritaKit özel olarak üç yerleşik overlay tipi ve genel bir şekilde yapılır.
- [FONT:0]MKPolyline[[Dönerge: 1 ) - rotalar, izler veya bağlantılı çizgi segmentlerden oluşan herhangi bir yol.
- [FONT:0]MKPolygon[Dönerge: 1) – mahalleler, parklar veya teslimat bölgeleri gibi dolu alanlar için.
- [FONT:0]MKCircle[[Dönetici: 1 ) – dairesel bölgeler için (örneğin, bir noktadaki yakın yarıçak).
- [FONT:0]MKTileOverlay[[Döntme: 1 ) - özel harita parçaları (örneğin, ısı haritaları veya üçüncü taraf sağlayıcından uydu görüntü).
Her overlay, ESFLT:16 ile haritaya eklenir ve bu işlem delege yöntemiyle ele alınır.
Polyline Overlay
Ortak kullanım durumu bir rota gösteriyor. Bir dizi koordinat oluşturun, sonra anüFLT:18).
let coordinates = [
CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194), // San Francisco
CLLocationCoordinate2D(latitude: 37.7849, longitude: -122.4094),
CLLocationCoordinate2D(latitude: 37.7949, longitude: -122.3994)
]
let polyline = MKPolyline(coordinates: coordinates, count: coordinates.count)
mapView.addOverlay(polyline)
Bunu aşırı yükleme yaptığınızda, harita bir dosya almak için delegesini çağıracaktır. Bu yöntemi uygulamanız gerekir; aksi takdirde aşırı uçlanmayacaktır (aşağıdaki başvuru bölümü görün).
Polygon Overlay
Polygons aynı şekilde çalışır, ancak kapalı bir şekil yaratır. Örneğin, bir şehir parkını vurgulamak için:
let parkCoordinates = [
CLLocationCoordinate2D(latitude: 37.7695, longitude: -122.4645),
CLLocationCoordinate2D(latitude: 37.7595, longitude: -122.4495),
CLLocationCoordinate2D(latitude: 37.7695, longitude: -122.4395),
CLLocationCoordinate2D(latitude: 37.7795, longitude: -122.4545)
]
let polygon = MKPolygon(coordinates: parkCoordinates, count: parkCoordinates.count)
mapView.addOverlay(polygon)
Polygons ayrıca iç deliklere sahip olabilir (sub-poligonlar), bu da göldeki bir ada gibi sınırları göstermek için kullanışlıdır.
Bir Çemberi Ekleyin
Circles sadece bir merkez koordinat ve metrede bir yarıçap gerektirir:
let circle = MKCircle(center: CLLocationCoordinate2D(latitude: 37.7749, longitude: -122.4194), radius: 5000) // 5 km radius
mapView.addOverlay(circle)
Bu, geofences veya kapsama alanları göstermek için mükemmel.
Stoker ile özelleştirin
Overlays'ın gerçek çizimi, [[0|overlay formers[[Dönetici: 1 ) tarafından yapılır. Haritaya aşırı yükleme yöntemi [[Döntemsiz nesne ile yapılandırılır.
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if let polyline = overlay as? MKPolyline {
let renderer = MKPolylineRenderer(polyline: polyline)
renderer.strokeColor = UIColor.systemBlue
renderer.lineWidth = 4
renderer.lineDashPattern = [10, 5] // dashed line
return renderer
} else if let polygon = overlay as? MKPolygon {
let renderer = MKPolygonRenderer(polygon: polygon)
renderer.fillColor = UIColor.systemGreen.withAlphaComponent(0.3)
renderer.strokeColor = UIColor.systemGreen
renderer.lineWidth = 2
return renderer
} else if let circle = overlay as? MKCircle {
let renderer = MKCircleRenderer(circle: circle)
renderer.fillColor = UIColor.systemOrange.withAlphaComponent(0.2)
renderer.strokeColor = UIColor.systemOrange
renderer.lineWidth = 1
return renderer
}
// Fallback – should not happen if you handle all overlay types
return MKOverlayRenderer(overlay: overlay)
}
Özelleştirebileceğiniz anahtar özellikler:
- [FONT:0] [Dönderlik[[Dönemli) [Dönetici:2)) [Dönetici: 4)))))))))))))))))))))))))))
- [FONT=0][Döncükler ve poligon kenarları için [Döncüler için).
- [FONT:0]lineDashPattern[DashT:1] – baraj uzunluklarını temsil eden bir dizi sayı.
- [FONT:0]KıtsalK[DÜDÜT:2)[Dönemli)[Döncükler için, [Döncüler için)
Renderers ayrıca İLRAT:0)alpha[[DÜT:1) ve [[Dönetici:2)) ancak sonra değiştiremezsiniz; ekin çemberleri ile kıyaslanmışsınız.
Özel Harita Data için Kaplamalar Kullanımı
Özel bir raster tabakası (örneğin, hava radarı veya tarihi bir harita) görüntülemek istiyorsanız, [[Çizgi sunucu için bir URL şablonu belirtin ve Seçmeli olarak minimum /maximum zoom seviyesi ayarlayın:
let template = "https://tile.openweathermap.org/map/precipitation_new/{z}/{x}/{y}.png?appid=YOUR_API_KEY"
let tileOverlay = MKTileOverlay(urlTemplate: template)
tileOverlay.canReplaceMapContent = false // set true if the tiles should completely replace Apple maps
mapView.addOverlay(tileOverlay)
Karolinalar oluşturmak için, özel birFLT:26'ye ihtiyacınız var:
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if let tileOverlay = overlay as? MKTileOverlay {
return MKTileOverlayRenderer(tileOverlay: tileOverlay)
}
// ... other overlay renderers
}
Ahşap aşırı kullanım kolaylığı göz önüne alındığında, URL talepleri [DİDBİ 1:0) HTTPS üzerinden servis edilmesi gerekir; Apple'ın ulaşım güvenliği istisnaları eklemediğiniz sürece HTTP'yi engelleyebilir.
Map Interactive
Gerçekten interaktif bir harita statik çizgiler ve şekillerin ötesine geçer. Kullanıcılar ilgi noktalarına dokunmayı bekler, çağrıları görür ve belki haritada bile çizilir. İşte bu etkileşimleri nasıl ekleyeceğinizi.
Callouts ile Annotations eklemek
Annotasyonlar bir başlık, alt unvanı ve en basit şekilde atıldığı zaman çağrılı bir görünüme işaret ediyor: “Şaşırtıcılar, doğru bir şekilde kullanmak için.
let annotation = MKPointAnnotation()
annotation.title = "Golden Gate Bridge"
annotation.subtitle = "San Francisco, CA"
annotation.coordinate = CLLocationCoordinate2D(latitude: 37.8199, longitude: -122.4783)
mapView.addAnnotation(annotation)
Annotasyonun görselini (pin renkli, görüntü, çağrıout), delege yönteminin uygulama:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
guard !(annotation is MKUserLocation) else { return nil } // use default user location view
let identifier = "PinAnnotation"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView
if annotationView == nil {
annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
} else {
annotationView?.annotation = annotation
}
annotationView?.canShowCallout = true
annotationView?.glyphText = "📍"
annotationView?.markerTintColor = UIColor.systemRed
// Add a detail disclosure button to the callout
annotationView?.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
return annotationView
}
[[Dint: {5}[değiştir | kaynağı değiştir], Bir sûreyi kullanıp, sûreyi kullan.
Gesture Recognisers for Drawing or Selection
Kullanıcıların haritada çizebilmelerine izin vermek (örneğin, bir rotayı ölçmek veya bir poligon tanımlamak), harita görüşüne jest bir yaklaşım, bir pin bırakmanın uzun baskılı bir jest kullanarak:
let longPress = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
mapView.addGestureRecognizer(longPress)
@objc func handleLongPress(_ gesture: UILongPressGestureRecognizer) {
guard gesture.state == .began else { return }
let point = gesture.location(in: mapView)
let coordinate = mapView.convert(point, toCoordinateFrom: mapView)
let annotation = MKPointAnnotation()
annotation.coordinate = coordinate
annotation.title = "Custom Point"
mapView.addAnnotation(annotation)
}
Daha gelişmiş çizim için (örneğin, kullanıcıların aşırı bir yol haline gelen bir yolu takip etmesine izin vermek), pan jesti takip etmek ve koordinatlar toplamak, sonra jest sona erdikten sonra poliline veya poligon oluşturmak.
Performans için Annotations for Performance
Birçok annotasyonunuz olduğunda (yüzlü veya binlerce), hepsini bir kerede kapatıp haritayı ezebilir. MapKit ►FLT:0) Yerel olarak ayarlar).
annotationView?.clusteringIdentifier = "myCluster"
Ayrıca, bir ayarlı görüntüyü, tekrarlama performansını geliştirmek için özel bir küme oluşturabilirsiniz. Sistem otomatik olarak yakındaki bir kümeye ve kullanıcı yakınlarına otomatik olarak güncellenecek ve büyük veri setleri için, kullanımDANFLT:38 yöntemi kullanarak yeniden performans geliştirmek için.
Kullanıcının Konumunu Gösterin
Kullanıcının mevcut konumunu haritada görüntülemek için, setÖRT:40). Daha önce tartışılan yer yer yerdeki konum izinlerini talep etmeniz gerekir. Örneğin, kullanıcının yaklaşık doğruluğu temsil eden bir çember:
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
let region = MKCoordinateRegion(center: userLocation.coordinate, latitudinalMeters: 1000, longitudinalMeters: 1000)
mapView.setRegion(region, animated: true)
// Optionally add a circle overlay for accuracy
}
Kullanıcının yer annotasyonunun özel bir annotasyon olduğunu unutmayın; görüşünü değiştirmek veya kaldırmaktan kaçınmak isteyebilirsiniz.
Birçok Overlays ile Performansı
Yüzlerce veya binlerce overlay şekli eklemek haritayı kaydırma ve zoom performansını gözden geçirebilir. Uygulamanızı yanıtlatmak için bu ipuçlarını izleyin:
- [FONT=0]Simplify geometriler[[Dönler: 1 ) - uzun rotalarda ve poligonlarda koordinat noktalarının sayısını azaltır. uzun rotalar için basit birleştirme algoritması kullanın (örneğin, Ramer-Douglas-Peucker)
- [FONT:0) Ortamları [[Döneticileri için [Döneticileri) kullanmak, binlerce küçük çakışan çevre veya poligon yerine, yoğun ağ verileri için (örneğin, ısı haritaları) için.
- [0]Remove overlays when they are off-screen[[Döntgen: 1) - ►DÜT:42'deki bölge değişiklikleri dinleyebilirsiniz ve görünür dikdörtgene dayanan / genişletilebilir.
- [FONT=0)Batch ekleniyor ve [DÜDÜT:1] - tekrarlanan bir düzenden kaçınmak için [[ŞUYGÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ
- [FONT:0] [FONTNT=0][FONT=0)[FONT=0)))) veya İLMİŞKÂNİN KENDİ KENDİĞİ KENDİĞİ KENDİĞİ KENDİĞİ KENDİĞİ KENDİ KENDİĞİ KENDİ KENDİ KENDİĞİ KAYNAK KAYNAK KAYNAK KAYNAK KAYNAK ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
Tüm Birlikte Oluşturun: Örnek Etkileşimli Yol Haritası
Kavramları göstermek için, burada bir bisiklet rotasını gösteren bir haritanın mini örneği (poliline) bir başlangıç ve bir notasyona son vermek için, artı bir çember 500 metre uzunluğundaki bir işaretle işaret ediyor.
class RouteViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
mapView.mapType = .standard
let startCoord = CLLocationCoordinate2D(latitude: 40.7128, longitude: -74.0060) // NYC
let endCoord = CLLocationCoordinate2D(latitude: 40.7282, longitude: -73.7949) // near Central Park
let waypointCoord = CLLocationCoordinate2D(latitude: 40.7220, longitude: -73.9000)
// Add start and end annotations
let startAnnotation = MKPointAnnotation()
startAnnotation.title = "Start"
startAnnotation.subtitle = "Downtown NYC"
startAnnotation.coordinate = startCoord
mapView.addAnnotation(startAnnotation)
let endAnnotation = MKPointAnnotation()
endAnnotation.title = "Finish"
endAnnotation.subtitle = "Central Park North"
endAnnotation.coordinate = endCoord
mapView.addAnnotation(endAnnotation)
// Create route polyline
let routeCoords = [startCoord, waypointCoord, endCoord]
let route = MKPolyline(coordinates: routeCoords, count: routeCoords.count)
mapView.addOverlay(route)
// Create a buffer circle around waypoint
let buffer = MKCircle(center: waypointCoord, radius: 500)
mapView.addOverlay(buffer)
// Fit region to show all overlays
mapView.showOverlays(mapView.overlays, animated: false)
}
// MARK: - MKMapViewDelegate
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if let polyline = overlay as? MKPolyline {
let renderer = MKPolylineRenderer(polyline: polyline)
renderer.strokeColor = UIColor.systemBlue
renderer.lineWidth = 3
renderer.lineDashPattern = [12, 4]
return renderer
} else if let circle = overlay as? MKCircle {
let renderer = MKCircleRenderer(circle: circle)
renderer.fillColor = UIColor.systemYellow.withAlphaComponent(0.2)
renderer.strokeColor = UIColor.systemYellow
renderer.lineWidth = 2
return renderer
}
return MKOverlayRenderer(overlay: overlay)
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
guard !(annotation is MKUserLocation) else { return nil }
let identifier = "RoutePin"
var view = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView
if view == nil {
view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
} else {
view?.annotation = annotation
}
view?.canShowCallout = true
view?.markerTintColor = annotation.title == "Start" ? UIColor.systemGreen : UIColor.systemRed
view?.glyphText = annotation.title == "Start" ? "🚴" : "🏁"
return view
}
}
Bu örnek, aşırılıkları ve annotasyonların birlikte nasıl çalıştığını ve delege yöntemlerinin haritanın görünümünü nasıl özelleştirdiğini göstermektedir.
Daha Fazla Kaynakları
MapKit burada yer alan birçok ek özellikle olgun bir çerçevedir, örneğin [[DÜDÜ:0) Yerel arama), [[Dönetici:2|SeksD|D|D|D|D|Dışlamalar[DDDışlamalar[Dışlamalar) ve aşağıdaki resmi belgeleri ve derslerinizi derinleştirmek için[Düzgömürüm)
- [0] Apple MapKit Geliştirici Dokümantasyon[[Dönetici:0)[Dönetici:0)[Dönetici:0)
- [FONT:0)MKMapViewDelegate Protokolü[Dönder: 1) Tüm delege yöntemlerinde bir notasyon ve overlays için ayrıntılar.
- [FONT:0)Ray Wenderlich: MapKit by mphs[[[Dönetici: 1) – overlays, annotations ve konum kapsayan kapsamlı bir kitap.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
MapKit'in aşırı sistemi iOS geliştiricilerine interaktif, veri odaklı haritalar oluşturmak için inanılmaz miktarda esneklik sunar. polilines, poligons, çevreler ve jantlar ile birlikte, bu kılavuzda ortaya çıkan temelle, kullanıcıların ve uygulamanızı ayrı olarak optimize etmek için her şeyi oluşturabilirsiniz.