如何旋转 GMSMarker 以显示用户移动方向?

Posted

技术标签:

【中文标题】如何旋转 GMSMarker 以显示用户移动方向?【英文标题】:How to rotate GMSMarker to show user moving direction? 【发布时间】:2015-08-26 10:15:28 【问题描述】:

在我的应用程序中,我需要向用户展示他在 GMSMapView 中移动的方向,所以我已经放置了自定义 GMSMarker 并设置了图像(例如。 Bike or Car) 并在用户开始移动时为该标记设置动画并在 locationManager didUpdateHeading 委托方法中更改标记的角度,因为 GMSMarker 图像(Bike 或 Car)应该开始朝向用户移动方向。

下面是正在使用的代码,但是当用户缓慢移动说走路时它可以正常工作,而当用户快速移动说在 40+ 速度的自行车或汽车中不能正常工作。

- (void)viewDidLoad 
    [super viewDidLoad];
    if(locationManager == nil) 

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;

    locationManager.distanceFilter = 10.0;
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;


    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
        [locationManager requestAlwaysAuthorization];

    if([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
        [locationManager requestWhenInUseAuthorization];

    [locationManager startUpdatingLocation];

        // Start heading updates.
        if ([CLLocationManager headingAvailable]) 
            locationManager.headingFilter = 5;
            [locationManager startUpdatingHeading];
        

    


-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading 
    // Use the true heading if it is valid.
    CLLocationDirection direction = newHeading.magneticHeading;
    CGFloat radians = -direction / 180.0 * M_PI;

    //For Rotate Niddle
    CGFloat angle = RADIANS_TO_DEGREES(radians);
    [self rotateArrowView:angle];



-(void)rotateArrowView:(CGFloat)degrees 

    currentLocationMarker.rotation = degrees;



- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
    // If it's a relatively recent event, turn off updates to save power.

    currentLocation = [locations lastObject];

    [CATransaction begin];
    [CATransaction setAnimationDuration:0.5];
    currentLocationMarker.position = currentLocation.coordinate;
    [CATransaction commit];

谁能告诉我现在应该怎么做才能在用户快速移动时显示正确的准确标题。

【问题讨论】:

您可能有使用课程选项。请参考此developer.apple.com/library/content/documentation/…,尤其是在快速移动时 v 似乎需要使用课程 【参考方案1】:

好吧,我不太确定,但是在快速行驶时,航向似乎不是很准确。我看到了几个选项:

    如果您想显示行驶方向,并且用户的行驶速度足够快以进行重大移动更改,您可以通过以下方式近似旋转:

A = oldUserLocation(二维向量)

B = newUserLocation(二维向量)

DeltaMovement = B - A

然后,假设北方向可以表示为 2D 矢量 V(0,1),您可以使用数学函数(我更喜欢 https://github.com/nicklockwood/VectorMath,但我确信有很好的 obj-c 东西以及)获得运动矢量和北方之间的角度。

缺点是轮流时会漂移。当然,您始终可以使用多个旧位置 - 这样您就可以使其更加“对噪音不敏感”。

    使用陀螺仪平滑磁航向,通过使用一些卡尔曼滤波器 (gyro, accelerometer, magnetometer and Kalman filter)

【讨论】:

以上是关于如何旋转 GMSMarker 以显示用户移动方向?的主要内容,如果未能解决你的问题,请参考以下文章

阻止移动网页上的设备旋转

如何调整图像的方向以显示正确的图像预览?

如何在SVG中旋转期间保持文本方向不变

如何在 Gmap.Net 中显示车辆移动方向

根据 Google Maps V2 Android 上的用户方向旋转标记

如何旋转精灵和移动