由于不包括大地水准面高度,Android的GPS高度是否不正确?

时间:2012-06-23 09:18:16

标签: android geolocation gps altitude

我正在测试一个记录位置的Android应用程序(lat / long / alt)。我在运行Android 2.2.1的三星GTS5830手机上运行应用程序

我在这里和那里读到GPS高度通常不正确,因为地球不是完美的球形。例如,在我的位置,the geoid's height是52米。

我的理解是,这个高度将从“纯”GPS高度中减去。这对我的位置有意义:

 - altitude from GPS phone: 535 m
 - geoid altitude: 52 m 
 - altitude from phone's GPS minus geoid height: 482m

 - correct atlitude: 478 m 

482足够接近我在远足时追踪高度的真实情况

  1. GPS高度的上述公式减去大地水准面的高度是否正确?
  2. 我是否正确地假设在返回GPS高度时android没有考虑大地水准面的高度?
  3. 如果以上情况属实,是否适用于所有版本的Android?
  4. 以下是我用来获取GPS坐标的代码:

    public class HelloAndroid extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            Log.d("main", "onCreate");
            setupGps();
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
    
        LocationListener locationListener;
        LocationManager lm;
    
        void setupGps() {
            Log.d("gps", "Setting up GPS...");
            locationListener = new MyLocationListener();
            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20000, 5,
                    locationListener);
    
            Log.d("gps",
                    "GPS supports altitude: "
                            + lm.getProvider(LocationManager.GPS_PROVIDER)
                                    .supportsAltitude());
            Log.d("gps", "Finished setting up GPS.");
        }
    
        static class MyLocationListener implements LocationListener {
    
            public void onLocationChanged(Location location) {
                Log.d("gps", "long: " + location.getLongitude() + ", lat: "
                        + location.getLatitude() + ", alt: "
                        + location.getAltitude());
            }
        }
    }
    

3 个答案:

答案 0 :(得分:6)

你所有三个问题的答案都是肯定的。

从GPS获得的高度是WGS84椭球的高度,以米为单位,是地球表面的近似值。我知道,因为我一直在开发使用它的Android软件。

必须进行修正以将数字转换为高于平均海平面或高度的高度,如通常所知。请注意,这可能与设置为平均海平面当前压力的高度计报告的海拔高度不同,因为高度计实际测量气压,但气压不仅仅是高度的函数;它也是空气密度和温度的函数,因此高度计显示近似值。 GPS无法看到这种效果。

2008年地球引力模型(EGM2008)将平均海平面的差异与椭圆体作为经度和纬度的函数进行映射。详情如下:

http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/egm08_wgs84.html

还可以使用名为EGM96的较少数据的不太准确的模型。谷歌这些都可以更好地理解这些。

答案 1 :(得分:5)

这并不是那么简单 - Android API已经改变或有错误。我有两个Android设备 - 一个'通用'手机(Android 2.3.6)和一个Nexus 7Android 4.x)。

在电话上,getAltitude()会给出与我的实际海拔AMSL一致的答案(即已更正为geoid)。在Nexus 7上,返回的高度未经校正。 API的文档未指定返回的文档 - 因此在某种意义上两者都是“正确的”。

两个设备似乎都有不错的GPS modules - $GPGGA NMEA消息显示正确的高架和大地水准面校正。所以看起来好像必须自己解析消息以获得正确的高度,而getAltitude()方法是不值得信任的。

答案 2 :(得分:4)

高度错误可能不会降至GPS和大地水准面高度分离。

任何GPS接收器返回的高度值始终是最不准确的值。我经常看到我的办公楼报告说它在-200到+750米的高度移动。一个根本原因是不可能在高度方向上获得均匀的卫星传播;它们总是在你的上方,如果在低海拔处有天空遮挡,它们将位于你上方的圆锥中。在X和Y方向上,假设天空视野良好,将始终是左右传播的卫星;在接收器的前面和后面。这种扩展提高了定位解决方案的准确性。