Как быстро открыть приложение Maps программно с координатами?


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/… .

Спасибо за предложение, Анна.
Дхармеш Хени

Ответы:


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)

}

Для 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)
    }
}

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

2
Кажется, что MKLaunchOptionsMapSpanKeyигнорируется, когда один или несколько MKMapItemдобавляются на карту: stackoverflow.com/a/32484331/422288
Энеко Алонсо

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

5
Просто хотел указать, что это «широта» и «долгота», а не «широта» и «долгота», хотя «tute» смешнее
Крис

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 (launchOptions: [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])

привет димпиакс! Спасибо за ответ, не тестировал, но вроде нормально. Можно ли отправить несколько путевых точек? Как!? Не могли бы вы мне помочь.
Frade

@Frade эй, с MapKit вы не можете, см: developer.apple.com/documentation/mapkit/mkmapitem/... Но вы можете достичь его с помощью Google Maps.
dimpiax

Да, я видел это через несколько минут. Спасибо
Frade

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)"
Мариано

направления недоступны
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
Это меня больше не работает. Я получил сообщение «Нет доступных маршрутов».
Hemang

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, но он открывает только карту с отправленным местоположением, а не навигацию


просто remove () вокруг координат, не находит по ним.
Борис Гафуров

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.