Wie öffne ich die Karten-App programmgesteuert mit schnellen Koordinaten?

107

Ich habe Breiten- und Längengrade, die ich in meiner Kartenanwendung öffnen möchte. Ich habe diesen Code HIER ausprobiert .

    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)

}

Diese Funktion öffnet erfolgreich Karten, zeigt jedoch keinen Pin an. Außerdem wird der Benutzerstandort angezeigt, den ich nicht möchte. Ich möchte nur eine Stecknadel auf der Karte für den angegebenen Breiten- und Längengrad.

Dharmesh Kheni
quelle
2
Dieser Code soll Wegbeschreibungen vom Benutzerstandort zum Ziel anzeigen. Verwenden Sie MKLaunchOptionsMapCenterKey und ein einzelnes Kartenelement, um nur ein einzelnes Ziel anzuzeigen. Siehe stackoverflow.com/questions/28427557/… .
Danke für den Vorschlag Anna.
Dharmesh Kheni

Antworten:

157

Dieser Code funktioniert gut für mich.

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)

}

Für schnelles 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
quelle
Können Sie bestätigen, dass die Option MKLaunchOptionsMapSpanKey den gewünschten Effekt hat? Egal welchen Wert ich für CLLocationDistance verwende, die Karte wird ziemlich genau vergrößert.
Stein
2
Es scheint, dass das MKLaunchOptionsMapSpanKeyignoriert wird, wenn einer oder mehrere MKMapItemzur Karte hinzugefügt werden: stackoverflow.com/a/32484331/422288
Eneko Alonso
4
Vergessen Sie nicht: importieren Sie MapKit
jobima
5
Ich wollte nur darauf hinweisen, dass es "Breitengrad" und "Längengrad" ist, nicht "Breitengrad" und "Längengrad", obwohl "Tute" lustiger ist
Chris
2
Wenn der Benutzer die Kartenanwendung entfernt hat, wie können wir diesen Fall überprüfen?
Amrit Tiwari
67

Wenn Sie dem Benutzer nur eine Wegbeschreibung geben möchten, finden Sie hier die neueste Swift-Syntax in ihrer einfachsten Form:

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.
quelle
1
Dies hat bei mir gut funktioniert, außer dass der Schlüssel und der Wert in den Startoptionen umgekehrt sind. Sollte seinmapItem.openInMapsWithLaunchOptions([MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Keith
1
Stellen Sie sicher, dass Sie MapKit oben in die Datei einfügen, um Fehler zu beheben.
Joseph Astrahan
2
Auch in Swift 3 ist die letzte Zeile jetzt ... mapItem.openInMaps (launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan
45

Sie können die Klassenfunktion zum MKMapItemÜbergeben von Elementen dort aufrufen. Sie verwendet nur first und last für Quelle / Ziel entsprechend, wenn Sie mehr als zwei Elemente übergeben möchten.

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

oder mit Erweiterung:

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
quelle
Hallo Dimpiax! Vielen Dank für Ihre Antwort, habe sie nicht getestet, scheint aber ziemlich in Ordnung zu sein. Ist es möglich, mehrere Wegpunkte zu senden? Wie!? Kannst du mir bitte helfen.
Frade
@Frade hey, mit MapKit können Sie nicht, siehe: developer.apple.com/documentation/mapkit/mkmapitem/… Aber Sie können es mit Google Maps erreichen.
Dimpiax
36

Der MKMapItemobige Ansatz funktioniert hervorragend, wenn Sie eine detaillierte Kontrolle über die in Maps angezeigten Informationen wünschen.

Ansonsten funktioniert der folgende Code auch hervorragend:

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

Mit dem obigen Code können Sie jedoch keinen benutzerdefinierten Namen des Ortes senden. Stattdessen wird die Adresse angezeigt.

Mit dem obigen Code können Sie auch von jeder Quellkoordinate aus navigieren, was ich nicht weiß, ob Sie mit dem MKMapItem-Ansatz arbeiten können.

Daniel Saidi
quelle
4
Wenn Sie "saddr =" leer lassen, setzt die App "Ihren Standort" als Standard. So etwas wie "http: // maps.apple.com/maps?saddr=&daddr=(to.latitude),(to.longitude)"
Mariano Zorrilla
Wegbeschreibung nicht verfügbar
Marlhex
11

Das wirkt für mich wie ein Zauber

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
quelle
1
Das funktioniert mir nicht mehr. Am Ende hatte ich "Keine Wegbeschreibung verfügbar".
Hemang
3

Sie können den folgenden Code verwenden, um die PIN auf lat, long in der Apple-Karte anzuzeigen.

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
quelle
1

Wenn Sie etwas Einfaches möchten, ohne ein Framework zu importieren, können Sie einfach eine URL erstellen: https://maps.apple.com/?ll=\(latitude),\(longitude)

Ist ähnlich wie @ saniel-sagtei Antwort, aber diese öffnet nur die Karte mit dem gesendeten Standort, nicht die Navigationssache

rgkobashi
quelle
entferne einfach () um Koordinaten, finde es bei ihnen nicht.
Boris Gafurov
1

Ich weiß, dass alle Antworten vollständig sind, aber hier habe ich eine Antwort erhalten, die einfacher zu kopieren und einzufügen ist und den Benutzern Optionen für das Routing mit Apple Maps, Google Map und Waze bietet.

Arbeiten mit Swift 5+

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

Könnte jemandem helfen ...

Alfi
quelle
0

Update zur praktischen Antwort von Daniel Saidi . In diesem Beispiel werden nur die Zielkoordinaten angegeben. Karten erhalten als Ursprung die aktuelle Position des Benutzers.

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

Nicola Mingotti
quelle