This tutorial shows, in a Swift app, how we can use MapKit’s free direction service MKDirections, to get a route between two coordinates and show the resulting route on a Google Map, GMSMapView.
First, get this file, and save it within your project as Polyline.swift. This will be used to create Polyline from coordinates:
https://github.com/raphaelmor/Polyline/blob/master/Sources/Polyline/Polyline.swift
Second, use the two coordinates and pin markers on the points.
import UIKit import GoogleMaps import MapKit func setMapMarkersRoute(vLoc: CLLocationCoordinate2D, toLoc: CLLocationCoordinate2D) { //add the markers for the 2 locations let markerTo = GMSMarker.init(position: toLoc) markerTo.map = mapView let vMarker = GMSMarker.init(position: vLoc) vMarker.map = mapView //zoom the map to show the desired area var bounds = GMSCoordinateBounds() bounds = bounds.includingCoordinate(vLoc) bounds = bounds.includingCoordinate(toLoc) self.mapView.moveCamera(GMSCameraUpdate.fit(bounds)) //finally get the route getRoute(from: vLoc, to: toLoc) }
Third, the function to get the directions using MKDirections
func getRoute(from: CLLocationCoordinate2D, to: CLLocationCoordinate2D) { let source = MKMapItem(placemark: MKPlacemark(coordinate: from)) let destination = MKMapItem(placemark: MKPlacemark(coordinate: to)) let request = MKDirections.Request() request.source = source request.destination = destination request.requestsAlternateRoutes = false let directions = MKDirections(request: request) directions.calculate(completionHandler: { (response, error) in if let res = response { //the function to convert the result and show self.show(polyline: self.googlePolylines(from: res)) } }) }
Fourth, converting the result from MKDirections, to GMSPolyline, that can be used with GMSMapView
private func googlePolylines(from response: MKDirections.Response) -> GMSPolyline { let route = response.routes[0] var coordinates = [CLLocationCoordinate2D]( repeating: kCLLocationCoordinate2DInvalid, count: route.polyline.pointCount) route.polyline.getCoordinates( &coordinates, range: NSRange(location: 0, length: route.polyline.pointCount)) let polyline = Polyline(coordinates: coordinates) let encodedPolyline: String = polyline.encodedPolyline let path = GMSPath(fromEncodedPath: encodedPolyline) return GMSPolyline(path: path) }
Fifth, finally show it on the GMSMapView
func show(polyline: GMSPolyline) { //add style to polyline polyline.strokeColor = UIColor.red polyline.strokeWidth = 3 //add to map polyline.map = mapView }
Make sure you have created an outlet to the GMSMapView.
Hope this helps. If you need assistance, feel free to leave a comment!
Leave A Comment