需要有关使用核心位置计算距离的帮助
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;
【讨论】:
以上是关于需要有关使用核心位置计算距离的帮助的主要内容,如果未能解决你的问题,请参考以下文章