如何获得我当前位置和新位置之间的距离?

时间:2014-04-01 16:07:34

标签: xcode locationmanager cllocationdistance

我希望稍后获得当前位置与新(当前)位置之间的距离。我想要一个计时器,每秒用新的距离更新我的标签。

示例:我站在街道上,目前的位置,并进一步跑300米。我得到一个新的当前位置,标签应该给300米。

我对反对的c编程不是很有经验。 这是我到目前为止所得到的:

#import <CoreLocation/CoreLocation.h>

@interface NormalSoloViewController () <CLLocationManagerDelegate>
@property (weak, nonatomic) IBOutlet UILabel *lbDistance;

@end

@implementation NormalSoloViewController
{
    CLLocationManager *locationManager;
    CLLocation *firstLocation;
}

- (void)viewDidLoad
{

    [super viewDidLoad];

    locationManager =[[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLHeadingFilterNone;
    [locationManager startUpdatingLocation];

    firstLocation = locationManager.location;
}

- (void)startTimer
{
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateDistance:) userInfo:nil repeats:YES];
}

- (void)updateDistance:(NSTimer *)timer
{
    double distance = 0;
    distance = distance + [self calculateDistance];
    self.lbDistance.text = [NSString stringWithFormat:@"%f", distance];

}

- (double) calculateDistance {

    CLLocation *newFirstLocation = firstLocation;
    CLLocation *secondLocation = locationManager.location;
    firstLocation = secondLocation;

    return [newFirstLocation distanceFromLocation:secondLocation];
}

2 个答案:

答案 0 :(得分:1)

代码无法正常工作,因为locationManager.location无法以这种方式调用。 我已经为我的应用添加了速度。它有效,但只有经理发送新信息。

    @implementation ViewController
    {
        CLLocationManager *locationManager;
        double distance;
        double speed;
        double extraDistance;
        NSMutableArray *locations;
        CLLocation *newLocation2;
        CLLocation *oldLocation2;
        CLLocation *newLocationCheck;
    }

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
        }
        return self;
    }

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        distance =0;
        speed =0;
        locationManager = [[CLLocationManager alloc] init];
        locations = [[NSMutableArray alloc] init];
        locationManager.delegate = self;
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        [self startTimer];
        [locationManager startUpdatingLocation];
    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    - (void)startTimer
    {
        // Timer that repeatedly does something every 2 seconds
        [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(updateSpeedDistance:) userInfo:nil repeats:YES];
    }

   - (void)updateSpeedDistance:(NSTimer *)timer
{
    // fetches the old and new location out of the array list
    oldLocation2 = locations[0];
    newLocation2 = locations[1];

    // checks if theres a new location
    if (newLocation2 != newLocationCheck) {

        // if there is only one following location
        if (oldLocation2 != newLocation2){
            distance = distance + [newLocationCheck distanceFromLocation:newLocation2];
            speed = [oldLocation2 distanceFromLocation: newLocation2] / 2;
            newLocationCheck = newLocation2;
        // if there multiple locations avaible
        }
        else {
            distance = distance + [oldLocation2 distanceFromLocation:newLocation2];
            speed = [oldLocation2 distanceFromLocation: newLocation2] / 2;
            newLocationCheck = newLocation2;
        }
    }
    // if there's no new location the speed wil drop
    else {
        speed = speed /1.2;
    }
    self.lbDistance.text = [NSString stringWithFormat:@"Distance: %1.2f m", distance];
    self.lbSpeed.text = [NSString stringWithFormat:@"Speed: %1.2f m/s", speed];
}

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        NSLog(@"didUpdateToLocation: %@", newLocation);

        if (newLocation != nil && oldLocation != nil) {
            [locations removeAllObjects];
            [locations addObject:oldLocation];
            [locations addObject:newLocation];
        }
        else {
            [locationManager startUpdatingLocation];
        }
    }

    @end

答案 1 :(得分:0)

只需拨打电话

即可
  // Call for the First Location Latitude & longitude
    Place* home = [[Place alloc] init];
    home.name = @"Home";
    home.latitude = [[appDel.dictionaRY1styLoc valueForKey:@"Dict1lat"] doubleValue];
    home.longitude = [[appDel.dictionaRY1styLoc valueForKey:@"Dict1Long"] doubleValue];
    CLLocationCoordinate2D coordinate21 = (CLLocationCoordinate2D){ home.latitude, home.longitude};
    MKCircle *circle1 = [MKCircle circleWithCenterCoordinate:coordinate21 radius:5000];
    [mapViewRoute addOverlay:circle1];
    CLLocation * locA = [[CLLocation alloc] initWithLatitude:home.latitude longitude:home.longitude];



    // Call for the Second Location Latitude & longitude
    Place* work = [[Place alloc] init];
    work.name = @"work";
    work.latitude = [[appDel.dictionary2ndyLoc valueForKey:@"Dict2lat"] doubleValue];
    work.longitude = [[appDel.dictionary2ndyLoc valueForKey:@"Dict2Long"] doubleValue];
    CLLocationCoordinate2D coordinate22 = (CLLocationCoordinate2D){ work.latitude, work.longitude};
    MKCircle *circle2 = [MKCircle circleWithCenterCoordinate:coordinate22 radius:5000];
    [mapViewRoute addOverlay:circle2];
    CLLocation * locB = [[CLLocation alloc] initWithLatitude:work.latitude longitude:work.longitude];
    NSLog(@"%f==%f && %f== %f",home.latitude,home.longitude,work.latitude,work.longitude);

    CLLocationDistance distanceE = [locB distanceFromLocation:locA];
    NSLog(@"distanceE: %2f", distanceE/1000);
    lblDistanceKm.text = [NSString stringWithFormat:@"%.2f KM",(distanceE/1000)];

此处CLLocationDistance是类名,我们可以找到距离