Android GPS Location中的getAltitude()方法是如何工作的?

7

你好

我尝试实现一个简单的GPS跟踪器。因此我使用了

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);  

然后我使用了
public void onLocationChanged(Location location) {

读取当前位置海拔的方法。

但我不确定Location.getAltitude()返回的是什么。文档中说它返回海拔高度。但这是以米还是英尺为单位?如果我把手机放在我旁边的桌子上,这个值会在500和-500之间变化?

这到底是怎么回事?


8
不过,这并不是最好留给假设的事情(我们都知道在编程中假设会带来哪些问题)。特别是因为你所提到的国家是谷歌总部所在地。让我们承认文档可以改进一下。 - snapfractalpop
5个回答

25

你得到的海拔值是从GPS(WGS84) 参考椭球体而不是大地水准面测量的。

根据我自己的经验, GPS 测算高度值很不准确。

我在GPS状态FAQ中读到过这个:

GPS 不会报告相对于平均海平面的高度,而是将高度与 WGS84 参考椭球体进行比较,该椭球体可能高于或低于实际海平面。在地球不同的部分,它可能偏差超过200米(取决于地球的质量分布)。例如,在佛罗里达州周围,大地水准面以上高出平均海平面30-40米左右,这意味着站在海岸上时,海拔高度将显示为-30m左右。这是正常现象,不是错误,因为高度是相对于人工参考表面而不是相对于海平面计算的。如果你对此感兴趣,我建议阅读平均海平面、GPS和大地水准面


在一个相对局限的环境中,是否可以说测量结果是“精确但不准确的”?换句话说,GPS是否能够准确地测量附近点之间的相对高度? - snapfractalpop
@snapfractalpop:不,GPS并不适合测量高度。你应该使用气压计来测量高度,新一代的安卓手机都有这个功能,例如Nexus Galaxy。 - Jonas
1
谢谢,好知道。气压计由于天气干扰会有问题吗? - snapfractalpop
Location.getAltitude()addNmeaListener 有什么区别?因为从文档中可以看到,它们都是获取该位置相对于WGS84参考椭球体的海拔高度(以米为单位)。 - user924

6

这是一篇旧文章,但仍可能有人感兴趣。在听GPS时,您可以解析NMEA GPGGA语句(http://aprs.gids.nl/nmea/#gga),其中包含大地高(大地高度以上的WGS84椭球体)。只需从返回值中减去此高度即可获得更准确的海拔值。

经过数月使用和用户反馈后进行编辑

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

如果该字段已填写(这并非必须),且如果该句已输出(这也不是必须的),以及如果有任何NMEA输出;便宜的Android设备根本没有它。 - Jan Hudec
嗨Jan,当然,正如您可以在我的代码中看到的那样,在读取该值之前需要进行一些检查。我猜在更便宜的设备上,onNmeaReceived事件永远不会被触发 ;) - edestrero
确实有许多设备根本不返回NMEA,或者只返回其中的有限信息。 - Jan Hudec
如何找到安卓手机到放在桌子上的物体的距离?我可以使用这种方法还是我们有其他选择? - Anas Ahamed
Location.getAltitude() 和文档中描述的 The altitude of this location in meters above the WGS84 reference ellipsoid. 有什么不同呢?但是它们的值仍然不同... - user924

1

我假设你的桌子在建筑物内部。

如果你在建筑物内获取GPS定位,不应该期望精度非常高。

你尝试过通过调用getAccuracy()来获取定位的精度吗?


是的,它位于建筑物内,但我把它放在窗框上 ;)感谢您提供getAccuracy提示。 - RoflcoptrException

1
Gps简单地测量了几个卫星发送的已知信号的时间。您的Gps接收器所看到的卫星越多,您的位置相对于这些卫星的确定性就越高。尽管该系统容易出现一些错误——背景噪音(卫星信号相对较弱,空间相对较嘈杂)、接收器中低精度时钟、GDOP:几何精度稀释(所有卫星都聚集在天空的一个角落)、由于电离层高度变化而引起的信号折射——但总体上它非常准确地确定了您与卫星之间的距离。从几何角度来看,您需要至少看到3颗卫星才能获得一个位置,并且需要第4颗卫星才能获得高度。更多的卫星有助于提高精度,在一些更复杂的接收器(不是我们的手机,而是专门用于航空应用的)中,提供了RAIM:接收机自主完整性监测,以预测某个区域和时间的精度,例如在飞机着陆前......

海拔对于GPS系统来说是有问题的,因为地球并不呈数学常数曲线。因此,尽管该系统知道您相对于卫星的位置,但现在必须将其叠加在地球的数学模型上。在航空领域,更准确的GPS接收器必须使用气压计来补充高度,并且在一些接收器中,还可以通过已知测量点比较(WAAS和LAAS)来增强位置。


0

如果您使用LocationManager.NETWORK_PROVIDER作为位置提供者,可能会出现此问题,请确保使用LocationManager.GPS_PROVIDER作为您喜爱的GPS提供者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接