2016-09-08 76 views
2

我正在開發谷歌地圖上的一些導航任務。隨着車輛在其應用程序中的移動,我必須移動標記。我嘗試了@SO提供的不同解決方案,但它不能按我的需要工作。在Google地圖上移動GMSMarker像UBER

我得到的角度與以前的緯度/長,目前緯度/經度和動畫mapwithBearing與旋轉

這裏是代碼

[CATransaction begin]; 
[CATransaction setAnimationDuration:2.0]; 
NSDictionary *data = [[result objectForKey:@"returnData"] objectForKey:@"data"]; 
if (![data isEqual: [NSNull null]]) { 
    driverLocationCoordinate = CLLocationCoordinate2DMake([[data objectForKey:@"lat"] doubleValue], [[data objectForKey:@"lng"] doubleValue]); 
    driverMarker.position = driverLocationCoordinate; 

    GMSCameraPosition * camera = [GMSCameraPosition cameraWithLatitude:driverLocationCoordinate.latitude 
                    longitude:driverLocationCoordinate.longitude 
                      zoom:16]; 

    mapHomeView.camera = camera; 


    if ([data objectForKey:@"preLat"] != [NSNull null] && [data objectForKey:@"preLng"] !=[NSNull null]){ 
     if ([[data objectForKey:@"preLat"] floatValue] != 0.0f && [[data objectForKey:@"preLng"] floatValue] != 0.0f) { 
      NSLog(@"pre_lat = %f and pre_lng = %f", [[data objectForKey:@"preLat"] floatValue], [[data objectForKey:@"preLng"] floatValue]); 
      CLLocationCoordinate2D previousCoordinates = CLLocationCoordinate2DMake([[data objectForKey:@"preLat"] floatValue], [[data objectForKey:@"preLng"] floatValue]); 

     driverMarker.rotation = [self DegreeBearing:previousCoordinates locationB:driverMarker.position]; 
     [mapHomeView animateToBearing:driverMarker.rotation]; 
     } 
    } 

    [CATransaction commit]; 

我剛剛度代碼從另一個@SO後,它當我在直線道路上但是當汽車仍然或轉彎時,它會產生閃爍

這裏是從另一個SO帖子獲取角度的代碼。

-(double) DegreeBearing:(CLLocationCoordinate2D) A locationB: (CLLocationCoordinate2D)B{ 
    double dlon = [self ToRad:(B.longitude - A.longitude) ]; 
    double dPhi = log(tan([self ToRad:(B.latitude)]/2 + M_PI/4)/tan([self ToRad:(A.latitude)]/2 + M_PI/4)); 
    if (fabs(dlon) > M_PI){ 
     dlon = (dlon > 0) ? (dlon - 2*M_PI) : (2*M_PI + dlon); 
    } 
    return [self ToBearing:(atan2(dlon, dPhi))]; 
} 

-(double) ToRad: (double)degrees{ 
    return degrees*(M_PI/180); 
} 

-(double) ToBearing:(double)radians{ 
    return [self ToDegrees:radians] + 360 % 360; 
} 

-(double) ToDegrees: (double)radians{ 
    return radians * 180/M_PI; 
} 

任何人都可以幫忙或提出任何其他解決方案嗎?

+0

你得到解決? –

+0

你有解決方案嗎?如果你發現它,請幫助我。 –

+0

我用上面提到的代碼進行了一些修改,但它不是一個完美的解決方案。 –

回答

3

一些如何使用此代碼。您可以嘗試使用此代碼進行一些邏輯更改。但是,它會正常工作。

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]; 

在.h文件中定義這兩個

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

方法得到新老座標

- (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; 
    } 
} 

雨燕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 
     } 
    } 

對github上的鏈接:ARCarMovement

+0

是的,我也用這個到我的應用程序。 –

+0

@我開發,這很酷! –