首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >岩心定位精度

岩心定位精度
EN

Stack Overflow用户
提问于 2014-07-21 14:41:24
回答 4查看 9.4K关注 0票数 14

我目前正在工作的位置跟踪应用程序,我有困难的不准确的位置更新从我的CLLocationManager。这导致我的应用程序跟踪距离,这实际上只是由于不准确的GPS读数。

我甚至可以在打开我的应用程序的时候把我的iPhone放在桌子上,几分钟后,我的应用程序就会因为这个缺陷而追踪数百米的距离。

下面是我的初始化代码:

代码语言:javascript
复制
- (void)initializeTracking {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.distanceFilter = 5;

    [self.locationManager startUpdatingLocation];
}

谢谢!-)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-21 23:33:08

我在类似的应用程序中解决这一问题的方法之一是,如果距离变化略低于在该位置更新中报告的水平精度,则丢弃位置更新。

给定一个previousLocation,然后对于一个newLocation,计算出与previousLocation的距离。如果那个distance >= (horizontalAccuracy * 0.5),那么我们使用那个位置,那个位置就成为我们的新previousLocation。如果距离小于我们放弃的位置更新,不要更改previousLocation并等待下一个位置更新。

对我们来说效果很好,你可以试试这样的方法。如果您仍然发现太多的更新是噪音,增加0.5因子,也许尝试0.66。

当你刚开始修复的时候,你也可能想要防范这样的情况,在那里你会得到一系列的位置更新,这些更新看起来是移动的,但真正发生的是,精确性正在显著提高。

我将避免开始任何位置跟踪或距离测量的水平精度> 70米。这些是全球导航卫星系统质量较差的位置,尽管在城市峡谷、浓密的树冠下或其他恶劣的信号条件下,这可能是你所得到的全部。

票数 25
EN

Stack Overflow用户

发布于 2015-05-28 19:27:16

我使用这种方法来获取所需位置的精确性(在SWIFT中)

代码语言:javascript
复制
let TIMEOUT_INTERVAL = 3.0
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    let newLocation = locations.last as! CLLocation
    println("didupdateLastLocation \(newLocation)")
    //The last location must not be capured more then 3 seconds ago
    if newLocation.timestamp.timeIntervalSinceNow > -3 &&
        newLocation.horizontalAccuracy > 0 {
            var distance = CLLocationDistance(DBL_MAX)
            if let location = self.lastLocation {
                distance = newLocation.distanceFromLocation(location)
            }
            if self.lastLocation == nil ||
                self.lastLocation!.horizontalAccuracy > newLocation.horizontalAccuracy {
                    self.lastLocation = newLocation
                    if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy {
                        //Desired location Found
                        println("LOCATION FOUND")
                        self.stopLocationManager()
                    }
            } else if distance < 1 {
                let timerInterval = newLocation.timestamp.timeIntervalSinceDate(self.lastLocation!.timestamp)
                if timerInterval >= TIMEOUT_INTERVAL {
                    //Force Stop
                    stopLocationManager()
                }
            }
    }

其中:

代码语言:javascript
复制
if newLocation.timestamp.timeIntervalSinceNow > -3 &&
        newLocation.horizontalAccuracy > 0 {

检索到的最后一个位置不能超过3秒前捕获,最后一个位置必须具有有效的水平精度(如果小于1意味着它不是一个有效位置)。

然后,我们将用默认值设置一个距离:

代码语言:javascript
复制
            var distance = CLLocationDistance(DBL_MAX)

计算从检索到新位置的最后一个位置的距离:

代码语言:javascript
复制
if let location = self.lastLocation {
                distance = newLocation.distanceFromLocation(location)
            }

如果我们的本地最后一个位置尚未设置,或者如果新位置的水平精度要好于实际位置,那么我们将将本地位置设置为新位置:

代码语言:javascript
复制
if self.lastLocation == nil ||
        self.lastLocation!.horizontalAccuracy > newLocation.horizontalAccuracy {
            self.lastLocation = newLocation

下一步是检查从位置检索到的准确性是否足够好。要做到这一点,我们检查位置的horizontalDistance是否检索到它,然后检查desiredAccurancy。如果是这样,我们可以阻止我们的经理:

代码语言:javascript
复制
if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy {
                        //Desired location Found
                        self.stopLocationManager()
                    }

对于最后一个if,我们将检查从最后一个位置检索到的距离和新位置之间的距离,而不是那个位置(这意味着这两个位置非常接近)。如果是这种情况,那么我们将得到从上一个位置检索到的时间间隔和检索到的新位置,并检查时间间隔是否大于3秒。如果是这样的话,这意味着我们需要超过3秒的时间才能接收到更准确的本地位置,因此我们可以停止位置服务:

代码语言:javascript
复制
else if distance < 1 {
                let timerInterval = newLocation.timestamp.timeIntervalSinceDate(self.lastLocation!.timestamp)
                if timerInterval >= TIMEOUT_INTERVAL {
                    //Force Stop
                    println("Stop location timeout")
                    stopLocationManager()
                }
            }
票数 5
EN

Stack Overflow用户

发布于 2014-10-24 22:45:08

这一直是卫星位置的问题。这是一种估计,估计可能会有所不同。每一份新的报告都是一个新的估计。当没有运动时,你需要的是一个忽略值的位置夹子。

您可以尝试使用传感器来了解设备是否真的在移动。看看加速度计的数据,如果它没有变化,那么即使GPS说它在移动,设备也不会移动。当然,加速度计数据上也有噪音,所以你也要过滤掉它。

这是一个棘手的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24867927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档