Есть ли способ повысить точность определения местоположения по GPS? - PullRequest
0 голосов
/ 20 сентября 2018

Я делаю приложение AR для IOS с постоянными объектами.Каждый объект, который я помещаю в сцену AR, затем сохраняется с позицией GPS.Проблема заключается в точности.Я использую базовый комплект локации swift, но в помещении я не могу получить точность менее 4-6 (ошибка в 4-6 метрах от правильного местоположения).И с этим все идет куда-то еще при перезагрузке сцены.

Я уже использую

locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation

Я попытался получить несколько выборок для получения взвешенного среднего,но я заметил, что после некоторых образцов полученные позиции одинаковы (также точность, 4-6).Вероятно, Свифт делает это сам.

Есть что-то, чего мне не хватает?Математический способ получить лучший подход?Или нет способа улучшить это?

РЕДАКТИРОВАТЬ

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

1 Ответ

0 голосов
/ 20 сентября 2018

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

func setCurrentLocation(location: CLLocation) {

    let encodedLocation = NSKeyedArchiver.archivedData(withRootObject: location)
    UserDefaults.standard.set(encodedLocation, forKey: UserDefaultKey.previousVisitedLocation)
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    guard locations.count > 0 else {
        return
    }

    guard let location = locations.last else {
        return
    }

    guard location.horizontalAccuracy > 0 else {
        return
    }

    guard location.horizontalAccuracy < DISTANCE_LIMIT else { //DISTANCE_LIMIT is the value you have set for your distance filter
        return
    }

    let previousLocationEncoded = UserDefaults.standard.object(forKey: UserDefaultKey.previousVisitedLocation) as? Data

    if previousLocationEncoded == nil {

        setCurrentLocation(location: location)

        //do your tasks

    } else {

        let previousLocationDecoded = NSKeyedUnarchiver.unarchiveObject(with: previousLocationEncoded!) as! CLLocation

        let distanceBetweenVisits = previousLocationDecoded.distance(from: location)

        if distanceBetweenVisits > DISTANCE_LIMIT {

            let timeIntervalBetweenVisits = location.timestamp.timeIntervalSince(previousLocationDecoded.timestamp)

            guard timeIntervalBetweenVisits > 0 else {
                return
            }

            setCurrentLocation(location: location)

            //do your tasks
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...