Android GPS位置的getAltitude()如何工作

时间:2010-05-07 22:01:12

标签: android gps locationmanager wgs84

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之间变化

这是如何运作的?

5 个答案:

答案 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)

老帖子,我rekon,但有人可能仍然感兴趣。 在听GPS时,你可以解析NMEA GPGGA句子(http://aprs.gids.nl/nmea/#gga),其中有大地水准面高度(WGS84椭圆体上方的大地水准面高度)。 只需从getAltitude返回的值中减去这个高度,就可以得到一个更精确的高程值。

使用几个月后进行修改,并从我的应用用户那里收到反馈

更好的解决方案是直接获取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。