HI
我试图实现一个简单的GPS追踪器。因此使用
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
然后我用了
public void onLocationChanged(Location location) {
读取当前位置高度的方法。
但我真的不知道Location.getAltitude()返回什么。该文件说它返回了海拔高度。但这是米吗?还是脚?如果我把手机放在我旁边的桌子上,这个值会在500和-500之间变化
这是如何运作的?
答案 0 :(得分:24)
您获得的海拔高度值距the gps (WGS84) reference ellipsoid而不是geoid。
根据我自己的经验,GPS在高度值方面非常糟糕。
我在GPS Status常见问题解答
上看到了这一点GPS不报告高于平均海平面的高度,而是GPS系统将高度与WGS84参考椭球进行比较,该椭圆可能高于或低于实际海平面。在地球的不同地区,它可以超过200米(取决于地球的质量分布)。例如,佛罗里达州大地水准面的表面高出平均海平面30-40米,这意味着站在岸边将显示-30米的高度。这是正常的,而不是错误,并且由高度相对于人造参考表面而不是海平面的事实引起。如果您对此主题感兴趣,建议您阅读Mean Sea Level, GPS, and the Geoid。
答案 1 :(得分:5)
使用几个月后进行修改,并从我的应用用户那里收到反馈
更好的解决方案是直接获取GPGGA句子中的高程值:
double GGA_ALTITUDE = 0d;
private static final String NMEA_GGA = "$GPGGA";
private static final int altitude_element_id = 9;
@Override
public void onNmeaReceived(long timestamp, String nmea) {
foundSats = true;
// check that this is an RMC string
if (nmea.startsWith(NMEA_GGA)) {
String[] tokens = nmea.split(",");
try {
// get orthometric elevation
String elevation = tokens[altitude_element_id];
if (!elevation.equals("")) {
Log.d("NMEA", "ortho elev: " + ortho);
GGA_ALTITUDE = Double.parseDouble(elevation);
}
} catch (Exception ex) {
Log.e("NMEA", "onNmeaReceived: "
+ ex.getMessage());
onNmeaException(ex.getMessage());
ex.printStackTrace();
}
}
}
答案 2 :(得分:1)
我认为你的桌子位于建筑物内。 如果您在建筑物中获得GPS定位,则不应期望精度非常高。 必须通过调用getAccuracy()来尝试获得修复的准确性吗?
答案 3 :(得分:1)
Gps只测量从几颗卫星发送已知信号的时间。从Gps接收器看到的卫星越多,相对于这些卫星的位置就越准确。虽然系统容易出现一些错误 - 背景噪声(卫星信号相对较弱且空间相对嘈杂),接收机中的精度低的时间片,GDOP:几何精度的稀疏性(所有卫星分组在天空的一个角落),由于电离层的高度变化导致的信号折射,总体而言,它在确定距离卫星的距离时非常准确。从几何学角度来看,您需要至少3颗卫星才能获得一个位置,而第4颗卫星需要获得高度。更多的卫星有助于提高准确度,在一些更复杂的接收机(不是我们的手机,特别是航空应用)中,RAIM:接收机自主完整性监测,用于预测某个区域和时间的准确性,即在飞机着陆之前......
高度是gps系统的问题,因为地球不会在数学常数处弯曲。因此,虽然系统知道您相对于卫星的位置,但现在必须将其覆盖在地球的数学模型上。在航空领域,由于已知的调查点比较(WAAS和LAAS),更准确的Gps接收器必须具有高度补充气压计,并且在一些接收器中增强位置。
答案 4 :(得分:0)
当您使用LocationManager.NETWORK_PROVIDER(如位置提供程序)时,会出现这种情况,请确保使用与您喜欢的Gps提供程序一样的LocationManager.GPS_PROVIDER。