作業中のアプリにルーティング機能を追加しようとしています。かなりうまく機能する線を描く方法に関するCraigSpitzkoffの記事を見つけました。MKMapView
しかし、道路上のポイントの座標がわからないため、期待どおりに役立ちません。現在の位置と別の住所など、特定のポイント間の座標を決定する方法はありますか?
2 に答える
基本的に、 GoogleDirectionsAPIに対してHTTPリクエストを行う必要があります。利用規約では、結果をGoogleマップに表示する必要があると規定されていますが、MKMapViewを使用しているため、問題はないと思います。
Directions APIは、Googleマップに結果を表示する場合にのみ使用できます。道順データが要求された地図を表示せずに道順データを使用することは禁止されています。
URLで渡す必要のあるパラメータの詳細については、ルートリクエストを確認してください。
http://maps.google.com/maps/api/directions/output?parameters
返されるデータは、要求した内容(出力)に応じてJSONまたはXMLになるため、方向を説明する一連のポイントを取得するには、それを解析する必要があります。
これは古い質問ですが、最近はMapKitを使用することもできますMKDirections
。たとえば、いくつかを検索しsearchString
てから、マップビューの最初のヒットへの道順を追加するルーチンは次のとおりです。
let request = MKLocalSearch.Request()
request.region = mapView.region
request.naturalLanguageQuery = searchString
let search = MKLocalSearch(request: request)
search.start { response, _ in
guard let mapItem = response?.mapItems.first else { return }
let request = MKDirections.Request()
request.source = MKMapItem.forCurrentLocation()
request.destination = mapItem
let directions = MKDirections(request: request)
directions.calculate { response, error in
guard let routes = response?.routes else { return }
let overlays = routes.map { $0.polyline }
self.mapView.addOverlays(overlays)
}
}
これがマップ上に確実にレンダリングされるようにするには、マップビューのdelegate
プロパティを(IBまたはプログラムで)設定してから、次を実装する必要がありmapView(_:rendererFor:)
ます。
extension MapViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = .init(red: 0, green: 0, blue: 1, alpha: 0.7)
return renderer
}
}