如何通过编程快速打开带有坐标的地图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'2

Answers:


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
Eneko Alonso

4
别忘了:import MapKit
jobima

5
只是想指出,尽管“ tute”更有趣,但它是“纬度”和“经度”而不是“ latitute”和“ longitute”
Chris

2
如果用户删除了地图应用程序,我们如何检查这种情况?
Amrit Tiwari

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

1
确保将导入MapKit添加到文件顶部以解决错误。
约瑟夫·阿斯特拉罕

2
同样在swift 3中,最后一行现在是... mapItem.openInMaps(launchOptions:[MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan

45

您可以调用MKMapItem传递项目的类函数,如果您要传递两个以上的项目,则它仅适当地使用first和last作为源/目标。

斯威夫特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

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
这不再对我起作用。最后,我说“没有方向可用”。
Hemang '18年

3

您可以使用以下代码在lat上显示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

更新实用的Daniel Saidi 答案。本示例仅用于告知目标坐标。地图将以用户当前位置为原点。

let url = URL(string: "http://maps.apple.com/maps?saddr=&daddr=\(lat),\(lon)")
UIApplication.shared.open(url!)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.