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

时间:2013-04-26 12:37:58

标签: ios objective-c gps core-location

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

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

我面临的问题是:

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

我尝试了几个东西和教程,但是在设备上运行代码并在房间里来回走动之后,距离不断增加,但是当这些小动作无法避免的时候,我怎样才能获得正确的距离?

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

I am following this tutorial.

3 个答案:

答案 0 :(得分:1)

不幸的是,仅使用iOS设备的内部GPS,您无法做到非常准确。因为内部GPS仅以1Hz的速率更新。对于快速赛车,一切都可以在1秒内完成。除非您使用高速率的外置GPS接收器,否则您无法实现目标。营销中有一些适用于iOS的GPS接收器,你可以谷歌吧。我个人使用的是速度为20Hz的Racelogic VBOX Sport。

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

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

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

总结所有结果。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

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

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