2011-05-31 20 views
2

我想通过CLLocationManager来计算当前位置的最大高度,最小高度和平均海拔高度。我知道如何使用下面的代码来计算高度:如何通过iphone中的GPS定位管理器计算平均海拔

#import <UIKit/UIKit.h> 
    #import <CoreLocation/CoreLocation.h> 

    @interface test : UIViewController <CLLocationManagerDelegate> { 
     CLLocationManager *locationManager; 

     CLLocation *startingPoint; 

     IBOutlet UILabel *altitudeLabel; 

    } 
    @property (retain, nonatomic) CLLocationManager *locationManager; 
    @property (retain, nonatomic) CLLocation *startingPoint; 
    @property (retain, nonatomic) UILabel *altitudeLabel; 
    @end 
    //this is my test.h class 




    #import "test.h" 

    @implementation test 
    @synthesize locationManager; 
    @synthesize startingPoint; 
    @synthesize altitudeLabel; 


    #pragma mark - 
    - (void)viewDidLoad { 
     self.locationManager = [[CLLocationManager alloc] init]; 
     [locationManager startUpdatingLocation]; 
     locationManager.delegate = self; 
     locationManager.distanceFilter = kCLDistanceFilterNone; 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    } 
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
     // Return YES for supported orientations 
     return (interfaceOrientation == UIInterfaceOrientationPortrait); 
    } 

    - (void)dealloc { 

     [locationManager release]; 
     [startingPoint release]; 
     [altitudeLabel release]; 

     [super dealloc]; 
    } 
    #pragma mark - 
    #pragma mark CLLocationManagerDelegate Methods 
    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 

     if (startingPoint == nil) 
      self.startingPoint = newLocation; 


     NSString *altitudeString = [[NSString alloc] initWithFormat:@"%gm", newLocation.altitude]; 
     altitudeLabel.text = altitudeString; 
     [altitudeString release]; 



    } 

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 

     NSString *errorType = (error.code == kCLErrorDenied) ? @"Access Denied" : @"Unknown Error"; 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error gettingg location from Core Location" message:errorType delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 

    } 

    @end 

通过这次我只得到了高度值,但我需要知道如何计算平均海拔最低海拔和最高海拔。有谁知道如何做到这一点?

+0

只需存储您在数组中获得的所有高度,然后在您需要查找min,max,avg时遍历它们? – vakio 2011-05-31 09:38:04

+0

锄头发现,你能否详细解释我,谢谢 – Rocky 2011-05-31 10:39:00

回答

2

我描述了如何在minAltitude方法中获得min。我会留给你找到最大和平均。

在.H:

NSMutableArray *altitudes; 

中的m:

- (void) viewDidLoad { 
    [super viewDidLoad]; 
    altitudes = [[NSMutableArray alloc] init]; 
} 

- (void) dealloc { 
    [altitudes release]; 
    [super dealloc]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
     [altitudes addObject:[NSNumber numberWithDouble:newLocation.altitude]]; 
} 

- (double) minAltitude 
{ 
    double min = DBL_MAX; 
    double value; 
    NSNumber *altitude; 
    for (altitude in altitudes) { 
     value = [altitude doubleValue]; 
     if (value < min) { 
      min = value; 
     } 
    } 

    return min; 
} 
3

不是存储所有的海拔高度在阵列中作为其他人所说的,你可以只保存当前平均/分钟/最大并随时更新。

int numUpdates = 0; 
double averageAlt = 0.0; 
double minAlt = DBL_MAX; 
double maxAlt = DBL_MIN; 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
     if (newLocation.altitude < minAlt) { 
      minAlt = newLocation.altitude; 
     } 
     if (newLocation.altitude > maxAlt) { 
      maxAlt= newLocation.altitude; 
     } 
     double sum = numUpdates * averageAlt; 
     sum+=newLocation.altitude; 
     numUpdates++; 
     averageAlt = sum/numUpdates; 
} 
+0

或者只存储海拔的总数和数量,并在需要的时候找到平均值。 – 2011-06-01 13:50:16

+0

@Alexsander - 好点,我想象它在GUI上显示并且一直在更新。 – brain 2011-06-01 14:28:19