Move GMSMarker on Google Map Like UBER

前端 未结 1 712
时光说笑
时光说笑 2020-12-09 00:13

I am developing some navigation tasks on google map. I have to move markers as vehicles moves with turns as uber does in their app. I have tried different solutions as offer

相关标签:
1条回答
  • 2020-12-09 01:11

    Some how working with this code. You can try with this code with some logics change. But, it will work fine.

    CLLocationCoordinate2D oldCoodinate = CLLocationCoordinate2DMake([[data valueForKey:@"lat"]doubleValue],[[data valueForKey:@"lng"]doubleValue]);
    CLLocationCoordinate2D newCoodinate = CLLocationCoordinate2DMake([[data valueForKey:@"lat"]doubleValue],[[data valueForKey:@"lng"]doubleValue]);
    
    driverMarker.groundAnchor = CGPointMake(0.5, 0.5);
    driverMarker.rotation = [self getHeadingForDirectionFromCoordinate:oldCoodinate toCoordinate:newCoodinate]; //found bearing value by calculation when marker add
    driverMarker.position = oldCoodinate; //this can be old position to make car movement to new position
    driverMarker.map = mapView_;
    
    //marker movement animation
    [CATransaction begin];
    [CATransaction setValue:[NSNumber numberWithFloat:2.0] forKey:kCATransactionAnimationDuration];
    [CATransaction setCompletionBlock:^{
        driverMarker.groundAnchor = CGPointMake(0.5, 0.5);
        driverMarker.rotation = [[data valueForKey:@"bearing"] doubleValue]; //New bearing value from backend after car movement is done
    }];
    
    driverMarker.position = newCoodinate; //this can be new position after car moved from old position to new position with animation
    driverMarker.map = mapView_;
    driverMarker.groundAnchor = CGPointMake(0.5, 0.5);
    driverMarker.rotation = [self getHeadingForDirectionFromCoordinate:oldCoodinate toCoordinate:newCoodinate]; //found bearing value by calculation
    [CATransaction commit];
    

    define these two in .h file

    #define degreesToRadians(x) (M_PI * x / 180.0)
    #define radiansToDegrees(x) (x * 180.0 / M_PI)
    

    method for get bearing value from old and new coordinates

    - (float)getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc
    {
        float fLat = degreesToRadians(fromLoc.latitude);
        float fLng = degreesToRadians(fromLoc.longitude);
        float tLat = degreesToRadians(toLoc.latitude);
        float tLng = degreesToRadians(toLoc.longitude);
    
        float degree = radiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng)));
    
        if (degree >= 0) {
            return degree;
        } else {
            return 360+degree;
        }
    }
    

    Swift 3.1

         var oldCoodinate: CLLocationCoordinate2D? = CLLocationCoordinate2DMake(CDouble((data.value(forKey: "lat") as? CLLocationCoordinate2D)), CDouble((data.value(forKey: "lng") as? CLLocationCoordinate2D)))
            var newCoodinate: CLLocationCoordinate2D? = CLLocationCoordinate2DMake(CDouble((data.value(forKey: "lat") as? CLLocationCoordinate2D)), CDouble((data.value(forKey: "lng") as? CLLocationCoordinate2D)))
            driverMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
            driverMarker.rotation = getHeadingForDirection(fromCoordinate: oldCoodinate, toCoordinate: newCoodinate)
            //found bearing value by calculation when marker add
            driverMarker.position = oldCoodinate
            //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
                driverMarker.groundAnchor = CGPoint(x: CGFloat(0.5), y: CGFloat(0.5))
                driverMarker.rotation = CDouble(data.value(forKey: "bearing"))
                //New bearing value from backend after car movement is done
            })
            driverMarker.position = newCoodinate
            //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))
            driverMarker.rotation = getHeadingForDirection(fromCoordinate: oldCoodinate, toCoordinate: newCoodinate)
            //found bearing value by calculation
            CATransaction.commit()
    
    extension Int {
        var degreesToRadians: Double { return Double(self) * .pi / 180 }
    }
    extension FloatingPoint {
        var degreesToRadians: Self { return self * .pi / 180 }
        var radiansToDegrees: Self { return self * 180 / .pi }
    }
    
    func getHeadingForDirection(fromCoordinate fromLoc: CLLocationCoordinate2D, toCoordinate toLoc: CLLocationCoordinate2D) -> Float {
    
            let fLat: Float = Float((fromLoc.latitude).degreesToRadians)
            let fLng: Float = Float((fromLoc.longitude).degreesToRadians)
            let tLat: Float = Float((toLoc.latitude).degreesToRadians)
            let tLng: Float = Float((toLoc.longitude).degreesToRadians)
            let degree: Float = (atan2(sin(tLng - fLng) * cos(tLat), cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(tLng - fLng))).radiansToDegrees
            if degree >= 0 {
                return degree
            }
            else {
                return 360 + degree
            }
        }
    

    for github link: ARCarMovement

    0 讨论(0)
提交回复
热议问题