Làm thế nào để mở ứng dụng bản đồ theo lập trình với tọa độ nhanh chóng?


107

Tôi có vĩ độ và kinh độ mà tôi muốn mở vào ứng dụng bản đồ của mình. Tôi đã thử mã này từ ĐÂY .

    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)

}

Chức năng này mở bản đồ thành công nhưng nó không hiển thị bất kỳ mã pin nào. Nó cũng hiển thị vị trí của người dùng mà tôi không muốn. Tôi chỉ muốn ghim trên bản đồ cho vĩ độ và kinh độ được cung cấp.


2
Mã này nhằm hiển thị chỉ đường lái xe từ vị trí của người dùng đến mục tiêu. Để chỉ hiển thị một mục tiêu duy nhất, hãy sử dụng MKLaunchOptionsMapCenterKey và một mục bản đồ duy nhất. Xem stackoverflow.com/questions/28427557/… .

Cảm ơn gợi ý Anna.
Dharmesh Kheni

Câu trả lời:


157

Mã này đang hoạt động tốt đối với tôi.

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)

}

Đối với nhanh chóng 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)
    }
}

Bạn có thể xác nhận rằng tùy chọn MKLaunchOptionsMapSpanKey có hiệu quả mong muốn không? Bất kể tôi sử dụng giá trị nào cho CLLocationDistance, bản đồ được phóng to khá gần.
stone

2
Dường như MKLaunchOptionsMapSpanKeybị bỏ qua khi một hoặc nhiều MKMapItemđược thêm vào bản đồ: stackoverflow.com/a/32484331/422288
Eneko Alonso

4
Đừng quên: nhập MapKit
jobima

5
Chỉ muốn chỉ ra rằng đó là "vĩ độ" và "kinh độ" không "latitute" và "longitute" mặc dù "tute" là hài hước
Chris

2
Nếu người dùng đã gỡ bỏ ứng dụng bản đồ, làm thế nào chúng tôi có thể kiểm tra trường hợp đó ???
Amrit Tiwari,

67

Nếu bạn chỉ muốn chỉ đường lái xe cho người dùng, đây là cú pháp Swift mới nhất ở dạng đơn giản nhất:

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

1
Điều này hoạt động tốt đối với tôi, ngoại trừ việc khóa và giá trị được đảo ngược trong các tùy chọn khởi chạy. Nên làmapItem.openInMapsWithLaunchOptions([MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Keith

1
Đảm bảo thêm nhập MapKit vào đầu tệp để giải quyết lỗi.
Joseph Astrahan

2
Cũng trong swift 3, dòng cuối cùng bây giờ là ... mapItem.openInMaps (khởi chạyOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan

45

Bạn có thể gọi hàm lớp MKMapItemchuyển các mục ở đó, nó chỉ sử dụng đầu tiên và cuối cùng cho nguồn / đích một cách thích hợp, nếu bạn muốn chuyển nhiều hơn hai mục.

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

hoặc sử dụng tiện ích mở rộng:

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

chào dimpiax! Cảm ơn câu trả lời của bạn, đã không kiểm tra nó nhưng có vẻ khá ổn. Có thể gửi một số điểm tham chiếu không? Làm sao!? Bạn có thể giúp tôi không.
Frade

@Frade này, với MapKit, bạn không thể, hãy xem: developer.apple.com/documentation/mapkit/mkmapitem/… Nhưng bạn có thể đạt được nó bằng cách sử dụng Google Maps.
dimpiax,

36

Phương MKMapItempháp trên hoạt động hiệu quả nếu bạn muốn kiểm soát chi tiết thông tin được hiển thị trong Bản đồ.

Nếu không, mã dưới đây cũng hoạt động tốt,:

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

Tuy nhiên, đoạn mã trên không cho phép bạn gửi tên tùy chỉnh của địa điểm. Thay vào đó, nó sẽ hiển thị địa chỉ.

Đoạn mã trên cũng cho phép bạn điều hướng từ bất kỳ tọa độ nguồn nào mà tôi không biết liệu bạn có thể thực hiện với phương pháp MKMapItem hay không.


4
Nếu bạn để trống "saddr =", ứng dụng sẽ đặt "vị trí của bạn" làm mặc định. Một cái gì đó như "http: // maps.apple.com/maps?saddr=&daddr=(to.latitude),(to.longitude)"
Mariano Zorrilla

không có chỉ đường
Marlhex

11

Điều này làm việc như một sự quyến rũ đối với tôi

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
Điều này không còn làm việc với tôi. Tôi đã kết thúc với "Không có chỉ đường."
Hemang

3

Bạn có thể sử dụng mã bên dưới để hiển thị mã PIN trên bản đồ 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

Nếu những gì bạn muốn là một cái gì đó đơn giản mà không cần nhập bất kỳ khuôn khổ nào, bạn chỉ có thể tạo một URL: https://maps.apple.com/?ll=\(latitude),\(longitude)

Tương tự như phản hồi @ saniel-saidi nhưng phản hồi này chỉ mở bản đồ với vị trí được gửi chứ không phải điều hướng


chỉ cần loại bỏ () xung quanh tọa độ, không tìm thấy nó với chúng.
Boris Gafurov

1

Tôi biết tất cả các câu trả lời đều hoàn chỉnh nhưng ở đây tôi đã nhận được một câu trả lời là dễ dàng hơn để sao chép dán và cũng cung cấp cho người dùng các tùy chọn để định tuyến với Apple Maps, Google Map & Waze.

Làm việc với Swift 5+

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

Có thể giúp ai đó ...


0

Cập nhật câu trả lời thực tế của Daniel Saidi . Ví dụ này chỉ cho biết tọa độ đích. Bản đồ sẽ lấy vị trí hiện tại của người dùng làm nguồn gốc.

let url = URL(string: "http://maps.apple.com/maps?saddr=&daddr=\(lat),\(lon)")
UIApplication.shared.open(url!)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.