วิธีเปิดแอพแผนที่โดยใช้โปรแกรมพร้อมพิกัดอย่างรวดเร็ว?


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)

}

สำหรับ 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" จะสนุกกว่าก็ตาม
คริส

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])
คี ธ

1
อย่าลืมเพิ่มการนำเข้า MapKit ที่ด้านบนของไฟล์เพื่อแก้ไขข้อผิดพลาด
Joseph Astrahan

2
นอกจากนี้ใน swift 3 บรรทัดสุดท้ายคือตอนนี้ ... mapItem.openInMaps (launchOptions: [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan

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

@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)"
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

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 แต่อันนี้เปิดเฉพาะแผนที่พร้อมตำแหน่งที่ส่งไม่ใช่การนำทาง


เพียงลบ () รอบ ๆ พิกัดไม่พบกับพวกเขา
Boris Gafurov

1

ฉันรู้ว่าคำตอบทั้งหมดนั้นสมบูรณ์ แต่ที่นี่ฉันได้รับคำตอบซึ่งง่ายกว่าในการคัดลอกวางและยังให้ตัวเลือกผู้ใช้ในการกำหนดเส้นทางด้วย Apple Maps, Google Map และ Waze

การทำงานกับSwift 5+

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

อาจช่วยใครสักคน ...


0

ปรับปรุงการปฏิบัติแดเนียล Saidi คำตอบ ตัวอย่างนี้ใช้สำหรับบอกพิกัดปลายทางเท่านั้น แผนที่จะได้รับเป็นจุดเริ่มต้นของตำแหน่งปัจจุบันของผู้ใช้

let url = URL(string: "http://maps.apple.com/maps?saddr=&daddr=\(lat),\(lon)")
UIApplication.shared.open(url!)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.