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.