我遇到了在Android中获取当前位置的问题。
我正在使用android的FusedLocationAPI。但我得到的经纬度并不准确。我将这些凭据粘贴在谷歌地图上,它显示的是我的位置与我的准确位置不同。
我还试图通过Location.getAccuracy()
获取位置更新并验证其准确性,此处我获得的最低精度为10米。
在这里,我使用精确位置作为权限。
所以我的问题是,如何才能获得准确的位置,换句话说,精度不到5米。?
我的代码是
GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.enableAutoManage(this, this)
.build();
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setSmallestDisplacement(1);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,mLocationRequest,MainActivity.this);
@Override
public void onLocationChanged(Location location) {
Toast.makeText(MainActivity.this,";-"+location.getAccuracy(),Toast.LENGTH_LONG).show();
if(location.hasAccuracy() && location.getAccuracy()<lastLocationAccuracy){
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
答案 0 :(得分:1)
我搜索了很多,使用融合位置API我找不到任何关于10准确度的信息。
如果您看到Google IO演示文稿,则会显示一个图表,显示识别算法的不同优先级在Galaxy Nexus上多次测试的效果。
如果您想获得低于10的准确度,那么您可以使用GPS,但它还取决于设备,GPS,WiFi,手机信号塔,蓝牙等......
如果GPS硬件可以接收WAAS校正,它可以做得更好,最差情况大约为7.6米,最佳情况为1-2米。
答案 1 :(得分:1)
如何获得准确的位置,换句话说,精度小于5米?
使用位置时,了解您可以请求某种准确性非常重要,但您无法保证在实际位置更新中获得准确性。
您通常不希望获得准确度高的位置更新&lt; 5米。这取决于许多因素,最重要的是设备的功能和物理环境。
FusedLocationApi 在幕后做了很多魔术。除此之外,它还试图找出使用哪些提供商(GPS,WiFi,手机信号塔,蓝牙等)。这些提供商中的每一个在准确性,更新频率和电池消耗方面都有优缺点。然后它会融合来自不同提供商的信息,因此得名。
示例1 :如果你在纽约市的一个城市峡谷,你将很难获得一个良好和准确的GPS修复。另一方面,周围将有大量的WiFi网络,这些网络已经过Google映射和地理配准。所以你可能会得到一个快速的位置修复。准确性将取决于WiFi网络的密度,更重要的是取决于墙壁/建筑物的密度。我不希望在这里得到比15-30米更准确的东西。
示例2 :如果你在某个地方的沙漠中,那就是另一种方式。最有可能的是,附近不会有任何WiFi网络,但你会得到一个清晰的GPS修复。在这里,您可以期待位置更新&lt;准确度为5米。
您的设置看起来正确无误。选择高更新率和高优先级将确保GPS用作提供商(如果在设备上可用)。确保您在外面测试您的应用程序,并清楚地看到天空。如果您继续接收真正遥远的位置,请使用其他设备进行测试。如果它仍然无法正常工作,那么您的代码就会出现问题。 您可能希望使用实用程序类,例如LocationAssistant(完全披露:我是该项目的作者),以确保您正确设置所有内容。
最后,我想澄清一下我在其他评论中看到的两种常见错误观念:
如文档中所述,Location.getAccuracy()将返回位置读数的估计准确度。这是最好的猜测(通常基于高斯误差模型),这可能是遥远的。我已经看到融合位置声称精确度为3m
并且实际上超过100m
的情况。所以不依赖它来获得关键功能。
ACCESS_FINE_LOCATION
权限足以获得高准确度的更新。 无需另外指定 ACCESS_COARSE_LOCATION
。