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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

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

Q&A

解決済

1回答

258閲覧

swift3.x yolpでルート検索

bbb04

総合スコア18

Xcode

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

1グッド

1クリップ

投稿2017/10/15 06:25

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

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

Swift

1addOverlay → add 2 3override func locate  → func locate 4 5override func navigate  → func navigate 6 7CGPointMake(15,15) → CGPoint(x: 15,y: 15) 8 9isKindOfClass → iskind(of: ~.self )

Swift

1import UIKit 2 3class MyAnnotation: NSObject, YMKAnnotation { 4 var coordinate: CLLocationCoordinate2D 5 var annotationTitle: String! 6 var annotationSubtitle: String! 7 var annotationIndex: Int 8 9 init(locationCoordinate: CLLocationCoordinate2D, title: String!, subtitle: String!, index: Int) { 10 coordinate = locationCoordinate 11 annotationTitle = title 12 annotationSubtitle = subtitle 13 annotationIndex = index 14 } 15 16 func title() -> String! { 17 return annotationTitle 18 } 19 20 func subtitle() -> String! { 21 return annotationSubtitle 22 } 23} 24 25 26 27 28class ViewController: UIViewController, YMKMapViewDelegate, YMKRouteOverlayDelegate, YMKNaviControllerDelegate,UIAlertViewDelegate { 29 var mapView: YMKMapView! 30 var naviController: YMKNaviController? //ルート案内インスタンス 31 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 35 // YMKMapViewを生成する 36 mapView = YMKMapView(frame: self.view.bounds, appid: "~"); 37 // 地図のタイプを指定 標準の地図を指定 38 mapView.mapType = UInt(YMKMapTypeStandard) 39 mapView.showsUserLocation = true 40 mapView.delegate = self 41 42 self.view.addSubview(mapView) 43 44 let startLocation = CLLocation.init(latitude: 35.6657214, longitude: 139.7310058) // Midtoun 45 let goalLocation = CLLocation.init(latitude: 35.710063, longitude: 139.8107) 46 locate(location: startLocation) 47 navigate(startLocation: startLocation, goalLocation: goalLocation, startTitle: "現在地", goalTitle: "スカイツリー") 48 } 49 50 override func didReceiveMemoryWarning() { 51 super.didReceiveMemoryWarning() 52 // Dispose of any resources that can be recreated. 53 } 54 55 override func viewDidLayoutSubviews() { 56 super.viewDidLayoutSubviews() 57 mapView.frame = self.view.bounds 58 self.view.layoutIfNeeded() 59 } 60 61 62 63 // 指定された座標を表示する 64 func locate(location: CLLocation) { 65 // 地図の位置と縮尺を設定 66 let center = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) 67 mapView.region = YMKCoordinateRegionMake(center, YMKCoordinateSpanMake(0.002, 0.002)); 68 mapView.invalidateIntrinsicContentSize() 69 70 // MyAnnotationの初期化 71 // MyAnnotation* myAnnotation = [[MyAnnotation alloc] initWithLocationCoordinate:coordinate title:[[NSString alloc] initWithString:@"ミッドタウン"] subtitle:[[NSString alloc] initWithString:@"ミッドタウンです。"]];l 72 let myAnnotation = MyAnnotation.init(locationCoordinate: center, title: "ミッドタウン", subtitle: "ミッドタウンです", index: 1) 73 74 // AnnotationをYMKMapViewに追加 75 mapView.addAnnotation(myAnnotation) 76 77 // 地図上のマーカー表示用のアノテーション配列を作成 78 var annotations: [AnyObject] = [] 79 annotations.append(MyAnnotation(locationCoordinate: center, title: "bbb", subtitle: "aaa", index: 0)) 80 setAnnotations(annotations: annotations) 81 82 showPolyline() 83 } 84 85 86 87 func setAnnotations(annotations: [AnyObject]!) { 88 mapView.removeAnnotations(mapView.annotations) 89 90 if annotations != nil && annotations.count > 0 { 91 mapView.addAnnotations(annotations) 92 } 93 } 94 95 96 97 98 func mapView(_mapView: YMKMapView!, viewForAnnotation annotation: YMKAnnotation!) -> YMKAnnotationView! { 99 if annotation is MyAnnotation { 100 // マーカーのビューを引数のannotationを用いて作成する 101 let pin = YMKPinAnnotationView(annotation: annotation, reuseIdentifier: "Pin") 102 //アイコンイメージの変更 103 pin?.image = UIImage.init(named: "goal"); 104 pin?.animatesDrop = true 105 // アイコンのイメージのどこを基準点にするか設定 106 let centerOffset = CGPoint(x:15,y: 15); 107 pin?.centerOffset = centerOffset 108 return pin 109 } 110 return nil 111 } 112 113 114 115 // ルート案内をする 116 func navigate(startLocation: CLLocation, goalLocation: CLLocation, startTitle: String, goalTitle: String) { 117 let startPos = CLLocationCoordinate2DMake(startLocation.coordinate.latitude, startLocation.coordinate.longitude); 118 let goalPos = CLLocationCoordinate2DMake(goalLocation.coordinate.latitude, goalLocation.coordinate.longitude); 119 120 // YMKRouteOverlayを作成 121 let routeOverlay = YMKRouteOverlay.init(appid: "~") 122 //YMKRouteOverlayDelegateを設定 123 routeOverlay?.delegate = self 124 // 出発地ピンの吹き出し設定 125 routeOverlay?.setStartTitle(startTitle) 126 // 目的地ピンの吹き出し設定 127 routeOverlay?.setGoalTitle(goalTitle) 128 // 出発地、目的地、移動手段を設定 129 routeOverlay?.setRouteStartPos(startPos, withGoalPos: goalPos, withTraffic: TRAFFIC_WALK) 130 // ルートの検索 131 routeOverlay?.search() 132 } 133 134 135 136 137 func showPolyline() { 138 // YMKPolylineを作成 139 var coords: [CLLocationCoordinate2D] = [] 140 coords.append(CLLocationCoordinate2D.init(latitude: 35.6657214, longitude: 139.7310058)) 141 coords.append(CLLocationCoordinate2D.init(latitude: 35.670168, longitude: 139.702687)) 142 coords.append(CLLocationCoordinate2D.init(latitude: 35.683061, longitude: 139.702687)) 143 coords.append(CLLocationCoordinate2D.init(latitude: 35.690921, longitude: 139.700258)) 144 145 let line = YMKPolyline.init(coordinates: &coords, count: 4) 146 // YMKPolylineをYMKMapViewに追加 147 mapView.add(line) 148 } 149 150 151 152 153 // ルート検索が正常に終了した場合 154 func finishRouteSearch(_ routeOverlay: YMKRouteOverlay) { 155 // YMKRouteOverlayをYMKMapViewに追加 156 mapView.add(routeOverlay) 157 158 // // YMKNaviControllerを作成しYMKRouteOverlayインスタンスを設定 159 naviController = YMKNaviController.init(routeOverlay: routeOverlay) 160 // 161 // // YMKMapViewインスタンスを設定 162 naviController!.setMapView(mapView) 163 // 164 // // YMKNaviControllerDelegateを設定 165 naviController!.delegate = self 166 // 167 // // 案内処理を開始 168 naviController!.start() 169 } 170 171 172 173 // ルート検索が正常に終了しなかった場合 174 func errorRouteSearch(_ routeOverlay: YMKRouteOverlay!, withError error: Int32) { 175 let alert = UIAlertView.init(title: "エラー", message: "ルート検索エラー", delegate: self, cancelButtonTitle: "OK") 176 alert.show() 177 } 178 179 // overlay追加イベント 180 func mapView(_mapView: YMKMapView!, viewForOverlay overlay: YMKOverlay!) -> YMKOverlayView! { 181 print("mapView:viewForOverlay") 182 // 追加されたoverlayがYMKPolylineか確認 183 if overlay.isKind(of: YMKPolyline.self) { 184 let _: YMKPolyline = overlay as! YMKPolyline 185 //YMKPolylineViewを作成 186 let wkYMKPolylineView = YMKPolylineView.init(overlay: overlay) 187 //ラインの色を青に設定 188 wkYMKPolylineView?.strokeColor = UIColor.init(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) 189 wkYMKPolylineView?.fillColor = UIColor.init(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) 190 //ラインの太さ 191 wkYMKPolylineView?.lineWidth = 5 192 return wkYMKPolylineView; 193 } 194 195 // 追加されたoverlayがYMKRouteOverlayか確認 196 if overlay.isKind(of: YMKRouteOverlay.self) { 197 // YMKRouteOverlayViewを作成 198 let wkYMKOverlayView: YMKRouteOverlayView = YMKRouteOverlayView.init(routeOverlay: overlay as! YMKRouteOverlay) 199 // 出発地ピンを非表示 200 wkYMKOverlayView.startPinVisible = true 201 // 目的地ピンを非表示 202 wkYMKOverlayView.goalPinVisible = true 203 // 経由点ピンを非表示 204 wkYMKOverlayView.routePinVisible = true 205 return wkYMKOverlayView; 206 } 207 return nil; 208 } 209 210 // 現在位置更新された場合 211 func naviController(_ naviController: YMKNaviController!, didUpdate userLocation: YMKUserLocation!) { 212 print("naviController:didUpdateUserLocation") 213 } 214 215 // 現在位置取得エラーが発生した場合 216 func naviController(_naviController: YMKNaviController!, didFailToLocateUserWithError error: Error!) { 217 print("naviController:didFailToLocateUserWithError") 218 } 219 220 // 現在位置の精度が悪い場合 221 func naviControllerAccuracyBad(_ naviController: YMKNaviController!, didUpdate userLocation: YMKUserLocation!) { 222 print("naviControllerAccuracyBad") 223 } 224 225 // ルートから外れたと判断された場合 226 func naviControllerRouteOut(_ naviController: YMKNaviController!, didUpdate userLocation: YMKUserLocation!) { 227 print("naviControllerRouteOut") 228 } 229 230 // 目的地に到着した場合 231 func naviController(onGoal naviController: YMKNaviController!, didUpdate userLocation: YMKUserLocation!) { 232 print("naviControllerOnGoal") 233 // 案内処理を継続しない場合は停止させる 234 naviController.stop() 235 } 236} 237
av-👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/10/16 00:28

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

2017/10/16 05:21

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

2017/10/16 05:26

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

2017/10/16 06:33

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

回答1

0

ベストアンサー

スペースがありません。

func mapView(_mapView: YMKMapView!, ...

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

投稿2017/10/16 06:39

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bbb04

2017/10/16 06:48

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問