1

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

下面是正在使用的代码,但是当用户缓慢移动时它可以正常工作说走路,而当用户快速移动说在 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];
}

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

4

1 回答 1

1

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

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

A = oldUserLocation(矢量 2D)

B = newUserLocation(向量 2D)

DeltaMovement = B - A

解析航向图像

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

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

  1. 使用陀螺仪平滑磁航向,通过使用一些卡尔曼滤波器(陀螺仪、加速度计、磁力计和卡尔曼滤波器
于 2016-01-05T14:46:45.580 回答