Hızlı koordinatlarla haritalar uygulamasını programlı olarak nasıl açarım?


107

Harita uygulamamda açmak istediğim enlem ve boylam var. Bu kodu BURADAN denedim .

    func goToMap(){

    var lat1 : NSString = self.venueLat
    var lng1 : NSString = self.venueLng

    var latitude:CLLocationDegrees =  lat1.doubleValue
    var longitude:CLLocationDegrees =  lng1.doubleValue

    var coordinate = CLLocationCoordinate2DMake(latitude, longitude)

    var placemark : MKPlacemark = MKPlacemark(coordinate: coordinate, addressDictionary:nil)

    var mapItem:MKMapItem = MKMapItem(placemark: placemark)

    mapItem.name = "Target location"

    let launchOptions:NSDictionary = NSDictionary(object: MKLaunchOptionsDirectionsModeDriving, forKey: MKLaunchOptionsDirectionsModeKey)

    var currentLocationMapItem:MKMapItem = MKMapItem.mapItemForCurrentLocation()

    MKMapItem.openMapsWithItems([currentLocationMapItem, mapItem], launchOptions: launchOptions)

}

Bu işlev haritaları başarıyla açar ancak herhangi bir raptiye göstermez. Ayrıca istemediğim kullanıcı konumunu da gösteriyor. Haritada yalnızca sağlanan enlem ve boylam için bir iğne istiyorum.


2
Bu kod, kullanıcının bulunduğu yerden hedefe kadar yol tariflerini göstermeyi amaçlamaktadır. Yalnızca tek bir hedefi göstermek için MKLaunchOptionsMapCenterKey ve tek bir harita öğesini kullanın. Bkz stackoverflow.com/questions/28427557/... .

Önerin için teşekkürler Anna.
Dharmesh Kheni

Yanıtlar:


157

Bu kod benim için iyi çalışıyor.

func openMapForPlace() {

    let lat1 : NSString = self.venueLat
    let lng1 : NSString = self.venueLng

    let latitude:CLLocationDegrees =  lat1.doubleValue
    let longitude:CLLocationDegrees =  lng1.doubleValue

    let regionDistance:CLLocationDistance = 10000
    let coordinates = CLLocationCoordinate2DMake(latitude, longitude)
    let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)
    let options = [
        MKLaunchOptionsMapCenterKey: NSValue(MKCoordinate: regionSpan.center),
        MKLaunchOptionsMapSpanKey: NSValue(MKCoordinateSpan: regionSpan.span)
    ]
    let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = "\(self.venueName)"
    mapItem.openInMapsWithLaunchOptions(options)

}

Swift 3.0 için:

import UIKit
import MapKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        openMapForPlace()
    }

    func openMapForPlace() {

        let latitude: CLLocationDegrees = 37.2
        let longitude: CLLocationDegrees = 22.9

        let regionDistance:CLLocationDistance = 10000
        let coordinates = CLLocationCoordinate2DMake(latitude, longitude)
        let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)
        let options = [
            MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center),
            MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span)
        ]
        let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
        let mapItem = MKMapItem(placemark: placemark)
        mapItem.name = "Place Name"
        mapItem.openInMaps(launchOptions: options)
    }
}

MKLaunchOptionsMapSpanKey seçeneğinin istenen etkiye sahip olduğunu onaylayabilir misiniz? CLLocationDistance için hangi değeri kullanırsam kullanayım, harita oldukça yakından yakınlaştırıldı.
Taş

2
Haritaya MKLaunchOptionsMapSpanKeybir veya daha fazla MKMapItemeklendiğinde göz ardı edildiği anlaşılıyor : stackoverflow.com/a/32484331/422288
Eneko Alonso

4
Unutmayın: MapKit'i içe aktarın
jobima

5
"Enlem" ve "boylam", "enlem" ve "boylam" değil, "tute" daha komik olmasına rağmen
Chris

2
kullanıcı haritalar uygulamasını kaldırdıysa, bu durumu nasıl kontrol edebiliriz ???
Amrit Tiwari

67

Kullanıcıya sadece yol tarifleri vermek istiyorsanız, işte en basit haliyle en son Swift sözdizimi:

let coordinate = CLLocationCoordinate2DMake(theLatitude,theLongitude)
let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: coordinate, addressDictionary:nil))
mapItem.name = "Target location"
mapItem.openInMaps(launchOptions: [MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving])

1
Bu, başlatma seçeneklerinde anahtar ve değerin tersine çevrilmesi dışında benim için iyi çalıştı. OlmalımapItem.openInMapsWithLaunchOptions([MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Keith

1
Hataları çözmek için içe aktarım MapKit'i dosyanın üstüne eklediğinizden emin olun.
Joseph Astrahan

2
Ayrıca Swift 3'te son satır şimdi ... mapItem.openInMaps (launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan

45

MKMapItemÖğeleri oraya geçirmenin sınıf işlevini çağırabilirsiniz , ikiden fazla öğe geçirmek istiyorsanız, kaynak / hedef için uygun şekilde yalnızca ilk ve sonuncuyu kullanır.

Hızlı 5, 4

let source = MKMapItem(placemark: MKPlacemark(coordinate: CLLocationCoordinate2D(latitude: lat, longitude: lng)))
source.name = "Source"

let destination = MKMapItem(placemark: MKPlacemark(coordinate: CLLocationCoordinate2D(latitude: lat, longitude: lng)))
destination.name = "Destination"

MKMapItem.openMaps(with: [source, destination], launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])

veya uzantı kullanarak:

extension MKMapItem {
  convenience init(coordinate: CLLocationCoordinate2D, name: String) {
    self.init(placemark: .init(coordinate: coordinate))
    self.name = name
  }
}

let source = MKMapItem(coordinate: .init(latitude: lat, longitude: lng), name: "Source")
let destination = MKMapItem(coordinate: .init(latitude: lat, longitude: lng), name: "Destination")

MKMapItem.openMaps(
  with: [source, destination], 
  launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])

merhaba dimpiax! Cevabınız için teşekkürler, test etmedim ama gayet iyi görünüyor. Birkaç ara nokta göndermek mümkün mü? Nasıl!? Lütfen bana yardım edebilir misin.
Frade

@Frade hey, MapKit ile göremezsiniz, göremezsiniz: developer.apple.com/documentation/mapkit/mkmapitem/… Ancak bunu Google Haritalar kullanarak başarabilirsiniz.
dimpiax

Evet, dakikalar sonra gördüm. Teşekkürler
Frade

36

MKMapItemEğer Maps görüntülenen bilgiler üzerinde ayrıntılı denetim isterseniz yaklaşım yukarıda iyi çalışıyor.

Aksi takdirde, aşağıdaki kod da harika çalışıyor:

// Open and show coordinate
let url = "http://maps.apple.com/maps?saddr=\(coord.latitude),\(coord.longitude)"
UIApplication.shared.openURL(URL(string:url)!)

// Navigate from one coordinate to another
let url = "http://maps.apple.com/maps?saddr=\(from.latitude),\(from.longitude)&daddr=\(to.latitude),\(to.longitude)"
UIApplication.shared.openURL(URL(string:url)!)

Ancak yukarıdaki kod, yerin özel bir adını göndermenize izin vermez. Bunun yerine adresi gösterecektir.

Yukarıdaki kod, MKMapItem yaklaşımı ile yapıp yapamayacağınızı bilmediğim herhangi bir kaynak koordinatından da gezinmenizi sağlar.


4
"Saddr =" alanını boş bırakırsanız, uygulama "konumunuzu" varsayılan olarak ayarlar. "Http: // maps.apple.com/maps?saddr=&daddr=(to.latitude),(to.longitude)" gibi bir şey
Mariano Zorrilla

yol tarifi mevcut değil
Marlhex

11

Bu benim için bir cazibe olarak çalışıyor

let coordinate = CLLocationCoordinate2DMake(theLatitude, theLongitude)
let region = MKCoordinateRegionMake(coordinate, MKCoordinateSpanMake(0.01, 0.02))
let placemark = MKPlacemark(coordinate: coordinate, addressDictionary: nil)
let mapItem = MKMapItem(placemark: placemark)
let options = [
    MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: region.center),
    MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: region.span)]
mapItem.name = theLocationName
mapItem.openInMaps(launchOptions: options)

1
Bu artık bana çalışmıyor. "Yol tarifi yok" ile sonlandırdım.
Hemang

3

Apple haritasında enlem, uzun süre PIN'i göstermek için aşağıdaki kodu kullanabilirsiniz.

let coordinates = CLLocationCoordinate2DMake(-37.848854,144.990295)

let regionSpan =   MKCoordinateRegionMakeWithDistance(coordinates, 1000, 1000)

let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)

let mapItem = MKMapItem(placemark: placemark)

mapItem.name =Desired place”

mapItem.openInMaps(launchOptions:[
MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center)
] as [String : Any])

1

İstediğiniz şey herhangi bir çerçeveyi içe aktarmadan basit bir şeyse, sadece bir URL oluşturabilirsiniz: https://maps.apple.com/?ll=\(latitude),\(longitude)

@ Saniel-saidi yanıtına benzer, ancak bu yalnızca konumun gönderildiği haritayı açar, navigasyon şeyini değil


koordinatlar etrafında sadece remove (), onlarla bulmuyor.
Boris Gafurov

1

Tüm cevapların tamamlandığını biliyorum ama burada, kopyalaması yapıştırması daha kolay ve ayrıca kullanıcıya Apple Maps, Google Map ve Waze ile yönlendirme seçenekleri sunan bir cevabım var.

Swift 5+ ile çalışmak

https://stackoverflow.com/a/60930491/6449292

Birine yardımcı olabilir ...


0

Pratik Daniel Saidi cevabına güncelleyin . Bu örnek, yalnızca hedef koordinatlarını söylemek içindir. Haritalar, kullanıcının mevcut konumunu başlangıç ​​noktası olarak alacaktır.

let url = URL(string: "http://maps.apple.com/maps?saddr=&daddr=\(lat),\(lon)")
UIApplication.shared.open(url!)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.