哪个是更高的准确度标准:ACCURACY_HIGH还是ACCURACY_FINE?

时间:2013-07-26 06:33:04

标签: android gps android-location

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) 

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

3 个答案:

答案 0 :(得分:18)

从我在源代码中看到的,ACCURACY_FINE与ACCURACY_COARSE分组,其常数值为1&分别为2。 ACCURACY_LOW,MEDIUM和HIGH组合在一起,其值为1,2和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中源代码的链接,您可以下载它,如果您没有本地源代码,请自行查看。

答案 1 :(得分:5)

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

ACCURACY_FINEsetAccuracy的有效输入。

ACCURACY_HIGHsetBearingAccuracysetHorizontalAccuracysetSpeedAccuracysetVerticalAccuracy的有效输入。

我认为这种建模的想法是FINECOARSE只允许您选择两个对立面,而LOWMEDIUMHIGH允许更微妙的区分。 (问题仍然存在,为什么setSpeedAccuracy通过仅允许LOWHIGH来嘲笑建模。但是,这可能是文档或设计中的错误。:))

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

答案 2 :(得分:-1)

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

一旦设备开始提供实时位置,我的建议是检查每个结果的准确性,并考虑拒绝超过基于您的要求的一定数量的结果。位置提供商运行的时间越长,并且如果设备具有无障碍的天空视图和良好的蜂窝连接,那么通常精度将提高到某一点然后平稳,然后它将波动。这是一段伪代码段,展示了如何检查每个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英里(8000米)范围内的牙医办公室列表。或者天气应用程序只需要知道您所在的城市。这些只是帮助您思考的想法。

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