CLLocationManager
的这部分代码用于计算行进距离。但即使使用timeIntervalSinceNow
后,也不会删除位置缓存。
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
if(newLocation != nil && oldLocation != newLocation)
{
tempNewLocation = newLocation;
tempOldLocation = oldLocation;
}
NSLog(@"New Location Found");
NSLog(@"- Latitude: %f", newLocation.coordinate.latitude);
NSLog(@"- Longitude: %f", newLocation.coordinate.longitude);
NSLog(@"- Altitude: %f", newLocation.altitude);
NSLog(@"- Course: %f", newLocation.course);
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
NSLog(@"The location age %f",locationAge);
if (locationAge > 2.0)
{
}
else
{
if (tempOldLocation.coordinate.latitude == tempNewLocation.coordinate.latitude && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude)
{
NSLog(@" Fix location found ");
}
else
{
if(tempNewLocation.coordinate.latitude == tempOldLocation.coordinate.latitude && tempNewLocation.coordinate.longitude == tempOldLocation.coordinate.longitude)
{
NSLog(@"First Time Location Update");
latitudeLongitude.text = [[ NSString alloc] initWithFormat:@"%g , %g", tempNewLocation.coordinate.latitude, tempNewLocation.coordinate.longitude];
totalDistance = 0;
distance.text = @"0 miles";
}
else if ([tempNewLocation distanceFromLocation:tempOldLocation] - tempNewLocation.horizontalAccuracy >= 0)
{
totalDistance += [tempNewLocation distanceFromLocation:tempOldLocation] - (tempNewLocation.horizontalAccuracy / 2);
}
else{
totalDistance += [tempNewLocation distanceFromLocation:tempOldLocation];
}
if (totalDistance < 0) {
distance.text = @"0 miles";
}
else
milesdistance=0.000621371192*totalDistance;
distance.text = [[ NSString alloc] initWithFormat:@"%.1f", milesdistance];
odometerreading.text = [NSString stringWithFormat:@"%09.1f", milesdistance];
mileagerate.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"savedstring"];
float mileagefloat=[self.mileagerate.text floatValue];
amount.text = [NSString stringWithFormat:@"%.2f",mileagefloat * milesdistance];
amountstatus.text=[NSString stringWithFormat:@"$%.2f",mileagefloat * milesdistance];
newnumber=totalDistance;
}
此代码对我不起作用,当我开始跟踪时,距离是从我上次停止跟踪的地方计算出来的。
NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
NSLog(@"The location age %f",locationAge);
if (locationAge > 2.0)
答案 0 :(得分:2)
我使用一个计数器来计算 didUpdateToLocation 被调用的次数。
我只使用至少3次通话后收到的位置。
我知道3是一个神奇的数字,但我发现前3个调用是缓存或非常不准确。
答案 1 :(得分:1)
看看这个问题的答案,因为它包含来自Apple的示例应用程序“LocateMe”的代码,并提供了有关您要执行的操作的更多详细信息:
答案 2 :(得分:0)
您想要在委托方法中检查新CLLocation对象的timestamp
属性。通过它的声音只对lat / long感兴趣,不超过XXX秒。
NSTimeInterval timeInSeconds = [newLocation.timestamp timeIntervalSinceNow];
if (timeInSeconds > YOUR_CUSTOM_TIME_IN_SECONDS)
{
// Do something
}
答案 3 :(得分:0)
我找到了删除缓存的答案。第一次调用didUpdateToLocation
时,newlocation
获取缓存值,old location
为空。
在第二个调用中,newlocation
值与oldlocation
交换,newlocation
更新。因此,为了获得更新的值,必须调用该函数两次。
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
static CLLocation *locationanalysis1;
NSLog(@"New Location Found");
NSLog(@"- Latitude: %f", newLocation.coordinate.latitude);
NSLog(@"- Longitude: %f", newLocation.coordinate.longitude);
NSLog(@"- Altitude: %f", newLocation.altitude);
NSLog(@"- Course: %f", newLocation.course);
NSDate *eventDate = newLocation.timestamp;
NSTimeInterval howRecent = -[eventDate timeIntervalSinceNow];
if (howRecent > maximumElapsedTimeForCachedLocation) {
locationanalysis1=newLocation;
return;
}
if((locationanalysis1.coordinate.latitude-oldLocation.coordinate.latitude)==0){
NSLog(@"Old Location in location analysis is %@",oldLocation);
return;
}
NSLog(@"New location accuracy %.0fm", newLocation.horizontalAccuracy);
if ((newLocation.horizontalAccuracy < 0) || (newLocation.horizontalAccuracy > 10)) return;
if(oldLocation!=NULL && newLocation!=NULL){
totalDistance += [newLocation distanceFromLocation:oldLocation];
}else return;
}