質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.99%

  • Xcode

    3518questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

swift3.x yolpでルート検索

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 133

bbb04

score 9

https://qiita.com/k-yamada-github/items/1826b31bc9a55eea10be
上記のURLのSwift2.xで書かれた経路探索のコードをSwift3.xに合わせてみたのですが実行したところピンとルートが表示されません。

変更した点としては 下記と変数に?がついたくらいです

addOverlay → add

override func locate  → func locate

override func navigate  → func navigate

CGPointMake(15,15) → CGPoint(x: 15,y: 15)

isKindOfClass → iskind(of: ~.self )
import UIKit

class MyAnnotation: NSObject, YMKAnnotation {
    var coordinate: CLLocationCoordinate2D
    var annotationTitle: String!
    var annotationSubtitle: String!
    var annotationIndex: Int

    init(locationCoordinate: CLLocationCoordinate2D, title: String!, subtitle: String!, index: Int) {
        coordinate = locationCoordinate
        annotationTitle = title
        annotationSubtitle = subtitle
        annotationIndex = index
    }

    func title() -> String! {
        return annotationTitle
    }

    func subtitle() -> String! {
        return annotationSubtitle
    }
}




class ViewController: UIViewController, YMKMapViewDelegate, YMKRouteOverlayDelegate, YMKNaviControllerDelegate,UIAlertViewDelegate {
    var mapView: YMKMapView!
    var naviController: YMKNaviController? //ルート案内インスタンス

    override func viewDidLoad() {
        super.viewDidLoad()

        // YMKMapViewを生成する
        mapView = YMKMapView(frame: self.view.bounds, appid: "~");
        // 地図のタイプを指定 標準の地図を指定
        mapView.mapType = UInt(YMKMapTypeStandard)
        mapView.showsUserLocation = true
        mapView.delegate = self

        self.view.addSubview(mapView)

        let startLocation = CLLocation.init(latitude: 35.6657214, longitude: 139.7310058) // Midtoun
        let goalLocation = CLLocation.init(latitude: 35.710063, longitude: 139.8107)
        locate(location: startLocation)
        navigate(startLocation: startLocation, goalLocation: goalLocation, startTitle: "現在地", goalTitle: "スカイツリー")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        mapView.frame = self.view.bounds
        self.view.layoutIfNeeded()
    }



    // 指定された座標を表示する
    func locate(location: CLLocation) {
        // 地図の位置と縮尺を設定
        let center = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
        mapView.region = YMKCoordinateRegionMake(center, YMKCoordinateSpanMake(0.002, 0.002));
        mapView.invalidateIntrinsicContentSize()

        // MyAnnotationの初期化
        //    MyAnnotation* myAnnotation = [[MyAnnotation alloc] initWithLocationCoordinate:coordinate title:[[NSString alloc] initWithString:@"ミッドタウン"] subtitle:[[NSString alloc] initWithString:@"ミッドタウンです。"]];l
        let myAnnotation = MyAnnotation.init(locationCoordinate: center, title: "ミッドタウン", subtitle: "ミッドタウンです", index: 1)

        // AnnotationをYMKMapViewに追加
        mapView.addAnnotation(myAnnotation)

        // 地図上のマーカー表示用のアノテーション配列を作成
        var annotations: [AnyObject] = []
        annotations.append(MyAnnotation(locationCoordinate: center, title: "bbb", subtitle: "aaa", index: 0))
        setAnnotations(annotations: annotations)

        showPolyline()
    }



    func setAnnotations(annotations: [AnyObject]!) {
        mapView.removeAnnotations(mapView.annotations)

        if annotations != nil && annotations.count > 0 {
            mapView.addAnnotations(annotations)
        }
    }




    func mapView(_mapView: YMKMapView!, viewForAnnotation annotation: YMKAnnotation!) -> YMKAnnotationView! {
        if annotation is MyAnnotation {
            // マーカーのビューを引数のannotationを用いて作成する
            let pin = YMKPinAnnotationView(annotation: annotation, reuseIdentifier: "Pin")
            //アイコンイメージの変更
            pin?.image = UIImage.init(named: "goal");
            pin?.animatesDrop = true
            // アイコンのイメージのどこを基準点にするか設定
            let centerOffset = CGPoint(x:15,y: 15);
            pin?.centerOffset = centerOffset
            return pin
        }
        return nil
    }



    // ルート案内をする
    func navigate(startLocation: CLLocation, goalLocation: CLLocation, startTitle: String, goalTitle: String) {
        let startPos = CLLocationCoordinate2DMake(startLocation.coordinate.latitude, startLocation.coordinate.longitude);
        let goalPos  = CLLocationCoordinate2DMake(goalLocation.coordinate.latitude, goalLocation.coordinate.longitude);

        // YMKRouteOverlayを作成
        let routeOverlay = YMKRouteOverlay.init(appid: "~")
        //YMKRouteOverlayDelegateを設定
        routeOverlay?.delegate = self
        // 出発地ピンの吹き出し設定
        routeOverlay?.setStartTitle(startTitle)
        // 目的地ピンの吹き出し設定
        routeOverlay?.setGoalTitle(goalTitle)
        // 出発地、目的地、移動手段を設定
        routeOverlay?.setRouteStartPos(startPos, withGoalPos: goalPos, withTraffic: TRAFFIC_WALK)
        // ルートの検索
        routeOverlay?.search()
    }




    func showPolyline() {
        // YMKPolylineを作成
        var coords: [CLLocationCoordinate2D] = []
        coords.append(CLLocationCoordinate2D.init(latitude: 35.6657214, longitude: 139.7310058))
        coords.append(CLLocationCoordinate2D.init(latitude: 35.670168, longitude: 139.702687))
        coords.append(CLLocationCoordinate2D.init(latitude: 35.683061, longitude: 139.702687))
        coords.append(CLLocationCoordinate2D.init(latitude: 35.690921, longitude: 139.700258))

        let line = YMKPolyline.init(coordinates: &coords, count: 4)
        // YMKPolylineをYMKMapViewに追加
        mapView.add(line)
    }




    // ルート検索が正常に終了した場合
    func finishRouteSearch(_ routeOverlay: YMKRouteOverlay) {
        // YMKRouteOverlayをYMKMapViewに追加
        mapView.add(routeOverlay)

        //    // YMKNaviControllerを作成しYMKRouteOverlayインスタンスを設定
        naviController = YMKNaviController.init(routeOverlay: routeOverlay)
        //
        //    // YMKMapViewインスタンスを設定
        naviController!.setMapView(mapView)
        //
        //    // YMKNaviControllerDelegateを設定
        naviController!.delegate = self
        //
        //    // 案内処理を開始
        naviController!.start()
    }



    // ルート検索が正常に終了しなかった場合
    func errorRouteSearch(_ routeOverlay: YMKRouteOverlay!, withError error: Int32) {
        let alert = UIAlertView.init(title: "エラー", message: "ルート検索エラー", delegate: self, cancelButtonTitle: "OK")
        alert.show()
    }

    // overlay追加イベント
    func mapView(_mapView: YMKMapView!, viewForOverlay overlay: YMKOverlay!) -> YMKOverlayView! {
        print("mapView:viewForOverlay")
        // 追加されたoverlayがYMKPolylineか確認
        if overlay.isKind(of: YMKPolyline.self) {
            let _: YMKPolyline = overlay as! YMKPolyline
            //YMKPolylineViewを作成
            let wkYMKPolylineView = YMKPolylineView.init(overlay: overlay)
            //ラインの色を青に設定
            wkYMKPolylineView?.strokeColor = UIColor.init(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)
            wkYMKPolylineView?.fillColor =   UIColor.init(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)
            //ラインの太さ
            wkYMKPolylineView?.lineWidth = 5
            return wkYMKPolylineView;
        }

        // 追加されたoverlayがYMKRouteOverlayか確認
        if overlay.isKind(of: YMKRouteOverlay.self) {
            // YMKRouteOverlayViewを作成
            let wkYMKOverlayView: YMKRouteOverlayView = YMKRouteOverlayView.init(routeOverlay: overlay as! YMKRouteOverlay)
            // 出発地ピンを非表示
            wkYMKOverlayView.startPinVisible = true
            // 目的地ピンを非表示
            wkYMKOverlayView.goalPinVisible = true
            // 経由点ピンを非表示
            wkYMKOverlayView.routePinVisible = true
            return wkYMKOverlayView;
        }
        return nil;
    }

    // 現在位置更新された場合
    func naviController(_ naviController: YMKNaviController!, didUpdate userLocation: YMKUserLocation!) {
        print("naviController:didUpdateUserLocation")
    }

    // 現在位置取得エラーが発生した場合
    func naviController(_naviController: YMKNaviController!, didFailToLocateUserWithError error: Error!) {
        print("naviController:didFailToLocateUserWithError")
    }

    // 現在位置の精度が悪い場合
    func naviControllerAccuracyBad(_ naviController: YMKNaviController!, didUpdate userLocation: YMKUserLocation!) {
        print("naviControllerAccuracyBad")
    }

    // ルートから外れたと判断された場合
    func naviControllerRouteOut(_ naviController: YMKNaviController!, didUpdate userLocation: YMKUserLocation!) {
        print("naviControllerRouteOut")
    }

    // 目的地に到着した場合
    func naviController(onGoal naviController: YMKNaviController!, didUpdate userLocation: YMKUserLocation!) {
        print("naviControllerOnGoal")
        // 案内処理を継続しない場合は停止させる
        naviController.stop()
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2017/10/16 09:28

    前回の質問でもそうでしたが、「Swift2からSwift3に書き換え → 表示されません」ではなく、呼ばれるべき関数が呼ばれているか、変数がnilになっていないか、など、自分で調べられることは調べて、その結果を書いて下さい。現状では丸投げです。

    キャンセル

  • bbb04

    2017/10/16 14:21

    仰る通りです。質問の仕方から勉強させていただきます。 それぞれのメソッドでコンソール出力をして確認したところaddOverlayのメソッドだけ呼び出されていないようです。前回のようにguardを用いた方法がよろしいのでしょうか。またshowPolyLineのメソッドでlineをaddしているはずなのですが表示されないのは追加方法が違うのでしょうか。

    キャンセル

  • fuzzball

    2017/10/16 14:26

    「addOverlayのメソッドだけ呼び出されていない」はどういう意味でしょうか?元のコードを見ると二箇所ありますが、showPolyline()もしくはfinishRouteSearch()が呼ばれていないということでしょうか?

    キャンセル

  • bbb04

    2017/10/16 15:33

    すいません説明不足でした。呼び出されていない場所は (//overlay追加イベント)の所です。コンソールを見るとnilを返している訳では内容です。

    キャンセル

回答 1

checkベストアンサー

0

スペースがありません。

func mapView(_mapView: YMKMapView!, ...

func mapView(_ mapView: YMKMapView!, ...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/16 15:48

    上手く経路が出ました。ありがとうございます。
    すごく初歩的なミスでごめんなさい。
    質問する際にはもっと慎重にしたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Swift2のMKMapkitでannotation.titleの内容を変更したいのです

    Swift2でマップに1つだけ品を作成してタイトルに文字を入れてaddannitationしています! ボタンを押したときに1つのピンのtitleを変更する方法がわからないのです

  • 解決済

    MKMapView内のAnnotationの色を条件によって変更したい

    前提・実現したいこと ・マップ上のピンの色を条件により変更したい ・APIから情報を取得し、複数のデータ(今回は仮に3箇所)のピンを置く ・その条件はdata[num]["c

  • 解決済

    アノテーションタップ時にピン画像を変更する

    前提・実現したいこと アノテーションのタップ時にピンの画像を変更することは出来るのでしょうか。 viewForAnnotationで画像を変更する方法は実装済みで、 更にここ

  • 解決済

    CollectionViewと連動してピン画像を変更させたい

    前提・実現したいこと タイトルの通りになります。 MapViewとCollectionViewが連動する形の画面を作りたいと思っています。 その際、ピンタップ時および、col

  • 解決済

    Swift3:Yahoo! iOSマップSDKの実装

    iOS版のYmapKitを使用して地図機能の実装をしようとしておりますが、 デベロッパーネットワークのチュートリアルを参考に利用準備を行いましたが、 importでエラーが表示

  • 解決済

    Yahoo! iOSマップSDKのSwift対応

    Swiftアプリ開発初心者です。 iOS版のYmapKitを使用して地図機能の実装をしようとしておりますが、 Yahoo! iOSマップSDKドキュメントを確認したところ、Ob

  • 解決済

    Swift3でMapViewのPinを縮小した写真にしたい

    MapViewを使い、現在地で撮った写真をPinの画像にするフォトアルバムを作ろうとしています。 pickerViewで写真を撮った後に画像の配列に写真を入れて、それをPinの画

  • 解決済

    [Xcode/Swift]逆GEOコードでのエラーで困っています

    Xcode初心者です。緯度・経度から住所を得たく、こちらのサイトをそのままコピペしました。 そうしたところ、サイト情報との環境違い(Version 8.3.3)か、いくつかエラ

同じタグがついた質問を見る

  • Xcode

    3518questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。