10

我有一个位置服务应用程序,其中提供了用户的海拔高度。不过,我发现 CLLocationManager 提供的高程精度非常不准确。当我两次测试相同的两个点时,有时海拔差是四十英尺,有时是一百英尺。有什么方法可以提高 CLLocation 的垂直精度,还是有不同的方法来获取用户的高程(第三方库)?我已经尝试检查 CLLocationManager 提供的 newLocation 的verticalAccuracy 属性,如果它不够,则将其丢弃,但即使它足够“准确”,它仍然通常实际上并不准确。谢谢你的时间!

现在我正在使用:

if([newLocation verticalAccuracy] < 30) {
    if(isCustomary)
        altitudeLabel.text = [NSString stringWithFormat:@"%.2f feet", ([newLocation altitude] * 3.2808399)];
    else
        altitudeLabel.text = [NSString stringWithFormat:@"%.2f meters", [newLocation altitude]];
}

该代码的问题:verticalAccuracy 通常永远不会低于 30,当它低于 30 时,仍然不够准确;我已经测试了在我家(一层)周围走动的代码,它说海拔变化高达 19 英尺,我敢肯定这不是真的。

4

2 回答 2

28

由于卫星的几何形状,从 GPS 卫星获得的高程本质上不如 GPS 的水平解决方案准确。您应该预计垂直精度通常比水平精度差 1.5 到 3 倍。这只是 GPS 的一个限制,也是为什么航空需要 WAAS 校正才能将 GPS 用于仪器进近。

当垂直精度为 20 或 30 米时,您应该期望高度可达 100 英尺。当您在房子周围走动时,期望它不会变化 19 英尺,这是不切实际的。

您可以做的是保留最近“良好”高度读数的滚动加权平均值(或卡尔曼滤波器),以帮助滤除测量误差。

于 2011-11-29T03:36:28.547 回答
2

你试过什么代码?这是提升的最佳代码,所以我认为除此之外没有任何其他内容:

-(void)awakeFromNib {
  locmanager = [[CLLocationManager alloc] init];
  [locmanager setDelegate:self];
  [locmanager setDesiredAccuracy:kCLLocationAccuracyBest];
  [locmanager startUpdatingLocation];
}

  - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
  heightMesurement.text = [NSString stringWithFormat: @"%.2f m",   newLocation.altitude];
}

  - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
  heightMesurement.text = @"0.00 m";
}
于 2011-11-29T03:23:48.770 回答