Swift iOS google Map, path to coordinate

天大地大妈咪最大 提交于 2019-11-27 13:50:11

Unlike Apple's MapKit, the Google Maps SDK for iOS does not natively include a way to perform route calculations.

Instead, you need to use the Google Directions API: https://developers.google.com/maps/documentation/directions/. It is an HTTP-only API, and Google does not provide any SDK as of today, but you can easily write your own wrapper yourself, or choose one of the many options available on Github:

So i recently just solved this issue, here is my Swift 3 implementation using the latest version of Alamofire (4.3)

 func fetchMapData() { 

    let directionURL = "https://maps.googleapis.com/maps/api/directions/json?" +
        "origin=\(originAddressLat),\(originAddressLng)&destination=\(destinationAddressLat),\(destinationAddressLong)&" +
    "key=YOUROWNSERVERKEY"



    Alamofire.request(directionURL).responseJSON
        { response in

            if let JSON = response.result.value {

                let mapResponse: [String: AnyObject] = JSON as! [String : AnyObject]

                let routesArray = (mapResponse["routes"] as? Array) ?? []

                let routes = (routesArray.first as? Dictionary<String, AnyObject>) ?? [:]

                let overviewPolyline = (routes["overview_polyline"] as? Dictionary<String,AnyObject>) ?? [:]
                let polypoints = (overviewPolyline["points"] as? String) ?? ""
                let line  = polypoints

                self.addPolyLine(encodedString: line)
        }
    }

}

func addPolyLine(encodedString: String) {

    let path = GMSMutablePath(fromEncodedPath: encodedString)
    let polyline = GMSPolyline(path: path)
    polyline.strokeWidth = 5
    polyline.strokeColor = .blue
    polyline.map = whateverYourMapViewObjectIsCalled

}

Disclaimer:Swift 2

 func addOverlayToMapView(){

        let directionURL = "https://maps.googleapis.com/maps/api/directions/json?origin=\(srcLocation.coordinate.latitude),\(srcLocation.coordinate.longitude)&destination=\(destLocation.coordinate.latitude),\(destLocation.coordinate.longitude)&key=Your Server Key"

        Alamofire.request(.GET, directionURL, parameters: nil).responseJSON { response in

            switch response.result {

            case .Success(let data):

                let json = JSON(data)
                print(json)

                let errornum = json["error"]


                if (errornum == true){



                }else{
                    let routes = json["routes"].array

                    if routes != nil{

                        let overViewPolyLine = routes![0]["overview_polyline"]["points"].string
                        print(overViewPolyLine)
                        if overViewPolyLine != nil{

                         self.addPolyLineWithEncodedStringInMap(overViewPolyLine!)

                        }

                    }


                }

            case .Failure(let error):

                print("Request failed with error: \(error)")

            }
        }

    }

Using the points, we now create the Path from two points using fromEncodedPath

  func addPolyLineWithEncodedStringInMap(encodedString: String) {

        let path = GMSMutablePath(fromEncodedPath: encodedString)
        let polyLine = GMSPolyline(path: path)
        polyLine.strokeWidth = 5
        polyLine.strokeColor = UIColor.yellowColor()
        polyLine.map = mapView

    }
Pravin Kamble

Its Very Simple if you added a Google map SDK in your iOS Project and if you want to implement get google map direction lines between two different directions i have made as demo code in simple way understand using swift 2.3 try it, modify it and use it.!!!

Note: Dont Forgot to change your lat long you want and API Key (You may Use API key with None Restrictions on Google API Manager Credential Section)

 func callWebService(){

        let url = NSURL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(18.5235),\(73.7184)&destination=\(18.7603),\(73.8630)&key=AIzaSyDxSgGQX6jrn4iq6dyIWAKEOTneZ3Z8PtU")
        let request = NSURLRequest(URL: url!)
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config)

        let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in

            // notice that I can omit the types of data, response and error
            do{
                if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary {

                    //print(jsonResult)

                    let routes = jsonResult.valueForKey("routes")
                    //print(routes)

                    let overViewPolyLine = routes![0]["overview_polyline"]!!["points"] as! String
                    print(overViewPolyLine)

                    if overViewPolyLine != ""{

                        //Call on Main Thread
                        dispatch_async(dispatch_get_main_queue()) {

                            self.addPolyLineWithEncodedStringInMap(overViewPolyLine)
                        }


                    }

                }
            }
            catch{

                print("Somthing wrong")
            }
        });

        // do whatever you need with the task e.g. run
        task.resume()
    }

    func addPolyLineWithEncodedStringInMap(encodedString: String) {


        let camera = GMSCameraPosition.cameraWithLatitude(18.5204, longitude: 73.8567, zoom: 10.0)
        let mapView = GMSMapView.mapWithFrame(CGRect.zero, camera: camera)
        mapView.myLocationEnabled = true

        let path = GMSMutablePath(fromEncodedPath: encodedString)
        let polyLine = GMSPolyline(path: path)
        polyLine.strokeWidth = 5
        polyLine.strokeColor = UIColor.yellowColor()
        polyLine.map = mapView

        let smarker = GMSMarker()
        smarker.position = CLLocationCoordinate2D(latitude: 18.5235, longitude: 73.7184)
        smarker.title = "Lavale"
        smarker.snippet = "Maharshtra"
        smarker.map = mapView

        let dmarker = GMSMarker()
        dmarker.position = CLLocationCoordinate2D(latitude: 18.7603, longitude: 73.8630)
        dmarker.title = "Chakan"
        dmarker.snippet = "Maharshtra"
        dmarker.map = mapView

        view = mapView

    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!