将多个标记移动到他们的居住位置

时间:2019-05-27 06:51:33

标签: ios swift

我正在构建一个必须移动多个标记的应用程序。这些标记将根据多个用户的居住位置显示在我的末端。我只能更新一个标记。但其余的都没有更新。我将这些数据存储在Firebase中,并且从那里获取它们的数据。

override func viewDidLoad() {
    super.viewDidLoad()

    Database.database().reference().child("users").observe(.childChanged, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]
        {
            self.hideHUD()

            self.latitudeFloatValue = (dictionary["lat"] as! Double)
            self.longitudeFloatValue = (dictionary["long"] as! Double)

            self.moveMent.delegate = self

            //set old coordinate
            self.oldCoordinate = CLLocationCoordinate2DMake(self.latitudeFloatValue, self.longitudeFloatValue)
            print(self.oldCoordinate)

            // Create a GMSCameraPosition that tells the map to display the marker
            let camera = GMSCameraPosition.camera(withLatitude: self.latitudeFloatValue, longitude: self.longitudeFloatValue , zoom: 14)
            self.mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
            self.mapView.isMyLocationEnabled = true
            self.mapView.delegate = self
            self.view = self.mapView

            // Creates a marker in the center of the map.
            self.driverMarker = GMSMarker()
            self.driverMarker.position = self.oldCoordinate!
            self.driverMarker.icon = UIImage(named: "car")
            self.driverMarker.map = self.mapView

            self.copyCordinates = self.cordinates
            print(self.copyCordinates)
            print(self.cordinates)

            self.cordinates = ["lattitude":self.latitudeFloatValue,"longitude":self.longitudeFloatValue]
            print("self.cordinates",self.cordinates)
            print(self.oldCordinates)
            print(self.newCordinates)

            if(self.oldCordinates["lattitude"] == nil)
            {
                self.oldCordinates = self.cordinates
                self.newCordinates = self.cordinates
            }
            self.newCordinates = self.cordinates
            self.oldCordinates = self.copyCordinates

            print("oldCordinates",self.oldCordinates)
            print("newCordinates",self.newCordinates)

            self.movinfMarker()
        }
    }, withCancel: nil)

    //for use in background
    self.locman.requestAlwaysAuthorization()

    locman.requestWhenInUseAuthorization()

    if (CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse || CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways){
        guard let currentLocation = locman.location else {
            return
        }
        stringLatitude = currentLocation.coordinate.latitude
        stringLongitude = currentLocation.coordinate.longitude
        print(currentLocation.coordinate.latitude)
        print(currentLocation.coordinate.longitude)
    }

    // Create a GMSCameraPosition that tells the map to display the marker
    let camera = GMSCameraPosition.camera(withLatitude: stringLatitude, longitude: stringLongitude , zoom: 7)
    self.mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
    self.mapView.isMyLocationEnabled = true
    self.mapView.delegate = self
    self.view = self.mapView

    Database.database().reference().child("users").observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject]
        {
            self.latitudeFloatValue = (dictionary["lat"] as! Double)
            self.longitudeFloatValue = (dictionary["long"] as! Double)
            self.titleMarker = (dictionary["username"] as! String)
            self.uuidValue = (dictionary["uuid"] as! String)

            self.states = [
                State(name: self.titleMarker, uuid: self.uuidValue, long: self.longitudeFloatValue, lat: self.latitudeFloatValue),
                ]
        }
        for state in self.states {
            // Creates a marker in the center of the map.
            let state_marker = GMSMarker()
            state_marker.position = CLLocationCoordinate2D(latitude: state.lat, longitude: state.long)
            state_marker.icon = UIImage(named: "car")
            state_marker.title = state.name
            state_marker.userData = state.uuid//zIndex = Int32(state.uuid)!
            state_marker.snippet = "Hey, this is \(state.name)"
            state_marker.map = self.mapView
            self.markerDict[state.name] = state_marker
        }
    }, withCancel: nil)
}



func movinfMarker(){

    driverMarker.map = nil

    let oldCoodinate: CLLocationCoordinate2D? = CLLocationCoordinate2D(latitude: self.oldCordinates["lattitude"] ?? 0.0 , longitude: self.oldCordinates["longitude"] ?? 0.0)
    let newCoodinate: CLLocationCoordinate2D? = CLLocationCoordinate2D(latitude: self.newCordinates["lattitude"] ?? 0.0 , longitude: self.newCordinates["longitude"] ?? 0.0)

    print("oldCordinatesNewWala",oldCoodinate as Any)
    print("newCordinatesNewWala",newCoodinate as Any)

    driverMarker.icon = UIImage(named: "car")
    mapView.camera = GMSCameraPosition.camera(withTarget: newCoodinate!, zoom: 17)

    driverMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
    driverMarker.position = oldCoodinate ?? CLLocationCoordinate2D(latitude: 0.0,longitude: 0.0)
    //this can be old position to make car movement to new position
    driverMarker.map = mapView
    //marker movement animation
    CATransaction.begin()
    CATransaction.setValue(Int(2.0), forKey: kCATransactionAnimationDuration)
    CATransaction.setCompletionBlock({() -> Void in
        self.driverMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
        //New bearing value from backend after car movement is done
    })
    driverMarker.position = newCoodinate ?? CLLocationCoordinate2D(latitude: 0.0,longitude: 0.0)
    //this can be new position after car moved from old position to new position with animation
    driverMarker.map = mapView
    driverMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
    //found bearing value by calculation
    CATransaction.commit()
}

0 个答案:

没有答案