我是SatStat和Android应用程序的作者,其中包括在天空图中显示可见的GPS卫星。
在某些情况下,应用程序将以方位角和高度为零(或几乎为零)显示所有可见卫星,表明Android API正在返回虚假值。
如何过滤掉这些值并仅显示好的值?
示例截图位于https://f.cloud.github.com/assets/16572/1146040/ebc2e032-1e40-11e3-8232-905c1d9c8505.png(截图来自应用程序的旧版本,但错误仍然相同)。
相关代码(简化)是:
public class MainActivity implements GpsStatus.Listener {
// [...]
public void onGpsStatusChanged (int event) {
GpsStatus status = mLocationManager.getGpsStatus(null);
Iterable<GpsSatellite> sats = status.getSatellites();
gpsStatusView.showSats(sats);
}
}
只要方位角和高程都接近零,showSats()
方法就会生成logcat事件。
我在GPS启动后没有数据连接时再次遇到这种情况,表明该问题可能是由于GPS接收到信号的卫星丢失或不完整的轨道数据引起的。然而,另一次我遇到这个问题只是刷新AGPS数据(使用SatStat 1.7,它在请求更新之前检查网络连接),因此我应该有时间有效的AGPS数据。
在这两种情况下,logcat都有很多这样的条目:
12-27 22:34:37.761 D/GpsStatusView( 1403): Satellite 12, snr=33.000000, azimuth=0.000000, elevation=1.000000, almanac=false, ephemeris=false, used=false
12-27 22:34:37.761 D/GpsStatusView( 1403): Satellite 15, snr=35.000000, azimuth=0.000000, elevation=1.000000, almanac=false, ephemeris=false, used=false
12-27 22:34:37.765 D/GpsStatusView( 1403): Satellite 17, snr=29.000000, azimuth=0.000000, elevation=1.000000, almanac=false, ephemeris=false, used=false
12-27 22:34:37.765 D/GpsStatusView( 1403): Satellite 26, snr=33.000000, azimuth=0.000000, elevation=1.000000, almanac=false, ephemeris=false, used=false
有四颗卫星,全部方位角为零度,海拔高度为1度,没有历书,没有星历,也未用于修复。 (在上面链接的屏幕截图中,API会在视图中报告两个卫星并且都在修复中使用,这本身就很奇怪。)
所以我可以排除我的应用程序中的绘图错误 - 似乎Android API正在返回方位角和高程的伪造信息。显然,当卫星的轨道数据不可用时会发生这种情况。但是,我不知道在这种情况下Android是否使用固定的方位角/仰角组合,以及是否可以假设这些值在各设备之间保持一致。
关于如何检测方位角和仰角是否可靠的任何想法?有些错误是可以接受的,但我想过滤掉完整的虚假值。我放弃的想法:
hasAlmanac()
和hasEphemeris()
- 即使在修复中使用过的sats(也可能在我的设备上)都设置为false
,尽管有效数据仍留有空天图