1

のコードのこの部分は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) 
4

4 に答える 4

2

didUpdateToLocationが呼び出された回数をカウントするカウンターを使用します。
少なくとも3回の通話後に受信した場所のみを使用します。

3がマジックナンバーであることは知っていますが、最初の3つの呼び出しがキャッシュであるか非常に不正確であることがわかりました。

于 2012-10-14T09:10:43.813 に答える
1

この質問への回答を見てください。Appleのサンプルアプリ「LocateMe」のコードが含まれており、何をしようとしているのかについてもう少し詳しく説明しています。

https://stackoverflow.com/a/12848776/346098

于 2012-10-15T11:50:25.073 に答える
0

timestampデリゲートメソッドで新しいCLLocationオブジェクトのプロパティを確認する必要があります。それの音によって、XXX秒より古くない緯度/経度にのみ関心があります。

NSTimeInterval timeInSeconds = [newLocation.timestamp timeIntervalSinceNow];
if (timeInSeconds > YOUR_CUSTOM_TIME_IN_SECONDS)
{
    // Do something
}
于 2012-10-14T09:20:28.840 に答える
0

キャッシュを削除するための答えを見つけました。初めてdidUpdateToLocation呼び出されると、newlocationキャッシュ値がフェッチされ、old locationはnullになります。そして、2番目の呼び出しで、newlocation値がにスワップされoldlocationnewlocationが更新されます。したがって、更新された値を取得するには、関数を2回呼び出す必要があります。

- (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;
}
于 2012-10-17T14:16:11.473 に答える