Search code examples
iosswiftgoogle-maps-api-3google-maps-markersgoogle-polyline

PolyLines not showing in google maps


I want show path between destination and source on google map. I am google direction api's getting route between of co-ordinates , I am getting response and set on google map but not showing on map . My code is

func getPolylineRoute(from source: CLLocationCoordinate2D, to destination: CLLocationCoordinate2D){

    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    let url = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(source.latitude),\(source.longitude)&destination=\(destination.latitude),\(destination.longitude)&sensor=true&mode=driving&key=AIzaSyAyU5txJ86b25-_l0DW-IldSKGGYqQJn3M")!

    let task = session.dataTask(with: url, completionHandler: {
        (data, response, error) in

        DispatchQueue.main.async {

            if error != nil {
                print(error!.localizedDescription)
                AppManager.dissmissHud()
            }
            else {
                do {
                    if let json : [String:Any] = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]{

                        guard let routes = json["routes"] as? NSArray else {
                            DispatchQueue.main.async {
                                AppManager.dissmissHud()
                            }
                            return
                        }

                        if (routes.count > 0) {
                            let overview_polyline = routes[0] as? NSDictionary
                            let dictPolyline = overview_polyline?["overview_polyline"] as? NSDictionary

                            let points = dictPolyline?.object(forKey: "points") as? String

                            self.showPath(polyStr: points!)

                            DispatchQueue.main.async {
                                AppManager.dissmissHud()

                                let bounds = GMSCoordinateBounds(coordinate: source, coordinate: destination)
                                let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(75, 20, 20, 20))
                                self.vwMap!.moveCamera(update)
                            }
                        }
                        else {
                            DispatchQueue.main.async {
                                AppManager.dissmissHud()
                            }
                        }
                    }
                }
                catch {
                    print("error in JSONSerialization")
                    DispatchQueue.main.async {
                        AppManager.dissmissHud()
                    }
                }
            }
        }
    })
    task.resume()
}


func drawPlyLineOnMap()  {

    let source : CLLocationCoordinate2D  =  CLLocationCoordinate2DMake(Double((model?.fromAddressLatitude)!), Double((model?.fromAddressLongtitude)!))
    let destination : CLLocationCoordinate2D  =  CLLocationCoordinate2DMake(Double((model?.toAddressLatitude)!), Double((model?.toAddressLongtitude)!))

    self.vwMap.clear()
    //Source pin
    let marker = GMSMarker()
    let markerImage = UIImage(named: "from_pin")!.withRenderingMode(.alwaysOriginal)
    let markerView = UIImageView(image: markerImage)
    marker.position = source
    marker.iconView = markerView
    //marker.userData = dict
    marker.map = vwMap

    //Destination pin
    let markerTo = GMSMarker()
    let markerImageTo = UIImage(named: "to_red_pin")!.withRenderingMode(.alwaysOriginal)
    let markerViewTo = UIImageView(image: markerImageTo)
    markerTo.position = destination
    // marker.userData = dict
    markerTo.iconView = markerViewTo
    markerTo.map = vwMap

    var arrAdTemp:[AddressTableModel] = []
    arrAdTemp.append(contentsOf: arrAddresses)
    arrAdTemp.removeLast()
    arrAdTemp.removeFirst()
    for obj in arrAdTemp {
        print(obj.strLatitude)
        print(obj.strLongtitude)
        let stopOver : CLLocationCoordinate2D  =  CLLocationCoordinate2DMake(obj.strLatitude, obj.strLongtitude)
        let markerStop = GMSMarker()
        let markerImageStop = UIImage(named: "to_red_pin")!.withRenderingMode(.alwaysOriginal)
        let markerViewStop = UIImageView(image: markerImageStop)
        markerStop.position = stopOver
        //marker.userData = dict
        markerStop.iconView = markerViewStop
        markerStop.map = vwMap
    }

    self.getPolylineRoute(from: source, to: destination)
}

func showPath(polyStr :String){
    let path = GMSPath(fromEncodedPath: polyStr)
    let polyline = GMSPolyline(path: path)
    polyline.strokeWidth = 3.0
    polyline.strokeColor = UIColor.black
    polyline.map = vwMap // Your map view
}

I have tried lot of answer give below but not working for me. Please help me.

  1. 1st answer tried
  2. 2nd answer tried
  3. 3rd answer tried

Solution

  • you are setting wrong bounds so it is not showing on your map . I have tried your code it is working fine . Please change your bounds area as (0,0,0,0)

     func getPolylineRoute(from source: CLLocationCoordinate2D, to destination: CLLocationCoordinate2D){
    
            let config = URLSessionConfiguration.default
            let session = URLSession(configuration: config)
    
            let url = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(source.latitude),\(source.longitude)&destination=\(destination.latitude),\(destination.longitude)&sensor=true&mode=driving&key=AIzaSyAyU5txJ86b25-_l0DW-IldSKGGYqQJn3M")!
    
            let task = session.dataTask(with: url, completionHandler: {
                (data, response, error) in
    
                DispatchQueue.main.async {
    
                    if error != nil {
                        print(error!.localizedDescription)
                        AppManager.dissmissHud()
                    }
                    else {
                        do {
                            if let json : [String:Any] = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]{
    
                                guard let routes = json["routes"] as? NSArray else {
                                    DispatchQueue.main.async {
                                        AppManager.dissmissHud()
                                    }
                                    return
                                }
    
                                if (routes.count > 0) {
                                    let overview_polyline = routes[0] as? NSDictionary
                                    let dictPolyline = overview_polyline?["overview_polyline"] as? NSDictionary
    
                                    let points = dictPolyline?.object(forKey: "points") as? String
    
                                    self.showPath(polyStr: points!)
    
                                    DispatchQueue.main.async {
                                        AppManager.dissmissHud()
    
                                        let bounds = GMSCoordinateBounds(coordinate: source, coordinate: destination)
    //below bounds change as 0 check it on full screen
                                        let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(0, 0, 0, 0))
                                        self.vwMap!.moveCamera(update)
                                    }
                                }
                                else {
                                    DispatchQueue.main.async {
                                        AppManager.dissmissHud()
                                    }
                                }
                            }
                        }
                        catch {
                            print("error in JSONSerialization")
                            DispatchQueue.main.async {
                                AppManager.dissmissHud()
                            }
                        }
                    }
                }
            })
            task.resume()
        }