需要有关使用核心位置计算距离的帮助

Posted

技术标签:

【中文标题】需要有关使用核心位置计算距离的帮助【英文标题】:Need assistance regarding calculating distance using core location 【发布时间】:2013-04-26 12:37:57 【问题描述】:

使用 iPhone 并利用核心位置我想计算赛车在赛道上的距离。场景是一次只有一辆车在赛道上,而且赛道也不是直的。它类似于 TopGear 程序,当他们在赛道上一一测试汽车并且您知道赛道不是笔直的。

我正在获取纬度、经度、速度并将其发送到网络服务器以实时监控。

我面临的问题是:

1> 当汽车在轨道上运行时,它可以以之字形方式运行。轨道很宽,什么时候可以在上面行驶,汽车可以在左、中或右车道上行驶。在汽车换档车道期间,还记录其纬度和经度。意思是如果你在纸上从上到下画一条蛇形,然后从上到下画一条直线,在我的场景中也是如此,我想要实际距离?

我尝试了几件事和教程,但是在设备上运行代码并在房间里来回走动后距离不断增加,但是当那些小动作无法避免时,我如何获得正确的距离?

2> 例如,如果轨道是“U”形并使用distanceFromLocation:,它会给出“U”点到点的距离,而不是整个“U”轨道距离,例如汽车从“U”左点开始到“U”对点。如何计算整个“U”距离?

I am following this tutorial.

【问题讨论】:

如果您要记录所有点,那么您可以遍历它们并将每对点之间的距离相加。 @Wain 谢谢回复,请给个代码sn-p,如何添加距离? 【参考方案1】:

如果您要记录所有点,则可以循环遍历它们并将每对点之间的距离相加。获取所有点之间的距离(伪代码):

double distance = 0;
CLLocationCoordinate2D p1 = ...;
CLLocationCoordinate2D p2 = ...;

for (NSInteger i = 0; i < count; i++) 
    distance += [self metresBetweenPlace1:p1 place2:p2];

    p1 = p2;
    p2 = ...;


- (double)metresBetweenPlace1:(CLLocationCoordinate2D)place1 andPlace2:(CLLocationCoordinate2D)place2

    MKMapPoint start = MKMapPointForCoordinate(place1);
    MKMapPoint finish = MKMapPointForCoordinate(place2);

    return MKMetersBetweenMapPoints(start, finish);

【讨论】:

请查看我在问题中提到的之字形问题,这个解决方案不会给我准确的距离。 正如其他评论者所说,您受到设备准确性的限制。此解决方案将为您提供每个点之间的距离和总距离。 假设你使用CLLocation对象,你可以简单地做[p2 distanceFromLocation:p1] 【参考方案2】:

很遗憾,仅使用 ios 设备的内部 GPS 无法做到非常准确。因为内部 GPS 仅以 1Hz 的速率更新。对于快速赛车来说,一切都可以在 1 秒内发生。除非您使用高速率的外部 GPS 接收器,否则您无法实现目标。市场上有一些iOS的GPS接收器,你可以google一下。我个人使用的是 20Hz 速率的 Racelogic VBOX Sport。

然后,我将使用速度*时间来计算距离,而不是使用 distanceFromLocation:。因为 GPS 可以为您提供高精度的速度和 UTC 时间,但不能保证高精度的位置(确切位置)。

如果您不担心准确性,您可以这样做。当您获得每个样本 CLLocation 时,获取速度和时间(当前时间戳减去前一个时间戳)并将其相乘并将此结果添加到下一个样本结果中。例如

//Ignore if speed is less than 5 km/h
if (newLocation.speed < 1.39)
return;

//(average speed in m/s) * (time in seconds)
float result = (newLocation.speed + oldLocation.speed)/2 * [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp];

并总结所有结果。

【讨论】:

那些车不是那么快,这就是为什么 iphone 可以在我的情况下工作。 然后你可以使用速度*时间来计算你的距离。它比 distanceFromLocation: 函数更准确。我更新了我的答案。 非常感谢您的回复,我对这个“(当前时间戳减去上一个时间戳)感到有些困惑,并将其相乘并将此结果添加到下一个示例结果中。”请你给一个代码 sn-p . 我用代码给出了未注明日期的答案。它仅在不需要高精度时才有效;] 当心如果你打破苛刻并且车辆停下来,ios 仍然会永远提供 5km/h 直到车辆继续前进。原因是在静止状态下您无法获得修复,例如在(未过滤的)GPS 设备上。【参考方案3】:

尝试在您的视图控制器中输入此代码,它对我有用。

- (void)viewDidLoad

    [super viewDidLoad];
    appDelegate = [[UIApplication sharedApplication] delegate];
    locationManager =[[CLLocationManager alloc] init];
    // Do any additional setup after loading the view, typically from a nib.
    [userMap setCenterCoordinate: userMap.userLocation.coordinate animated: YES];
    [self performSelector:@selector(checkForLogin) withObject:nil afterDelay:1];

    [self startLocationServices];
        // create LM
        self.locationManager = [CLLocationManager new];

        // set its delegate
        [self.locationManager setDelegate:self];

        // set configuration
        [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
        [self.locationManager setDistanceFilter:kCLDistanceFilterNone];

        // start location services
        [self.locationManager startUpdatingLocation];
    // create an oldLocation variable if one doesn't exist

    


- (void)startLocationServices

    // create the Location Manager
    if (self.locationManager == nil) 
        self.locationManager = [CLLocationManager new];
    

    // stop services
    [self.locationManager stopUpdatingLocation];
    [self.locationManager setDelegate:nil];
    self.uilabel.text = @"0.0f";

// locationManager didUpdateToLocation FromLocation
    - (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation 
    NSLog(@"%@", newLocation);
      self.uilabel.text = [NSString stringWithFormat:@"%d %.f ", x, [newLocation speed] * 2.23694];


    

 + (NSString *) speedToMPH: (float) value

 NSString *x = @"0.0 ";
 if (value>0) 
 float mile = 1609.344f;
 float mph = value / mile * 3600;
 x = [NSString stringWithFormat: @"%.f ", mph];
 
 return x;
 

并将其添加到您的 .h 文件

@property (strong, nonatomic) IBOutlet UILabel *uilabel;
@property(nonatomic) int x;
@property (nonatomic,retain) CLLocationManager *locationManager;
+ (NSString *) speedToMPH: (float) value;

【讨论】:

以上是关于需要有关使用核心位置计算距离的帮助的主要内容,如果未能解决你的问题,请参考以下文章

使用 iphone 核心位置数据计算距离

在 iOS 中计算步行距离

计算我的位置与多个位置之间的距离

使用距离和纬度和经度计算位置

需要有关 CoreData 保存的帮助

计算我的位置和 Swift 上的 MapKit 引脚之间的距离