Android GPS位置的GetAltitude()如何工作
-
04-10-2019 - |
题
你好
我试图实现一个简单的GPS跟踪器。因此被使用
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
然后我用了
public void onLocationChanged(Location location) {
读取我当前位置的高度的方法。
但是我真的不知道哪个位置。getaltitude()返回。该文件说它返回了高度。但这是米吗?还是feets?如果我将手机放在我旁边的桌子上,则此值在500和-500之间会更改?
这是如何真正起作用的???
解决方案
您获得的高度价值是从 GPS(WGS84) 参考椭圆形 而不是来自 Geoid.
根据我自己的经验,GPS在高度值中确实很糟糕。
我在 GPS状态 常问问题:
GPS不会报告高于平均海平面的高度,而GPS系统将高度与可能高于实际海平面或低于实际海平面的WGS84参考椭圆形进行了比较。在地球的不同地区,它可以熄灭200米以上(取决于地球的质量分布)。例如,佛罗里达州周围的地球表面高于平均海平面,高30-40米,这意味着站在岸上将显示-30m作为高度。这是正常的,而不是错误,并且是由于高度相对于人工参考表面而不是海平面而引起的。如果您对此主题感兴趣,我建议阅读 平均海平面,GPS和Geoid.
其他提示
我的旧帖子,我雷龙,但是有人可能仍然很感兴趣。在听GPS时,您可以解析NMEA GPGGA句子(http://aprs.gids.nl/nmea/#gga),其中有地质高度(wgs84椭圆形上方的地质高度)。只需从恢复的恢复值中减去此heigh,一个,您将具有更准确的高程值。
经过几个月的使用和从我的应用程序的用户收到的反馈后进行编辑
一个更好的解决方案是直接获得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();
}
}
}
我认为您的桌子位于建筑物内。如果您在建筑物中获得GPS修复,则不应指望准确性很高。必须尝试通过调用getAccuracy()来获得修复程序的准确性?
GPS只是测量从几个卫星发送已知信号的时间。鉴于您的GPS接收器,卫星越多,相对于这些卫星,您的位置就越准确。虽然系统容易出现一些错误的背景噪声(卫星信号相对较弱,空间相对嘈杂),但接收器中的精确时间较低,GDOP:几何精度的钻孔(所有卫星都在天空的一个角落),,由于电离层变化而引起的信号的折射 - 总的来说,确定与卫星的距离非常准确。从几何上讲,您至少需要3颗卫星才能获得位置和第四个卫星才能获得高度。更多的卫星有助于更高的准确性,并且在一些更复杂的接收器(不是我们的电话,而是特别是航空应用程序)中,RAIM:接收器自主性完整性监视,以预测在飞机陆地之前的区域和时间的准确性...
高度对于GPS系统是有问题的,因为地球不会在数学常数处弯曲。因此,尽管系统知道您相对于卫星的位置,但现在必须将其覆盖在地球的数学模型上。在航空中,由于已知的调查点比较(WAAS和LAAS),更准确的GPS接收器必须具有高度补充气压计,并且在某些接收器中增强了位置。
这发生在您使用locustantmanager.network_provider之类的位置提供商之类的地方,请确保您使用locutionmanager.gps_provider,例如您喜欢的GPS提供商。