Bagaimana cara membuka Aplikasi peta secara terprogram dengan koordinat dengan cepat?

107

Saya memiliki garis lintang dan bujur yang ingin saya buka di aplikasi peta saya. Saya mencoba kode ini dari SINI .

    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)

}

Fungsi ini berhasil membuka peta tetapi tidak menunjukkan pin apa pun. Juga menunjukkan lokasi pengguna yang tidak saya inginkan. Saya hanya ingin pin di peta untuk garis lintang dan bujur yang disediakan.

Dharmesh Kheni
sumber
2
Kode ini dimaksudkan untuk menunjukkan petunjuk arah mengemudi dari lokasi pengguna ke target. Untuk hanya menampilkan satu target, gunakan MKLaunchOptionsMapCenterKey dan satu item peta. Lihat stackoverflow.com/questions/28427557/… .
Terima kasih atas saran Anna.
Dharmesh Kheni

Jawaban:

157

Kode ini berfungsi dengan baik untuk saya.

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)

}

Untuk swift 3.0:

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)
    }
}
Dharmesh Kheni
sumber
Dapatkah Anda mengonfirmasi bahwa opsi MKLaunchOptionsMapSpanKey memiliki efek yang diinginkan? Tidak peduli nilai apa yang saya gunakan untuk CLLocationDistance, peta diperbesar cukup dekat.
batu
2
Tampaknya MKLaunchOptionsMapSpanKeydiabaikan ketika satu atau lebih MKMapItemditambahkan ke peta: stackoverflow.com/a/32484331/422288
Eneko Alonso
4
Jangan lupa: impor MapKit
jobima
5
Hanya ingin menunjukkan bahwa itu adalah "latitude" dan "longitude" bukan "latitute" dan "longitute" meskipun "tute" lebih lucu
Chris
2
jika pengguna telah menghapus aplikasi peta, bagaimana kita bisa memeriksa kasus itu ???
Amrit Tiwari
67

Jika Anda hanya ingin memberikan petunjuk mengemudi kepada pengguna, berikut sintaks Swift terbaru dalam bentuknya yang paling sederhana:

let coordinate = CLLocationCoordinate2DMake(theLatitude,theLongitude)
let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: coordinate, addressDictionary:nil))
mapItem.name = "Target location"
mapItem.openInMaps(launchOptions: [MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving])
Joe C
sumber
1
Ini bekerja dengan baik untuk saya, kecuali bahwa kunci dan nilainya dibalik dalam opsi peluncuran. SeharusnyamapItem.openInMapsWithLaunchOptions([MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Keith
1
Pastikan untuk menambahkan impor MapKit ke atas file untuk mengatasi kesalahan.
Joseph Astrahan
2
Juga di 3 cepat baris terakhir sekarang ... mapItem.openInMaps (launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan
45

Anda dapat memanggil fungsi kelas untuk MKMapItemmengirimkan item di sana, ini hanya menggunakan pertama dan terakhir untuk sumber / tujuan dengan tepat, jika Anda ingin meneruskan lebih dari dua item.

Cepat 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])

atau menggunakan ekstensi:

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])
dimpiax
sumber
hai dimpiax! Terima kasih atas jawaban Anda, belum mengujinya tetapi tampaknya cukup baik. Apakah mungkin mengirim beberapa titik lewat? Bagaimana!? Bisakah kamu membantuku.
Frade
@Frade hey, dengan MapKit Anda tidak bisa, lihat: developer.apple.com/documentation/mapkit/mkmapitem/… Tapi Anda bisa mencapainya menggunakan Google Maps.
dimpiax
36

Itu MKMapItem Pendekatan atas karya-karya besar jika Anda ingin kontrol granular atas informasi yang ditampilkan di Maps.

Jika tidak, kode di bawah ini juga berfungsi dengan baik,:

// 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)!)

Namun, kode di atas tidak memungkinkan Anda untuk mengirimkan nama kustom untuk tempat tersebut. Sebagai gantinya, ini akan menampilkan alamatnya.

Kode di atas juga memungkinkan Anda menavigasi dari koordinat sumber apa pun, yang saya tidak tahu apakah Anda dapat melakukannya dengan pendekatan MKMapItem.

Daniel Saidi
sumber
4
Jika Anda membiarkan "saddr =" kosong, aplikasi akan menyetel "lokasi Anda" sebagai default. Sesuatu seperti "http: // maps.apple.com/maps?saddr=&daddr=(to.latitude),(to.longitude)"
Mariano Zorrilla
petunjuk arah tidak tersedia
Marlhex
11

Ini bekerja sebagai pesona bagi saya

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)
Wayne Huang
sumber
1
Ini tidak lagi membuat saya bekerja. Saya berakhir dengan "Tidak ada petunjuk arah."
Hemang
3

Anda dapat menggunakan kode di bawah ini untuk menunjukkan PIN pada lat, long di peta Apple.

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])
Malik 007
sumber
1

Jika yang Anda inginkan adalah sesuatu yang sederhana tanpa mengimpor kerangka kerja apa pun, Anda cukup membuat URL: https://maps.apple.com/?ll=\(latitude),\(longitude)

Mirip dengan respon @ saniel-saidi tapi yang ini hanya membuka peta dengan lokasi yang dikirim, bukan navigasi

rgkobashi
sumber
hanya remove () di sekitar koordinat, tidak menemukannya bersama mereka.
Boris Gafurov
1

Saya tahu semua jawaban sudah lengkap tetapi di sini saya mendapat jawaban yang lebih mudah untuk di-copy paste & juga memberi pengguna opsi untuk merutekan dengan Apple Maps, Google Map & Waze.

Bekerja dengan Swift 5+

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

Mungkin membantu seseorang ...

Alfi
sumber
0

Update ke praktis Daniel Saidi jawabannya . Contoh ini hanya untuk memberi tahu koordinat tujuan. Peta akan mendapatkan posisi pengguna saat ini sebagai asal.

let url = URL(string: "http://maps.apple.com/maps?saddr=&daddr=\(lat),\(lon)")
UIApplication.shared.open(url!)
Nicola Mingotti
sumber