0

我使用了检测设备位置变化的onLocationChanged方法。LocationListenerrequestLocationUpdates方法中,我设置了最小时间 = 5 秒和最小距离 = 2 米,但requestLocationUpdates即使我的设备根本没有移动(静止放置),方法也会给我更新。所以请告诉我的代码有什么问题?

这是我的代码:

public class LocationDetector implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        Log.d("GPS: ",location.getLatitude()+", "+location.getLongitude());
    }

.

LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

.

manager.requestLocationUpdates("gps", 5000, 2, new LocationDetector());
4

1 回答 1

4

GPS 位置可能会波动。如果您实际记录您收到的位置,您可能会看到每当位置更新到来时,位置实际上会发生 2 米或更多的变化。

编辑:添加处理波动的想法:

如何处理 GPS 波动取决于您的应用程序的需求。一些可能的想法包括:

如果您不需要真正准确的位置,则在requestLocationUpdates()呼叫中使用更高的距离限制,以免接收到非常小的位置变化的更新。您可以考虑用例所需的绝对必要精度,然后使用可能的最高距离限制。

如果您不希望位置更改很快,或者您不需要对位置更改非常快速地做出反应,那么在requestLocationUpdates()通话中使用更高的时间限制。onLocationChanged()如果您总是通过网络获取一些数据(反向地理编码等),如果您有一些非常繁重的代码由类似触发,这也是有意义的。

时间限制对电池使用的影响也更大。安卓文档说:

...位置提供者使用 minDistance 参数来节省电量更加困难,因此 minTime 应该是节省电池寿命的主要工具。

如果你真的需要一个准确的位置,那么有一些方法可以减少波动。

首先,Location接收到的对象通常具有通过调用该方法onLocationChanged()可获得的估计精度。Location.getAccuracy()您可以简单地忽略任何准确性非常差的位置更新(与以前的位置更新的准确性相比)。

如果您有最近位置的短缓冲区,您也可以进行一些过滤。计算平均值会减少突然变化的数量,但也会增加响应时间。即:位置的快速变化仅在一段时间后才会完全显示在平均位置数据中。(当然,平均数据会立即开始向该位置移动,但这需要一段时间。)它还会在一定程度上“让​​尖峰低谷”。

如果快速响应时间很重要并且应该消除数据中的任何主要“尖峰”,那么计算中位数是一个更好的选择。它不会过多地消除数据中的微小变化,但可以过滤掉随机尖峰。如果位置发生了真正的(永久的)突然变化,那么中值滤波会以非常小的延迟对此做出反应。

(这些东西很容易在您最喜欢的电子表格应用程序中试用。)

于 2016-05-08T08:12:27.730 回答