CoreLocation найти пройденное расстояние и использовать как переменную iOS

Я делаю будильник, который отключается только после того, как телефон перемещается на определенное расстояние (чтобы заставить пользователя встать с постели). Мне нужно найти расстояние, пройденное после срабатывания будильника, затем взять это расстояние и использовать его в методе отключения звука будильника, если пройдено минимальное расстояние. Любые идеи? Я использую следующее, чтобы обновить местоположение. Любые мысли о том, как включить это в отключение будильника?

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation     *)newLocation fromLocation:(CLLocation *)oldLocation
{
if(!newLocation) {
    NSLog(@"No movement");
}

if ((oldLocation.coordinate.latitude != newLocation.coordinate.latitude) &&
    (oldLocation.coordinate.longitude != newLocation.coordinate.longitude))
{



    CLLocation *loc1 = [[CLLocation alloc] initWithLatitude:oldLocation.coordinate.latitude longitude:oldLocation.coordinate.longitude];
    CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
    CLLocationDistance distance = [loc2 distanceFromLocation:loc1];
    if (distance>=4) {
        NSLog(@"Very good!");
    }

}

NSLog(@"Location:%@", newLocation);
}


-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"Could not find location: %@", error);
}

person kevbot    schedule 25.02.2013    source источник
comment
Я опубликую часть кода, который я использую. Очень новичок в кодировании, поэтому немного запутался.   -  person kevbot    schedule 25.02.2013
comment
По какой-то причине я получаю NSLog Очень хорошо! Это должно происходить только в том случае, если устройство перемещается на 4 метра или более, и я имитирую на Macbook Pro, поэтому движения не должно происходить.   -  person kevbot    schedule 25.02.2013


Ответы (1)


Пара мыслей:

  1. Вы не рассматриваете horizontalAccuracy. Во-первых, если это отрицательное значение для любой из координат, вы просто не сможете провести какое-либо сравнение. И даже если они оба неотрицательны, вы, вероятно, захотите отказаться от горизонтальной точности, если действительно хотите определить, переместился ли пользователь на определенное расстояние.

    Посмотрите не только на широту и долготу, но и на horizontalAccuracy.

  2. Вы не учитываете, что когда вы включаете службы определения местоположения, часто приходит целая серия координат, и координаты могут колебаться по мере того, как точность по горизонтали становится все лучше и лучше. Вы хотите убедиться, что не считаете эту медленную триангуляцию движением, необходимым для того, чтобы квалифицироваться как вставание с постели.

  3. Убедитесь, что вы проводите свои эксперименты на реальном устройстве в реальных сценариях. Использование симулятора определенно не является хорошим тестом. Также не используется устройство, подключенное к вашему компьютеру (потому что вы хотите видеть свой GPS в сценарии реального мира, где кто-то двигался перед сном).

  4. Я бы предложил начать с простого приложения, которое регистрирует события местоположения в базе данных (или в другом формате) и, возможно, отображает журнал в виде таблицы, чтобы вам не всегда приходилось возвращаться к своему компьютеру, чтобы просмотреть результаты. Запустите это приложение, прогуляйтесь, а затем посмотрите на события местоположения, которые вы получаете. Это поможет вам понять закономерности, которые вы видите, когда люди используют свои настоящие устройства.

  5. Обратите внимание, что если это приложение предназначено для магазина приложений, вы захотите задействовать множество разных людей в разных средах, на разных устройствах и в разных сценариях (плохое местоположение GPS, с Wi-Fi, без Wi-Fi и т. д.). Даже когда вы сами работаете с GPS в реальном мире с помощью физического устройства, вы должны понимать, что у всех остальных результаты GPS могут отличаться.

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


Обновление:

Вероятно, проще, чем самостоятельно рассчитывать расстояния, использовать фильтр расстояний службы определения местоположения (т. е. генерировать события только при изменении местоположения на x метров). Например:

- (void)startLocationManager
{
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.distanceFilter = 5.0; // detect when I move 5 meters
    self.locationManager.delegate = self;
    [self.locationManager startUpdatingLocation];
}

Когда я делаю это, стоя совершенно неподвижно, как только я включаю службы определения местоположения, я получаю целую кучу событий еще до того, как начинаю двигаться. Вы можете видеть, как GPS разогревается и становится все более и более точным:

 latitude          longitude          horizontalAccuracy
 ----------------  ------------------ ------------------
 39.9482837548282  (82.4963494095571) 65
 39.9482817585030  (82.4964543834170) 10
 39.9482392622539  (82.4964914314290) 5
 39.9481753502422  (82.4964918505242) 5
 39.9481269028419  (82.4964797805836) 5

Я жду, пока он полностью опустится (в моем случае это заняло 15-20 секунд), а затем я начал идти по прямой, глядя на расстояние от последнего места, которое я получил выше.

 latitude          longitude          horizontalAccuracy distance
 ----------------  ------------------ ------------------ --------
 39.9481722908476  (82.4964962091138) 5                  5.3
 39.9482206544289  (82.4965029146363) 5                  10.4
 39.9482627315828  (82.4965282279839) 5                  15.4
 39.9483157471204  (82.4965248752227) 5                  21.2

Должен признаться, что, хотя я его и не измерял, эти расстояния казались мне не совсем правильными, но, возможно, в пределах 5-метрового допуска, который я установил на своем distanceFilter.

В любом случае, как показывает все это, правильный процесс, вероятно, будет

  • включите службы определения местоположения, установив distanceFilter в соответствии с вашим приложением;

  • подождите, пока локация уляжется;

  • убедитесь, что HorizontalAccuracy даже правдоподобен для того, чтобы этот процесс вообще работал; а также

  • дождитесь уведомления о новом местоположении на основе определения GPS, что distanceFilter превышено.

Это никогда не будет идеальным (например, мне пришлось пройти добрых 6-10 метров, прежде чем мой 5-метровый distanceFilter сработал, вероятно, из-за задержки GPS на несколько секунд и horizontalAccuracy), но этого может быть достаточно для работы в правительстве.

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

person Rob    schedule 25.02.2013
comment
Итак, как мне включить это в свой код, а затем в оператор if, чтобы отключить будильник? Звук будильника воспроизводится через AVPlayer, и я хочу вызвать [avSound stop]; когда расстояние было достигнуто. - person kevbot; 25.02.2013
comment
Я учусь в старшей школе, так что это моя спальня, но да, она примерно такого же размера, как комната в общежитии. Спасибо за помощь! Я посмотрю что я могу сделать. - person kevbot; 25.02.2013
comment
Спасибо еще раз. Мои операционные системы iPhone и Xcode в настоящее время несовместимы, поэтому в данный момент я не могу проводить какие-либо испытания в реальных условиях... настоящая головная боль. - person kevbot; 25.02.2013
comment
@user1004117 user1004117 Будет сложно добиться значительного прогресса, пока вы не обновите свою среду Xcode для поддержки вашего устройства iOS. Симулятор довольно бесполезен для этого уровня тестирования GPS, поскольку вы не видите реального медленного процесса GPS-фиксации вашего местоположения. Несмотря на это, я обновил свой ответ некоторыми практическими, реальными испытаниями и некоторыми дополнительными мыслями. Это, очевидно, только одна точка данных, мой iPhone 5 на этом воображаемом кукурузном поле в Огайо :), но это дает вам идею. - person Rob; 25.02.2013
comment
Привет, мистер Роб, спасибо за ваш ответ. И я застрял в этом вопросе. Я следовал вашим инструкциям и тестировал на реальном iPad, я хочу найти, перемещается ли этот iPad от текущего здания на определенное расстояние. И во время поиска я нашел этот код, но не понял, что именно это возвращает. Полезно ли это в текущей проблеме. let interval = newLocation?.timestamp.timeIntervalSinceNow print(interval (interval)) if (abs(interval!)›20) { - person Lydia; 30.04.2016
comment
В этом делегированном func locationManager (manager: CLLocationManager, didUpdateLocations location: [CLLocation]) {как я могу проверить перемещаемые данные, какой код нужно разместить здесь. - person Lydia; 30.04.2016
comment
Это понятие ожидания 20 секунд, прежде чем вы объявите местоположение из CLLocationManager действительным, является хорошим простым способом дать ему разогреться и получить разумное местоположение. Я бы лично изменил это, чтобы сказать, что либо прошло 20 секунд, либо горизонтальная точность положительна, но ниже определенного значения. Таким образом, если он получит достаточно точное местоположение быстро, вам не придется ждать произвольное количество времени. - person Rob; 30.04.2016