신속하게 좌표를 사용하여 프로그래밍 방식으로지도 앱을 여는 방법은 무엇입니까?


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/…을 참조하십시오 .

Anna 제안 주셔서 감사합니다.
Dharmesh Kheni 2015

답변:


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 알론소

4
잊지 마세요 : Import MapKit
jobima

5
그냥의 "위도"와 "경도" "latitute"되지 않고 "tute"하지만 "longitute는"더 재미 있음을 지적하고 싶었
크리스

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
오류를 해결하려면 import MapKit을 파일 맨 위에 추가해야합니다.
Joseph Astrahan 2011

2
또한 빠른 3의 마지막 행은 지금 ... mapItem.openInMaps입니다 (launchOptions : [MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving])
조셉 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 hey, MapKit을 사용하면 볼 수 없습니다. developer.apple.com/documentation/mapkit/mkmapitem/… 하지만 Google지도를 사용하여 달성 할 수 있습니다.
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 apr

3

아래 코드를 사용하여 Apple지도에서 위도에 PIN을 표시 할 수 있습니다.

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

실용적인 Daniel 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.