Як відкрити карти App програматично з швидкими координатами?


107

У мене є широта та довгота, які я хочу відкрити у своїй програмі для карти. Я спробував цей код ТУТ .

    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)

}

Ця функція успішно відкриває карти, але не показує жодного штифта. Також він показує місцезнаходження користувача, якого я не хочу. Мені потрібно лише шпильку на карті за умови широти та довготи.


2
Цей код призначений для відображення маршрутів руху від місцезнаходження користувача до цілі. Щоб просто показати одну ціль, використовуйте MKLaunchOptionsMapCenterKey та один елемент карти. Дивіться stackoverflow.com/questions/28427557/… .

Дякую за пропозицію, Анна.
Dharmesh Kheni

Відповіді:


157

Цей код добре працює для мене.

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)

}

Для швидкого 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)
    }
}

Чи можете ви підтвердити, що опція MKLaunchOptionsMapSpanKey надає бажаний ефект? Незалежно від того, яке значення я використовую для CLLocationDistance, карта досить масштабована.
камінь

2
Здається, що MKLaunchOptionsMapSpanKeyігнорується, коли MKMapItemдо карти додано один або декілька : stackoverflow.com/a/32484331/422288
Eneko Alonso

4
Не забувайте: імпортуйте MapKit
jobima

5
Просто хотілося зазначити, що це "широта" та "довгота", а не "латитут" та "лонгітут", хоча "туте" смішніше
Кріс

2
якщо користувач видалив додаток карт, що ми можемо перевірити у цьому випадку ???
Амріт Тіварі

67

Якщо ви просто хочете дати вказівкам щодо керування користувачем, ось останній синтаксис Swift у його найпростішому вигляді:

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

1
Це добре працювало для мене, за винятком того, що ключ і значення змінені в параметрах запуску. Має бутиmapItem.openInMapsWithLaunchOptions([MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Кіт

1
Обов’язково додайте імпорт MapKit до верхньої частини файлу, щоб вирішити помилки.
Йосип Астрахан

2
Також у swift 3 останній рядок зараз ... mapItem.openInMaps (запускOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Джозеф Астрахан

45

Ви можете викликати функцію класу для MKMapItemпередачі туди елементів, вона використовує лише перше і останнє для джерела / місця призначення, якщо ви хочете передати більше двох елементів.

Швидкий 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])

або за допомогою розширення:

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! Дякую за вашу відповідь, не перевіряв, але здається, що це нормально. Чи можна надіслати кілька точок маршруту? Як !? Чи можете ви мені допомогти.
Фрейд

@Frade ей, з MapKit ви не можете бачити: developer.apple.com/documentation/mapkit/mkmapitem/… Але ви можете досягти цього за допомогою Google Maps.
dimpiax

36

MKMapItemПідхід вище відмінно працює , якщо ви хочете детальний контроль над інформацією, яка відображається в картах.

Інакше також відмінно працює код нижче:

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

Однак наведений вище код не дозволяє надсилати власну назву місця. Натомість він покаже адресу.

Код вище також дозволяє вам переходити від будь-якої координати джерела, що я не знаю, чи можна це зробити з підходом MKMapItem.


4
Якщо ви залишите "saddr =" порожнім, програма встановить "ваше місцезнаходження" за замовчуванням. Щось на кшталт "http: // maps.apple.com/maps?saddr=&daddr=(to.latitude),(to.longitude)"
Mariano Zorrilla

вказівки недоступні
Marlhex

11

Це працює для мене як шарм

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
Це вже не працює у мене. Я закінчив "Немає вказівок".
Хеманг

3

Ви можете використовувати код нижче, щоб показати PIN-код на латі, довго на карті 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

Якщо ви хочете щось просте, не імпортуючи жодної рамки, ви можете просто створити URL-адресу: https://maps.apple.com/?ll=\(latitude),\(longitude)

Схожий на відповідь @ saniel-saidi, але ця відкриває лише карту з надісланим місцезнаходженням, а не навігаційну річ


просто видаліть () навколо координат, не знайде їх із собою.
Борис Гафуров

1

Я знаю, що всі відповіді є повними, але тут я отримав відповідь, яку простіше скопіювати, а також надає користувачеві параметри маршрутизації за допомогою Apple Maps, Google Map & Waze.

Робота зі Swift 5+

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

Може допомогти комусь ...


0

Оновлення до практичної відповіді Даніеля Саїді . Цей приклад розказує лише координати призначення. Карти отримають поточну позицію користувача як початкову.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.