【问题标题】:Update polyline as user moves用户移动时更新折线
【发布时间】:2018-09-19 04:06:58
【问题描述】:

我正在使用 GoogleMaps 绘制路线。我想要做的是当用户在该路线上旅行时删除已经旅行的线路(就像优步一样)。我想我们可以通过从折线上移除点并重新绘制它来做到这一点。这是正确的方法吗?

我如何知道这些点已经经过并且需要更新路径?

【问题讨论】:

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


    【解决方案1】:

    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) 创建在谷歌地图上绘制和更新折线的方法

     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")
            }
        }
    }
    

    这是我的现场项目

    我希望这对每个人都有效

    【讨论】:

    • 我猜你把我的问题解释错了。我可以绘制路线,但我想要的是当用户在该路线上移动时,我想要像 uber 那样,删除已经走过的路线部分。
    • 在您的情况下,将多次调用 api 来绘制可能成为我项目开销的路线。
    • @ParthAdroja 你找到更好的方法了吗?
    • @saibbyweb 尚未寻找替代方法。
    • 我自己处于两难境地,是否应该多次调用Directions API:|
    猜你喜欢
    • 2013-06-06
    • 2021-05-24
    • 2021-06-03
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多