Как очистить полилинию, когда пользователь идет по дороге (полилиния) - PullRequest
1 голос
/ 24 февраля 2020

Я новичок в технологии карт. Я использую Google API для данных json, чтобы выбрать маршруты на карте с помощью полилинии. Мне нужна помощь в отношении полилинии. Я хочу очистить путь полилинии в соответствии с проездами пользователей по маршруту. Я пытался найти много решений, но не смог работать для меня. Я приложил изображение для того же ... Screenshot of the path

Функция рисования ломаной линии ---

 func drawPath(from polyStr: String){
        print("inside Drawpath")
        path = GMSPath(fromEncodedPath: polyStr)!
        let polyline = GMSPolyline(path: path)

        polyline.strokeWidth = 6
        polyline.map = myMapView // Google MapView
        polyline.strokeColor = UIColor(red: 0, green: 128/255, blue: 1, alpha: 1)

        //   let camera = GMSCameraUpdate.fit(GMSCoordinateBounds(coordinate: CLLocationCoordinate2D(latitude: Double(lat), longitude: Double(long)), coordinate: CLLocationCoordinate2D(latitude: Double(directionlat)!, longitude: Double(directionlat)!)))
        let cameraUpdate = GMSCameraUpdate.fit(GMSCoordinateBounds(coordinate: CLLocationCoordinate2D(latitude: Double(lat), longitude: Double(long)), coordinate: CLLocationCoordinate2D(latitude: Double(directionlat)!, longitude: Double(directionlat)!)))


    //    self.timer = Timer.scheduledTimer(timeInterval: 0.003, target: self, selector: #selector(animatePolylinePath), userInfo: nil, repeats: true)


        //myMapView.moveCamera(cameraUpdate)
        let currentZoom = myMapView.camera.zoom
      //  myMapView.animate(toZoom: currentZoom - 1.4)
    }

Любая помощь приветствуется. Спасибо и всего наилучшего

1 Ответ

2 голосов
/ 03 марта 2020

Я столкнулся с той же проблемой и нашел решение, которое отлично работает в моих текущих 2 проектах. Итак, позвольте мне поделиться своей идеей здесь. во-первых, получите начальную строку polypathString из API направления. Теперь вы можете получить количество точек в пути, используя объект GMSPath и комбинируя его с методом CLLocation.distance. Я попытался выяснить, находится ли драйвер в пути.

If he is found on the path 
I take the index from array in which the driver is close and start drawing from there 
else 
I request to fetch an another direction API since he is not the path drawing it is not right.

let polyPath = GMSPath.init(fromEncodedPath: pathStr)!


func isPathChanged(byDriver coordinate : CLLocation) -> Bool{
            guard self.path.count() != 0 else{return true}

            for range in 0..<path.count(){
                let point = path.coordinate(at: range).location//CLLocation
                if point.distance(from: coordinate) < 75{
                    self.driversPositiionAtPath = range
                    return false
                }
            }
            self.driversPositiionAtPath = 0
            return true
        }

не просто делают волшебный c трюк Примечание: Я поддерживаю переменную для сохранения позиции водителя на полилинии driversPositiionAtPath

if isPathChanged(byDriver : driversLocation){
     self.wsToFetchNewPathFromDirection()
}else{
     self.drawRoute(for : polyPath )
}
func drawRoute(for path : GMSPath){
        let drawingPath = GMSMutablePath()

        for i in self.driversPositiionAtPath..<path.count(){
            drawingPath.add(path.coordinate(at: i))
        }
        self.polyline.path = drawingPath
        self.polyline.strokeColor = UIColor.black
        self.polyline.strokeWidth = 3.0
        self.polyline.map = mapLocation
    }

Проверьте, находится ли водитель на пути или нет, когда он двигается или каждые 10 секунд. Удачной кодировки!

...