如何通过iphone中的gps位置管理器计算平均海拔高度

时间:2011-05-31 09:32:34

标签: iphone objective-c locationmanager

我想通过CLLocationManager计算当前位置的最大海拔高度,最小海拔高度和平均海拔高度。我知道如何使用以下代码计算高度:

    #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

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

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

在.h:

NSMutableArray *altitudes;

in .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;
}