座標を使ってプログラムでマップアプリをすばやく開く方法は?


107

地図アプリケーションで開きたい緯度と経度があります。私がこのコードを試してみましたHERE

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

}

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
MKLaunchOptionsMapSpanKey1つ以上MKMapItemがマップに追加された場合、は無視されるようです:stackoverflow.com/a/32484331/422288
Eneko Alonso

4
忘れないでください:MapKitをインポート
jobima

5
ちょうどそれの「緯度」及び「経度」「latitute」ではないと「tute」ものの「longituteは」笑えるであることを指摘したかった
クリス・

2
ユーザーがマップアプリケーションを削除した場合、そのケースをどのように確認できますか?
アムリットティワリ2017

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、2016年

2
また、Swift 3の最後の行は... mapItem.openInMaps(launchOptions:[MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving])
Joseph Astrahan

45

MKMapItemそこにアイテムを渡すクラス関数を呼び出すことができます。3つ以上のアイテムを渡したい場合は、source / destinationの最初と最後のみを適切に使用します。

スイフト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、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)」のようなもの
マリアーノ

利用できない方向
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

以下のコードを使用して、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応答に似ていますが、これは、ナビゲーションではなく、位置情報が送信されたマップのみを開きます


座標の周りの()を削除するだけで、座標は見つかりません。
ボリス・ガフロフ

1

私はすべての回答が完了していることを知っていますが、ここではコピー貼り付けが簡単で、ユーザーにApple Maps、Google Map、Wazeでルーティングするオプションを提供する回答を得ました。

作業スウィフト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.