谷歌提供了融合的位置提供商API来获取位置坐标。根据文档,API内部轮询来自不同提供商(GPS、Wifi、蜂窝网络)的位置数据,并提供最佳位置。但是,在高精度模式下,我收集了以下信息。在本测试中,GPS始终处于开启状态。
Latitude: 12.8560136
Longitude: 80.1997696
User Activity: IN VEHICLE
Speed: 21.810165 mph
Altitude: -83.0
Accuracy: 12.0
当我在地图上看到这个点时,这些点不在路上。他们离马路稍微远一点。具有相同精度的其他点绘制在道路上。当我完全变焦并查看时,一些点与行驶的道路路径略有距离。
我想要准确的信息。它指向的一定是道路路径。
我使用了融合位置API来获取位置信息。
mGoogleApiClient = new GoogleApiClient.Builder(mContext)
.addApi(LocationServices.API).addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
分享你的建议。如果我使用位置管理器,它将解决我的问题。而且我只需要消耗更少的电池。Fused API保证它只消耗更少的功率和更高的效率。
此外,融合位置API还存在以下问题,
请帮我解决这个问题。提前谢谢。
您无法击败融合式提供商的准确度或直接定位提供商的功耗。
融合的位置提供者以米每秒报告速度,以米报告精度。你手上的例子精确到12米。美国车道被定义为3.7米。对于12米的精度,您可以在任何方向上偏离12/3.7=3.25条车道。这话我怎么说都不为过。如果你想要准确,你必须检查位置的准确性。
GPS_PROVIDER如何提高精度
更新手机上的LatLng和返回错误值之间的距离
在android中找不到准确的当前位置
Android地图GPS异常值
融合位置提供程序意外行为
调整你的程序来处理点的准确性。例如,假设该点是正确的,在该点周围画一个圆,半径=位置的精确度。
来自GPS和其他提供商的位置数据不能保证在路上。这些传感器不具备将原始位置信号捕捉到道路上所需的绘图环境。要使用原始数据实现这一点,可以使用捕捉到道路API。像谷歌地图和OSM这样的地图提供商有办法做到这一点:
如果您正在寻找一种端到端的解决方案,可以在路上为您提供位置数据,您也可以尝试Android的HyperTrack SDK,它可以收集和处理位置数据,以提高其准确性。(声明:我在HyperTrack工作。)
此外,为了回答您的另一个问题,FusedLocationProviderApi
不会公开卫星计数和提供程序信息。若要获取提供程序信息,可以设置 GpsStatus.Listener
类。这可以与应用中的融合提供程序并行使用,以检查设备是否具有 GPS 定位。您可以使用以下代码片段进行设置:
public class GPSStatusListener implements GpsStatus.Listener {
private LocationManager locationManager;
private boolean gpsFix;
public GPSStatusListener(LocationManager locationManager) {
this.locationManager = locationManager;
}
@Override
public void onGpsStatusChanged(int changeType) {
if (locationManager != null) {
try {
GpsStatus status = locationManager.getGpsStatus(null);
switch (changeType) {
case GpsStatus.GPS_EVENT_FIRST_FIX: // Received first fix
gpsFix = true;
break;
case GpsStatus.GPS_EVENT_SATELLITE_STATUS: // Check if satellites are in fix
for (GpsSatellite sat : status.getSatellites()) {
if (sat.usedInFix()) {
gpsFix = true;
break;
} else {
gpsFix = false;
}
}
break;
case GpsStatus.GPS_EVENT_STARTED: // GPS turned on
gpsFix = false;
break;
case GpsStatus.GPS_EVENT_STOPPED: // GPS turned off
gpsFix = false;
break;
default:
gpsFix = false;
return;
}
} catch (Exception e){
// Handle exception
}
}
}
public String getProvider() {
if (gpsFix) {
return "gps";
} else {
return "non_gps";
}
}
}