Jak szybko otworzyć aplikację mapową ze współrzędnymi?

107

Mam szerokość i długość geograficzną, które chcę otworzyć w mojej aplikacji mapowej. Wypróbowałem ten kod TUTAJ .

    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)

}

Ta funkcja pomyślnie otwiera mapy, ale nie pokazuje żadnego pinezki. Pokazuje również lokalizację użytkownika, której nie chcę. Chcę mieć tylko pinezkę na mapie dla podanej szerokości i długości geograficznej.

Dharmesh Kheni
źródło
2
Ten kod ma na celu pokazanie wskazówek dojazdu z lokalizacji użytkownika do celu. Aby pokazać tylko jeden cel, użyj MKLaunchOptionsMapCenterKey i pojedynczego elementu mapy. Zobacz stackoverflow.com/questions/28427557/… .
Dzięki za sugestię Anna.
Dharmesh Kheni,

Odpowiedzi:

157

Ten kod działa dobrze dla mnie.

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)

}

Dla 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
źródło
Czy możesz potwierdzić, że opcja MKLaunchOptionsMapSpanKey daje pożądany efekt? Bez względu na to, jakiej wartości używam dla CLLocationDistance, mapa jest powiększana dość blisko.
kamień
2
Wygląda na to, że MKLaunchOptionsMapSpanKeyjest ignorowany, gdy jeden lub więcej MKMapItemzostanie dodanych do mapy: stackoverflow.com/a/32484331/422288
Eneko Alonso
4
Nie zapomnij: zaimportuj MapKit
jobima
5
Chciałem tylko zaznaczyć, że to „szerokość” i „długość geograficzna”, a nie „szerokość” i „długość”, chociaż „tute” jest zabawniejszy
Chris
2
jeśli użytkownik usunął aplikację mapową, jak możemy sprawdzić ten przypadek ???
Amrit Tiwari
67

Jeśli chcesz tylko wskazać użytkownikowi wskazówki dotyczące dojazdu, oto najnowsza składnia języka Swift w jej najprostszej formie:

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
źródło
1
To działało dobrze, z wyjątkiem tego, że klucz i wartość są odwrócone w opcjach uruchamiania. Powinno byćmapItem.openInMapsWithLaunchOptions([MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Keith
1
Upewnij się, że dodałeś import MapKit na początku pliku, aby rozwiązać błędy.
Joseph Astrahan
2
Również w Swift 3 ostatnia linia jest teraz ... mapItem.openInMaps (launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan
45

Mógłbyś wywołać funkcję klasy MKMapItemprzekazywania tam elementów, używa ona tylko pierwszego i ostatniego odpowiednio dla źródła / przeznaczenia, jeśli chcesz przekazać więcej niż dwa elementy.

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

lub używając rozszerzenia:

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
źródło
cześć dimpiax! Dziękuję za odpowiedź, nie testowałem jej, ale wydaje się całkiem w porządku. Czy można wysłać kilka punktów trasy? W jaki sposób!? Możesz mi pomóc.
Frade
@Frade hej, z MapKit nie możesz, zobacz: developer.apple.com/documentation/mapkit/mkmapitem/… Ale możesz to osiągnąć za pomocą Google Maps.
dimpiax
36

Powyższe MKMapItempodejście sprawdza się świetnie, jeśli chcesz mieć szczegółową kontrolę nad informacjami wyświetlanymi w Mapach.

W przeciwnym razie poniższy kod również działa świetnie:

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

Jednak powyższy kod nie pozwala na przesłanie niestandardowej nazwy miejsca. Zamiast tego pokaże adres.

Powyższy kod pozwala również na nawigację z dowolnego źródła współrzędnych, czego nie wiem, czy możesz to zrobić z podejściem MKMapItem.

Daniel Saidi
źródło
4
Jeśli pozostawisz „saddr =” puste, aplikacja ustawi „Twoją lokalizację” jako domyślną. Coś w rodzaju „http: // maps.apple.com/maps?saddr=&daddr=(to.latitude),(to.longitude)”
Mariano Zorrilla
trasa
11

To działa jak urok dla mnie

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
źródło
1
To już nie działa. Skończyło się na „Brak dostępnych wskazówek”.
Hemang
3

Możesz użyć poniższego kodu, aby wyświetlić kod PIN na szerokości, długo w mapie 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
źródło
1

Jeśli chcesz czegoś prostego bez importowania frameworka, możesz po prostu utworzyć adres URL: https://maps.apple.com/?ll=\(latitude),\(longitude)

Jest podobna do odpowiedzi @ saniel-saidi, ale ta otwiera tylko mapę z wysłaną lokalizacją, a nie nawigację

rgkobashi
źródło
po prostu usuń () wokół współrzędnych, nie znajdzie go razem z nimi.
Boris Gafurov
1

Wiem, że wszystkie odpowiedzi są kompletne, ale tutaj otrzymałem odpowiedź, która jest łatwiejsza do skopiowania, wklejania, a także daje użytkownikowi opcje trasowania z Apple Maps, Google Map i Waze.

Praca z Swift 5+

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

Może komuś pomóc ...

Alfi
źródło
0

Zaktualizuj do praktycznej odpowiedzi Daniela Saidiego . Ten przykład służy do podania tylko współrzędnych celu. Mapy jako źródło przyjmą aktualną pozycję użytkownika.

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