在特定时间获得最佳位置

Posted

技术标签:

【中文标题】在特定时间获得最佳位置【英文标题】:Get best possible location in certain time 【发布时间】:2016-04-29 08:52:19 【问题描述】:

在我的应用程序中,我需要获取用户位置(一次拍摄,而不是连续跟踪),以计算路线。因此,位置需要尽可能准确,但当我的应用尝试获取准确位置时,我不想让用户等待太久。

我正在使用这样的 Google Play 服务位置 api:

LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setNumUpdates(1); 
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest, this);
mLocationHandler.sendEmptyMessageDelayed(0, 15000); // Time out location request

我有 Handler mLocationHandler,它会在 15 秒后取消 locationRequest,因为我不想让用户等待太久。

如果高精度位置超时,有什么办法可以尝试获得不太准确的位置?

【问题讨论】:

【参考方案1】:

你可以在超时后试试这个,

Location currentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

它将为您提供最后一个已知位置,并检查准确性是否比您从位置更新中获得的要好。

像这样更新您的更新:

final LocationRequest REQUEST = LocationRequest.create()
        .setInterval(16)         
        .setFastestInterval(16)    // 16ms = 60fps
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

这将确保您获得更新。然后,您可以减少超时时间,不超过一秒就足够了。然后你可以像这样删除 locationupdaterequest:

if(mGoogleApiClient.isConnected())             
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);             

【讨论】:

在您的位置更新中,您可能希望在您的时间间隔内请求尽可能多的位置(延迟)然后选择最好的。 那么问题是,在某些情况下,我在间隔(15 秒)内没有得到任何位置更新。也许我需要设置除高精度以外的优先级? 更改您的位置更新。检查我更新的答案。 通常位置会在几秒钟内返回,但从分析中我可以看到有时会遇到超时。我不知道是大型建筑物内的用户还是什么,但无论如何应用程序都无法获取位置。在您更新的答案中,与我原来的 LocationRequest 没有太大区别,删除了 setNumUpdates。在我无法在原始请求中获取任何位置更新的情况下,这是否会产生任何影响? 如果服务可用,这将强制它在第一次更新后每 16 毫秒进行一次更新。但永远不会超过几秒钟......【参考方案2】:

我为此使用外部库:android-ReactiveLocation。检查 Cooler examples 部分,它准确地呈现了您想要的内容:

LocationRequest req = LocationRequest.create()
                         .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                         .setExpirationDuration(TimeUnit.SECONDS.toMillis(LOCATION_TIMEOUT_IN_SECONDS))
                         .setInterval(LOCATION_UPDATE_INTERVAL);

Observable<Location> goodEnoughQuicklyOrNothingObservable = locationProvider.getUpdatedLocation(req)
            .filter(new Func1<Location, Boolean>() 
                @Override
                public Boolean call(Location location) 
                    return location.getAccuracy() < SUFFICIENT_ACCURACY;
                
            )
            .timeout(LOCATION_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS, Observable.just((Location) null), AndroidSchedulers.mainThread())
            .first()
            .observeOn(AndroidSchedulers.mainThread());

goodEnoughQuicklyOrNothingObservable.subscribe(...);

【讨论】:

以上是关于在特定时间获得最佳位置的主要内容,如果未能解决你的问题,请参考以下文章

MySQL for Rails 在特定日期范围内每天获得 AVERAGE 的最佳方法

在代码中的哪个位置连接 Qt SIGNALS 和 SLOTS 以获得最佳代码可读性?

在 iOS 中,是不是可以在到达特定位置(或区域)时获得警报。 ?如果是,任何人都可以提供同样的例子吗?

从愿望清单中获得最佳分配[关闭]

如何获得 Angular 5 组件元素的位置?

PhoneGap 3.3:如何获得最佳准确性?