google maps маршрут между 2 точками с несколькими путевыми точками swift ios - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть этот код, но по какой-то причине он просто рисует маршрут между 2 точками (первой и последней), игнорируя все остальные точки, что составляет [index == 1 to index == n-1]

вывод: маршрут между только 2 маркерами

ожидаемый результат: маршрут между всеми маркерами (5 маркеров)

Кто-нибудь знает, что не так с моим кодом?

 func getDotsToDrawRoute(positions : [CLLocationCoordinate2D], completion: @escaping(_ path : GMSPath) -> Void) {
    if positions.count > 1 {
        let origin = positions.first
        let destination = positions.last
        var wayPoints = ""
        for point in positions {
            wayPoints = wayPoints.characters.count == 0 ? "\(point.latitude),\(point.longitude)" : "\(wayPoints)|\(point.latitude),\(point.longitude)"
        }
        print("this is fullPath :: \(wayPoints)")
        let request = "https://maps.googleapis.com/maps/api/directions/json"
        let parameters : [String : String] = ["origin" : "\(origin!.latitude),\(origin!.longitude)", "destination" : "\(destination!.latitude),\(destination!.longitude)", "wayPoints" : wayPoints, "stopover": "true", "key" : kyes.google_map]
        Alamofire.request(request, method:.get, parameters : parameters).responseJSON(completionHandler: { response in
            guard let dictionary = response.result.value as? [String : AnyObject]
                else {
                    return
            }
            print ("route iss ::: \(dictionary["routes"])")
            if let routes = dictionary["routes"] as? [[String : AnyObject]] {
                if routes.count > 0 {
                    var first = routes.first
                    if let legs = first!["legs"] as? [[String : AnyObject]] {
                        let fullPath : GMSMutablePath = GMSMutablePath()
                        for leg in legs {
                            if let steps = leg["steps"] as? [[String : AnyObject]] {
                                for step in steps {
                                    if let polyline = step["polyline"] as? [String : AnyObject] {
                                        if let points = polyline["points"] as? String {
                                            fullPath.appendPath(path: GMSMutablePath(fromEncodedPath: points))
                                        }
                                    }
                                }

                                let polyline = GMSPolyline.init(path: fullPath)

                                polyline.path = fullPath
                                polyline.strokeWidth = 4.0
                                polyline.map = self._map                                }
                        }
                    }
                }
            }
        })
    }
}

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

попробуйте с:

    func getPolylineRoute(from source: CLLocationCoordinate2D, to destination: CLLocationCoordinate2D){
        self.mapView.clear()
        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=YOUR_API_KEY")! 
        let task = session.dataTask(with: url, completionHandler: {
            (data, response, error) in
            if error != nil {
                print("Error" + error!.localizedDescription)
            }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 {
                            return
                        }
                        print(routes)
                        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!)

                            let distancia = overview_polyline?["legs"] as? NSArray
                            let prueba = distancia![0] as? NSDictionary
                            let distancia2 = prueba?["distance"] as? NSDictionary
                            let control = distancia2?.object(forKey: "text") as! String

                            DispatchQueue.main.async {
                                let bounds = GMSCoordinateBounds(coordinate: source, coordinate: destination)
                                let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(170, 30, 30, 30))
                                self.mapView!.moveCamera(update)
                            }
                        }
                    }
                }
                catch {
                    print("error in JSONSerialization")

                }
            }
        })
        task.resume()
    }

Вы вызываете метод с помощью

self.getPolylineRoute(from: origin, to: destination)

Не забудьте в URL-адресе Google поставить ключ API там, где написано YOUR_API_KEY

0 голосов
/ 05 ноября 2018

Проверьте, что это решение отлично работает со мной

    func drawpath(positions: [CLLocationCoordinate2D]) {

    let origin = positions.first!
    let destination = positions.last!
    var wayPoints = ""
    for point in positions {
        wayPoints = wayPoints.characters.count == 0 ? "\(point.latitude),\(point.longitude)" : "\(wayPoints)%7C\(point.latitude),\(point.longitude)"
    }

    let url = "https://maps.googleapis.com/maps/api/directions/json?origin=\(origin!.latitude),\(origin!.longitude)&destination=\(destination.latitude),\(destination.longitude)&mode=driving&waypoints=\(wayPoints)&key=KEY"
    Alamofire.request(url).responseJSON { response in

        print(response.request as Any)  // original URL request
        print(response.response as Any) // HTTP URL response
        print(response.data as Any)     // server data
        print(response.result as Any)   // result of response serialization

        let json = try!  JSON(data: response.data!)
        let routes = json["routes"][0]["overview_polyline"]["points"].stringValue

        let path = GMSPath.init(fromEncodedPath: routes)
        let polyline = GMSPolyline.init(path: path)
        polyline.strokeWidth = 4
        polyline.strokeColor = UIColor.red
        polyline.map = self._map
    }


}
...