用户移动时更新折线

时间:2018-04-09 17:21:14

标签: ios swift google-maps google-maps-api-3

我正在使用GoogleMaps绘制路线。我想要做的是当用户在该路线上行驶时移除已经行进的线路(如Uber所做的那样)。我想我们可以通过从折线中删除点并重绘它来做到这一点。这是正确的做法吗?

我怎么知道这些点已经走过并且需要更新路径?

1 个答案:

答案 0 :(得分:0)

1)创建全局变量

var demoPolyline = GMSPolyline()
var demoPolylineOLD = GMSPolyline()
// Set Destination Location Cordinates
var destinationLocation = CLLocation(latitude: 23.072837, longitude: 72.516455)

2)使用CLLocationManagerDelegate方法更新当前位置

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     let location: CLLocation = locations.last!

     let originalLoc: String = "\(location.coordinate.latitude),\(location.coordinate.longitude)"
     let destiantionLoc: String = "\(destinationLocation.coordinate.latitude),\(destinationLocation.coordinate.longitude)"

     let latitudeDiff: Double = Double(location.coordinate.latitude) - Double(destinationLocation.coordinate.latitude)
     let longitudeDiff: Double = Double(location.coordinate.longitude) - Double(destinationLocation.coordinate.longitude)

     let waypointLatitude = location.coordinate.latitude - latitudeDiff
     let waypointLongitude = location.coordinate.longitude - longitudeDiff

     getDirectionsChangedPolyLine(origin: originalLoc, destination: destiantionLoc, waypoints: ["\(waypointLatitude),\(waypointLongitude)"], travelMode: nil, completionHandler: nil)
}

3)创建方法在Google地图上绘制和更新折线

 func getDirectionsChangedPolyLine(origin: String!, destination: String!, waypoints: Array<String>!, travelMode: AnyObject!, completionHandler: ((_ status:   String, _ success: Bool) -> Void)?)
{

    DispatchQueue.main.asyncAfter(deadline: .now()) {

        if let originLocation = origin {
            if let destinationLocation = destination {
                var directionsURLString = "https://maps.googleapis.com/maps/api/directions/json?" + "origin=" + originLocation + "&destination=" + destinationLocation
                if let routeWaypoints = waypoints {
                    directionsURLString += "&waypoints=optimize:true"

                    for waypoint in routeWaypoints {
                        directionsURLString += "|" + waypoint
                    }
                }

                directionsURLString = directionsURLString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!

                let directionsURL = NSURL(string: directionsURLString)
                DispatchQueue.main.async( execute: { () -> Void in
                    let directionsData = NSData(contentsOf: directionsURL! as URL)
                    do{
                        let dictionary: Dictionary<String, AnyObject> = try JSONSerialization.jsonObject(with: directionsData! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary<String, AnyObject>

                        let status = dictionary["status"] as! String
                        if status == "OK" {

                            self.selectedRoute = (dictionary["routes"] as! Array<Dictionary<String, AnyObject>>)[0]
                            self.overviewPolyline = self.selectedRoute["overview_polyline"] as! Dictionary<String, AnyObject>

                            let route = self.overviewPolyline["points"] as! String
                            let path: GMSPath = GMSPath(fromEncodedPath: route)!

                            self.demoPolylineOLD = self.demoPolyline
                            self.demoPolylineOLD.strokeColor = UIColor.blue
                            self.demoPolylineOLD.strokeWidth = 3.0
                            self.demoPolylineOLD.map = self.mapView
                            self.demoPolyline.map = nil

                            self.demoPolyline = GMSPolyline(path: path)
                            self.demoPolyline.map = self.mapView
                            self.demoPolyline.strokeColor = UIColor.blue
                            self.demoPolyline.strokeWidth = 3.0
                            self.demoPolylineOLD.map = nil


                        } else {

                            self.getDirectionsChangedPolyLine(origin: origin, destination: destination, waypoints: waypoints, travelMode: travelMode, completionHandler: completionHandler)
                        }
                    } catch {

                        self.getDirectionsChangedPolyLine(origin: origin, destination: destination, waypoints: waypoints, travelMode: travelMode, completionHandler: completionHandler)
                    }
                })
            } else {

                print("Destination Location Not Found")
            }
        } else {

            print("Origin Location Not Found")
        }
    }
}

这适用于我的实时项目

我希望这对每个人都有用