Come aprire l'app Maps a livello di codice con le coordinate in Swift?


107

Ho latitudine e longitudine che desidero aprire nella mia applicazione cartografica. Ho provato questo codice da QUI .

    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)

}

Questa funzione apre correttamente le mappe ma non mostra alcun pin. Inoltre mostra la posizione dell'utente che non voglio. Voglio solo un segnaposto sulla mappa per la latitudine e la longitudine fornite.


2
Questo codice ha lo scopo di mostrare le indicazioni stradali dalla posizione dell'utente al target. Per mostrare solo un singolo obiettivo, usa MKLaunchOptionsMapCenterKey e un singolo elemento della mappa. Vedi stackoverflow.com/questions/28427557/… .

Grazie per il suggerimento Anna.
Dharmesh Kheni,

Risposte:


157

Questo codice funziona bene per me.

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)

}

Per 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)
    }
}

Puoi confermare che l'opzione MKLaunchOptionsMapSpanKey ha l'effetto desiderato? Indipendentemente dal valore che utilizzo per CLLocationDistance, la mappa viene ingrandita abbastanza da vicino.
pietra

2
Sembra che MKLaunchOptionsMapSpanKeyvenga ignorato quando uno o più MKMapItemvengono aggiunti alla mappa: stackoverflow.com/a/32484331/422288
Eneko Alonso

4
Non dimenticare: importa MapKit
jobima

5
Volevo solo sottolineare che è "latitudine" e "longitudine" non "latitute" e "longitute" anche se "tute" è più divertente
Chris

2
se l'utente ha rimosso l'applicazione delle mappe come possiamo verificare in quel caso ???
Amrit Tiwari

67

Se vuoi solo fornire indicazioni stradali all'utente, ecco l'ultima sintassi di Swift nella sua forma più semplice:

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

1
Questo ha funzionato bene per me, tranne per il fatto che la chiave e il valore sono invertiti nelle opzioni di avvio. Dovrebbe esseremapItem.openInMapsWithLaunchOptions([MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Keith

1
Assicurati di aggiungere import MapKit all'inizio del file per risolvere gli errori.
Joseph Astrahan

2
Anche in swift 3 l'ultima riga è ora ... mapItem.openInMaps (launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan

45

È possibile chiamare la funzione di classe del MKMapItempassaggio di elementi lì, utilizza solo il primo e l'ultimo per origine / destinazione in modo appropriato, se si desidera passare più di due elementi.

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

o utilizzando l'estensione:

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

ciao dimpiax! Grazie per la tua risposta, non l'ho testata ma sembra abbastanza ok. È possibile inviare più waypoint? Come!? Potete per favore aiutarmi.
Frade

@Frade hey, con MapKit non puoi, vedi: developer.apple.com/documentation/mapkit/mkmapitem/… Ma puoi ottenerlo usando Google Maps.
dimpiax

36

L' MKMapItemapproccio sopra funziona alla grande se desideri un controllo granulare sulle informazioni visualizzate in Maps.

Altrimenti, anche il codice seguente funziona alla grande:

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

Tuttavia, il codice sopra non ti consente di inviare un nome personalizzato del luogo. Invece, mostrerà l'indirizzo.

Il codice sopra ti consente anche di navigare da qualsiasi coordinata di origine, cosa che non so se puoi fare con l'approccio MKMapItem.


4
Se lasci "saddr =" vuoto, l'app imposterà "la tua posizione" come predefinita. Qualcosa come "http: // maps.apple.com/maps?saddr=&daddr=(to.latitude),(to.longitude)"
Mariano Zorrilla

indicazioni non disponibili
Marlhex

11

Questo funziona come un fascino per me

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
Questo non mi sta più lavorando. Ho finito con "Nessuna indicazione disponibile".
Hemang

3

Puoi utilizzare il codice sottostante per mostrare il PIN su lat, long nella mappa 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])

1

Se quello che vuoi è qualcosa di semplice senza importare alcun framework, puoi semplicemente creare un URL: https://maps.apple.com/?ll=\(latitude),\(longitude)

È simile alla risposta @ saniel-saidi ma questa apre solo la mappa con la posizione inviata, non la navigazione


basta remove () attorno alle coordinate, non la trova con esse.
Boris Gafurov

1

So che tutte le risposte sono complete, ma qui ho una risposta che è più facile da copiare e incollare e offre anche le opzioni utente per il routing con Apple Maps, Google Map e Waze.

Lavorare con Swift 5+

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

Potrebbe aiutare qualcuno ...


0

Aggiornamento alla pratica risposta di Daniel Saidi . Questo esempio serve solo per indicare le coordinate di destinazione. Le mappe avranno come origine la posizione corrente dell'utente.

let url = URL(string: "http://maps.apple.com/maps?saddr=&daddr=\(lat),\(lon)")
UIApplication.shared.open(url!)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.