gps-Android:如何获取准确的海拔高度?
我只需要使用GPS即可准确测量高度。
我尝试了Location.getAltitude(),但这非常不准确。有什么建议吗?
7个解决方案
57 votes
使用智能手机/平板电脑GPS的高度有两个问题:
高度是WGS84参考椭球上方的高度。 它不是高于地面或海平面的高度。 这方面的详细信息:[/forumsen/topic.asp?TOPIC_ID=10915。 这里是如何手工执行的描述:[/edu_outreach/tutorial/geoidcorr.html。 我不知道是否还有可用于此计算的Web服务。
对于相对便宜的GPS接收器,GPS高度非常不准确。 这里是有关此的文章:[/main/altitude.htm。]应对这种错误的一种方法是过滤海拔数据。 我使用了一个圆形数组数据结构来记住最后几个(我使用了4个)海拔读数并计算平均值。 对于我的应用程序而言,这足以获得相对准确的垂直速度读数。
Stefan answered -01-14T00:46:02Z
4 votes
另一种方法是解析NMEA字符串。 $ GPGGA语句已包含海拔以上的更正高度数据。
因此,只需为LocationManager创建一个NMEA字符串侦听器并解析消息:
private GpsStatus.NmeaListener mNmeaListener = new GpsStatus.NmeaListener() {
@Override
public void onNmeaReceived(long timestamp, String nmea) {
parseNmeaString(nmea);
}
};
public void registerLocationManager(Context context) {
mLocationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
mLocationManager.addNmeaListener(mNmeaListener);
}
private void parseNmeaString(String line) {
if (line.startsWith("$")) {
String[] tokens = line.split(",");
String type = tokens[0];
// Parse altitude above sea level, Detailed description of NMEA string here http://aprs.gids.nl/nmea/#gga
if (type.startsWith("$GPGGA")) {
if (!tokens[9].isEmpty()) {
mLastMslAltitude = Double.parseDouble(tokens[9]);
}
}
}
}
您可以替换通过位置侦听器收到的最后一个位置对象的高度,也可以通过NMEA解析整个新位置。
sladstaetter answered -01-14T00:46:31Z
1 votes
除了GPS以外,还有其他获取高度的方法。 您可以使用气压计,但是因为还没有很多配备气压传感器的设备(只有新设备)。 我将建议使用Web服务来获取所需的数据。
这是一个可以帮助您解决的问题:在Android中按经度和纬度获取海拔高度
7heViking answered -01-14T00:46:56Z
1 votes
另一种方法是从气压计测量高度。
通过使用压力,您可以计算用户的高度。 我不确定此方法的精确度以及它是否比其他答案的方法更准确。
通过使用测压公式,您可以计算海拔高度:
变量定义:
P0: Sea-level pressure
P: Atmospheric pressure
T: Temperature
您可以从环境传感器获取android中的压力
SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE,pressure)
Jonas Praem answered -01-14T00:47:33Z
0 votes
对于新手,我制作了一个库,将LocationManager包装到rxjava可观察对象中,并添加了一些可观察的帮助程序,以从Nmea / GPGGA获取海平面高度信息。
Samuel Eminet answered -01-14T00:47:54Z
0 votes
有一些库,例如开放源代码的CS-Map,提供了在大型表中执行这些查找的API。 您指定坐标,它将告诉您需要将该高度应用于该位置处的椭球高度的高度偏移量,以获取“真实世界”的正交高度。
注意:以前使用过CS-Map,插入它并不是5分钟的直截了当的工作。提前警告您,这比调用带有一组经纬度坐标的单个API并获取要复杂得多。 退后身高。 我不再在我们从事此类工作的公司工作,因此很遗憾,无法查找代码来确切说明要调用的API。
现在()在Google上进行搜索,似乎CS-Map已被合并到OSGeo中的MetaCRS中,OSGeo是“开源地理空间基金会”项目。 相同的搜索将我带到了旧的CS-Map Wiki以及PROJ GitHub页面,其中PROJ似乎与CS-Map类似。
Stéphane answered -01-14T00:48:24Z
0 votes
我建议将NmeaListener用作sladstaetter建议在他的答案。 但是,根据NMEA文档,“ $ GPGGA”不是唯一的句子。 您应该查找任何“ GGA”句子($-GGA)。
正则表达式非常有用,例如:
@Override
public void onNmeaReceived(final long timestamp, final String nmea) {
final Pattern pattern = pile("\\$..GGA,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([+-]?\\d+(.\\d+)?),[^,]*,[^,]*,[^,]*,[^,]*,[^,]*$");
final Matcher matcher = pattern.matcher(nmea);
if (matcher.find()) {
final float altitude = Float.parseFloat(matcher.group(1));
// ...enjoy the altitude!
}
}
Berťák answered -01-14T00:54:28Z