2013-04-26 2 views
0

Использование iPhone и использование основного местоположения Я хочу рассчитать расстояние гоночного автомобиля на гоночной трассе. Сценарий только один автомобиль будет на ходу в то время и трек также не прямой. Это похоже на программу TopGear, когда они проверяют автомобили один за другим на своем пути, и вы знаете, что трек не является прямым.Нужна помощь относительно расчета расстояния с использованием основного местоположения

Я выбираю широту, долготу, скорость и отправляю ее на веб-сервер для наблюдения за вещами в реальном времени.

Проблемы я столкнулся являются:

1> Когда автомобиль работает на треке он может работать в зигзаг образом. Треки широкие, и когда можно бегать по нему, автомобиль может находиться в левой, средней или правой полосе. На автомобильных сменах также регистрируются его широта и долгота. Значит, если вы рисуете форму змеи на бумаге сверху вниз, а затем рисуете прямую линию сверху вниз, то же самое происходит в моем сценарии, я хочу фактическое расстояние?

Я пробовал несколько вещей и обучающих программ, но после запуска кода на устройстве и ходьбы в комнате расстояние вперед и назад увеличивается, но на пути, когда этого небольшого движения нельзя избежать, как мне получить правильное расстояние?

2> Например, если трек имеет форму «U» и с использованием distanceFromLocation:, он дает «U» точку в точке, но не всю дистанцию ​​«U», например, автомобиль начинается с «U» слева от точки «U», U ". Как рассчитать общее расстояние «U»?

I am following this tutorial.

+2

Если вы записываете все точки, то вы можете перебрать их и сложить расстояния между каждой парой точек. – Wain

+0

@Wain Спасибо за ответ, пожалуйста, можете ли вы дать фрагмент кода, как я могу добавить расстояние? –

ответ

1

Если вы записываете все точки, вы можете прокручивать их и складывать расстояния между каждой парой точек. Чтобы получить расстояние между всеми точками (псевдо код):

double distance = 0; 
CLLocationCoordinate2D p1 = ...; 
CLLocationCoordinate2D p2 = ...; 

for (NSInteger i = 0; i < count; i++) { 
    distance += [self metresBetweenPlace1:p1 place2:p2]; 

    p1 = p2; 
    p2 = ...; 
} 

- (double)metresBetweenPlace1:(CLLocationCoordinate2D)place1 andPlace2:(CLLocationCoordinate2D)place2 
{ 
    MKMapPoint start = MKMapPointForCoordinate(place1); 
    MKMapPoint finish = MKMapPointForCoordinate(place2); 

    return MKMetersBetweenMapPoints(start, finish); 
} 
+0

, пожалуйста, просмотрите проблему zig zag, о которой я упомянул в своем вопросе, это решение не даст мне точного расстояния. –

+0

Как заявили другие комментаторы, вы ограничены точностью устройства. Это решение даст вам расстояние между каждой точкой и общим расстоянием. – Wain

+0

Предполагая, что вы используете объекты 'CLLocation', вы можете просто выполнить' [p2 distanceFromLocation: p1] ' – sbonkosky

1

К сожалению, Вы не можете сделать это очень точно только с помощью внутреннего GPS ИО устройства. Поскольку внутренний GPS обновляется только с частотой 1 Гц. Для быстрого гоночного автомобиля все может произойти в течение 1 секунды. Если вы не используете внешний GPS-приемник с высокой скоростью, вы не сможете достичь своей цели. Есть некоторые GPS-приемники для iOS в маркетинге, вы можете это сделать. Я лично использую Racelogic VBOX Sport с частотой 20 Гц.

Тогда, я бы использовал скорость * время, чтобы рассчитать расстояние, не используя distanceFromLocation :. Поскольку GPS может дать вам высокую точность и время UTC, но не может гарантировать высокое точное положение (точное положение).

Если вы не беспокоитесь о точности, вы можете сделать это. Когда вы получаете каждый образец CLLocation, получите скорость и время (текущая отметка времени минус предыдущая временная метка) и умножьте ее и добавьте этот результат в следующий результат выборки. например

//Ignore if speed is less than 5 km/h 
if (newLocation.speed < 1.39) 
return; 

//(average speed in m/s) * (time in seconds) 
float result = (newLocation.speed + oldLocation.speed)/2 * [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp]; 

И подытожим все результаты.

+0

Эти автомобили не так уж быстры, поэтому iphone будет работать в моем случае. –

+0

Затем вы можете использовать скорость * время, чтобы рассчитать расстояние. Это более точно, чем функция distanceFromLocation:. Я обновил свой ответ. – brianLikeApple

+0

Большое спасибо за ответ, я немного запутался в этом »(текущая временная метка минус предыдущая временная метка) и умножьте ее и добавьте этот результат в следующий результат выборки.« Пожалуйста, вы можете дать фрагмент кода. –

0

попробуйте ввести этот код в контроллере представления, он работал на меня.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    appDelegate = [[UIApplication sharedApplication] delegate]; 
    locationManager =[[CLLocationManager alloc] init]; 
    // Do any additional setup after loading the view, typically from a nib. 
    [userMap setCenterCoordinate: userMap.userLocation.coordinate animated: YES]; 
    [self performSelector:@selector(checkForLogin) withObject:nil afterDelay:1]; 

    [self startLocationServices]; 
     // create LM 
     self.locationManager = [CLLocationManager new]; 

     // set its delegate 
     [self.locationManager setDelegate:self]; 

     // set configuration 
     [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
     [self.locationManager setDistanceFilter:kCLDistanceFilterNone]; 

     // start location services 
     [self.locationManager startUpdatingLocation]; 
    // create an oldLocation variable if one doesn't exist 

    } 


- (void)startLocationServices 
{ 
    // create the Location Manager 
    if (self.locationManager == nil) { 
     self.locationManager = [CLLocationManager new]; 
    } 

    // stop services 
    [self.locationManager stopUpdatingLocation]; 
    [self.locationManager setDelegate:nil]; 
    self.uilabel.text = @"0.0f"; 
} 
// locationManager didUpdateToLocation FromLocation 
    - (void)locationManager:(CLLocationManager *)manager 
didUpdateToLocation:(CLLocation *)newLocation 
fromLocation:(CLLocation *)oldLocation { 
    NSLog(@"%@", newLocation); 
     self.uilabel.text = [NSString stringWithFormat:@"%d %.f ", x, [newLocation speed] * 2.23694]; 


    } 

+ (NSString *) speedToMPH: (float) value 
{ 
NSString *x = @"0.0 "; 
if (value>0) { 
float mile = 1609.344f; 
float mph = value/mile * 3600; 
x = [NSString stringWithFormat: @"%.f ", mph]; 
} 
return x; 
} 

и добавить к вам .h файл

@property (strong, nonatomic) IBOutlet UILabel *uilabel; 
@property(nonatomic) int x; 
@property (nonatomic,retain) CLLocationManager *locationManager; 
+ (NSString *) speedToMPH: (float) value;