【问题标题】:Which is a higher accuracy criteria: ACCURACY_HIGH or ACCURACY_FINE?哪个是更高的准确度标准:ACCURACY_HIGH 还是 ACCURACY_FINE?
【发布时间】:2013-07-26 07:35:23
【问题描述】:

Criteria 类中,有两个常量ACCURACY_HIGHACCURACY_FINE,显然用于要求LocationManager 返回更高精度的位置更新。以下是documentation 对每个常量的说明:

public static final int ACCURACY_FINE(在 API 级别 1 中添加)

  A constant indicating a finer location accuracy requirement
  Constant Value: 1 (0x00000001)

public static final int ACCURACY_HIGH(在 API 级别 9 中添加)

  a constant indicating a high accuracy requirement - may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and vertical position this corresponds roughly to an accuracy of less than 100 meters.
  Constant Value: 3 (0x00000003) 

有谁知道这两个常数中的哪一个提供(即要求)最高水平的准确度?

【问题讨论】:

    标签: android gps android-location


    【解决方案1】:

    从我在源代码中可以看到,ACCURACY_FINE 与 ACCURACY_COARSE 分组,常数值分别为 1 和 2。 ACCURACY_LOW、MEDIUM 和 HIGH 与常数值 1、2 和 3 组合在一起。

    似乎 setAccuracy 期望并返回 COARSE 或 FINE,而 setVerticalAccuracy、setHorizo​​ntalAccuracy、setSpeedAccuracy 和 setBearingAccuracy 期望 LOW、MEDIUM 或 HIGH。此外,当您调用 setAccuracy 时,它会像这样设置水平精度:

    public void setAccuracy(int accuracy) {
        if (accuracy < NO_REQUIREMENT || accuracy > ACCURACY_COARSE) {
            throw new IllegalArgumentException("accuracy=" + accuracy);
        }
        if (accuracy == ACCURACY_FINE) {
            mHorizontalAccuracy = ACCURACY_HIGH;
        } else {
            mHorizontalAccuracy = ACCURACY_LOW;
        }
    }
    

    这真的很令人困惑,但我希望我能为你澄清一下。这里是grepcode中的源链接,如果本地没有源可以自己下载看看。

    【讨论】:

    • 谢谢!不幸的是,这似乎是另一个 Android 文档有点不足的案例。源代码链接很有帮助!
    • 不求太多,如果回答对你有帮助,你可以接受!
    • 我喜欢在接受答案前一两天提出问题。不过我确实支持你!
    • 嗯,已经有一两天了。我投票赞成 b/c 这有帮助...很好 == 显然很高。
    • 也赞成,因为这非常有帮助。 ACCURACY_LOW == ACCURACY_FINE 似乎是一个可怕的设计决定。不使用枚举是第一个错误。 :-P
    【解决方案2】:

    这两个常数均表示最高准确度,但适用于不同的方法。从文档(自提出问题以来可能已更新):

    ACCURACY_FINEsetAccuracy 的有效输入。

    ACCURACY_HIGHsetBearingAccuracysetHorizontalAccuracysetSpeedAccuracysetVerticalAccuracy 的有效输入。

    我相信这种建模的想法是FINECOARSE 只给你两个相反的选择,而LOWMEDIUMHIGH 允许更细微的区别。 (问题仍然存在,为什么 setSpeedAccuracy 通过只允许 LOWHIGH 来嘲笑该建模。但是,这可能是文档或设计中的错误。:)

    正如 OP 所提到的,他们后来引入了这些值,API 级别 9,与 FINE-COARSE 的 API 级别 1 形成对比。 npace 找到的代码简单地表明,Android 开发人员现在在内部将所有内容映射到 LOW 到 HIGH 值范围的名称和值,以在内部获得一些一致性。

    【讨论】:

      【解决方案3】:

      有几个标准来确定位置的准确性

      一旦设备开始提供实时位置,我的建议是检查每个结果的准确性,并根据您的要求考虑拒绝大于一定数量的结果。位置提供程序运行的时间越长,如果设备的天空视野畅通无阻并且蜂窝连接良好,那么通常精度会提高到某个点,然后趋于平稳,然后会出现波动。这是一个伪代码 sn-p 显示如何检查每个 GPS 定位结果的准确性:

      1
      2
      3
      

      以下是一些准确度阈值的粗略示例。对于这些不同的阈值将如何影响您的应用程序的行为,您的要求可能会有所不同;这些示例需要将当前位置转换为大致地址的地理编码。根据结果​​,应用程序会向用户提供不同的反馈:

      Rooftop  <= 10 meters (desired result)
      Street >10 meters and <= 100 meters (let user know it’s close but not perfect. Good enough?)
      Neighborhood > 100 meters and  <= 500 meters (give visual feedback that accuracy is low)
      City > 500 meters and <= 2000 meters (ask user to verify city name from a list)
      County > 2000 meters (prompt for manual location input)
      

      考虑您自己的独特用例。如果您的应用只是帮助人们在 NFL 比赛中找到开放的停车场,您可能会完全拒绝任何大于 100 米(328 英尺)的精度值。您可以有一个应用程序返回半径 5 英里 (8000m) 范围内的牙医诊所列表。或者天气应用可能只需要大致了解您所在的城市。这些只是帮助您思考的想法。

      public void onLocationChanged(Location location) {
               if(location.getAccuracy() < 100.0 && location.getSpeed() < 6.95){
                    //Do something
               }
               else{
                    //Continue listening for a more accurate location
               }
      

      【讨论】:

        猜你喜欢
        • 2020-03-30
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        相关资源
        最近更新 更多