使用iPhone并利用核心位置我想计算赛车赛道上赛车的距离。场景中一次只有一辆车会在轨道上,而且赛道也不直。它类似于TopGear计划,当他们在轨道上逐一测试汽车并且你知道轨道不直。
我正在获取纬度,经度,速度并将其发送到网络服务器上以实时监控事物。
我面临的问题是:
1>当汽车在轨道上行驶时,它可以以锯齿形方式运行。轨道很宽,什么时候可以在它上面运行,车可以在左,中或右车道。在汽车换道期间,还记录其纬度和经度。意味着如果你从上到下在纸上画蛇形,然后从上到下画一条直线,在我的场景中我想要实际的距离?
我尝试了几个东西和教程,但是在设备上运行代码并在房间里来回走动之后,距离不断增加,但是当这些小动作无法避免的时候,我怎样才能获得正确的距离?
2 - ;例如,如果轨道是“U”形状并且使用distanceFromLocation:
它给出“U”点到点距离而不是整个“U”轨道距离,就像汽车从“U”左点开始到“U”对了点。如何计算整个“U”距离?
答案 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;