如何使地理围栏准确?

Posted

技术标签:

【中文标题】如何使地理围栏准确?【英文标题】:How to make geofences accurate? 【发布时间】:2015-10-24 10:30:46 【问题描述】:

我在地理围栏的准确性方面存在问题,因为用户的位置主要由完全糟糕的移动网络确定。

我的应用在选定地点周围使用地理围栏,当用户进入这些地方时会执行一些操作...我确认我的应用确实可以工作,因为当我打开谷歌地图时,位置的准确性会提高,然后我的地理围栏就会被触发。

我当前的解决方案是使用 GPS 提供商的位置管理器,每分钟获取一次位置,但它似乎会影响电池寿命,并且会在一段时间后停止。

我的问题是:例如,有没有办法使地理围栏精确到 60 m 半径?或者有什么方法可以获取用户的精确位置更新?

提前致谢

【问题讨论】:

您可以同时使用 GSM 和 GPS 数据来提高您的位置检测性能。通过 GPS 检测位置的一个很好的例子可以在这里找到,***.com/questions/6181704/… 谢谢,但我的应用需要立即触发地理围栏。我不需要每 30 分钟左右获取一次位置 is there a way to make geofences accurate to a 60 mO。这个问题是错误的,因为它仅取决于位置提供者的精度。智能手机中的 GPS 芯片并不是那么好。但是60米不好。许多手机可以做到 15 m 或更短。 【参考方案1】:

通过关注此线程,您将对准确性有更好的了解:

How to make Geo Fencing alert more accurate in android

创建地理围栏后,您可以开始 ping GPS,直到您获得 ENTER 转换。我试过这种方法,我得到了更好的准确性。

简单的 ping GPS 服务:

public class GPSService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener 

GoogleApiClient mGoogleApiClient;
LocationRequest locationRequest;

public GPSService() 


@Override
public IBinder onBind(Intent intent) 
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");


@Override
public void onCreate() 
    super.onCreate();


    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    mGoogleApiClient.connect();




@Override
public void onLocationChanged(Location location) 


    Utility.ReadAndWriteData(this, Utility.readFileName(this), "Still Geofence is not triggered!!!");



@Override
public void onConnected(Bundle bundle) 

    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setFastestInterval(1000);
    locationRequest.setInterval(2000);
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this);



@Override
public void onConnectionFailed(ConnectionResult connectionResult) 



@Override
public void onConnectionSuspended(int i) 



@Override
public void onDestroy() 
    super.onDestroy();

    if(mGoogleApiClient.isConnected()) 

        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);

    
 

【讨论】:

我的应用程序总是在后台运行,所以我认为轮询 gps 总是会影响电池寿命,如上所述...我需要知道如何准确 ping gps,我应该使用位置管理器吗?我应该设置什么最短时间和最短距离? @Dev :实际上您只需要 ping GPS 直到您当前的地理围栏将通过 ENTER 转换触发。因此,当您在创建地理围栏后编写代码来创建地理围栏时,您将开始 ping 您的 GPS。一旦你将获得 ENTER 转换,你必须停止 ping 它。而已。正如你所提到的,在地理围栏的情况下,60M 的半径非常小,所以如果你可以增加至少 500M,所以你会得到更好的结果,因为在更小的半径内它无法跟踪过渡 @Dev : 在上面添加了简单的服务调用 如果用户进入另一个地理围栏怎么办?在这种情况下,该应用程序将无法运行,因为我在用户位置附近注册了 20 个地理围栏 你好@Jai,我今天要试试这个:)

以上是关于如何使地理围栏准确?的主要内容,如果未能解决你的问题,请参考以下文章

Android:提高地理围栏的准确性

地理围栏的准确性是不是取决于 locationManager 的准确性或距离过滤器?

Android 地理围栏 PRIORITY_HIGH_ACCURACY 不准确

如何在 android 地理围栏中实现“取消驻留”?

Android:如何让用户为其他被跟踪用户创建地理围栏?

在后台更新低准确度的地理围栏,以高精度更新地图上的位置,无法按预期工作