android 海拔高度_gps-Android:如何获取准确的海拔高度?

gps-Android:如何获取准确的海拔高度?

我只需要使用GPS即可准确测量高度。

我尝试了Location.getAltitude(),但这非常不准确。有什么建议吗?

7个解决方案

57 votes

使用智能手机/平板电脑GPS的高度有两个问题:

高度是WGS84参考椭球上方的高度。 它不是高于地面或海平面的高度。 这方面的详细信息:[http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=10915。 这里是如何手工执行的描述:[http://www.unavco.org/edu_outreach/tutorial/geoidcorr.html。 我不知道是否还有可用于此计算的Web服务。

对于相对便宜的GPS接收器,GPS高度非常不准确。 这里是有关此的文章:[http://gpsinformation.net/main/altitude.htm。]应对这种错误的一种方法是过滤海拔数据。 我使用了一个圆形数组数据结构来记住最后几个(我使用了4个)海拔读数并计算平均值。 对于我的应用程序而言,这足以获得相对准确的垂直速度读数。

Stefan answered 2020-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 2020-01-14T00:46:31Z

1 votes

除了GPS以外,还有其他获取高度的方法。 您可以使用气压计,但是因为还没有很多配备气压传感器的设备(只有新设备)。 我将建议使用Web服务来获取所需的数据。

这是一个可以帮助您解决的问题:在Android中按经度和纬度获取海拔高度

7heViking answered 2020-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 2020-01-14T00:47:33Z

0 votes

对于新手,我制作了一个库,将LocationManager包装到rxjava可观察对象中,并添加了一些可观察的帮助程序,以从Nmea / GPGGA获取海平面高度信息。

Samuel Eminet answered 2020-01-14T00:47:54Z

0 votes

有一些库,例如开放源代码的CS-Map,提供了在大型表中执行这些查找的API。 您指定坐标,它将告诉您需要将该高度应用于该位置处的椭球高度的高度偏移量,以获取“真实世界”的正交高度。

注意:以前使用过CS-Map,插入它并不是5分钟的直截了当的工作。提前警告您,这比调用带有一组经纬度坐标的单个API并获取要复杂得多。 退后身高。 我不再在我们从事此类工作的公司工作,因此很遗憾,无法查找代码来确切说明要调用的API。

现在(2019年)在Google上进行搜索,似乎CS-Map已被合并到OSGeo中的MetaCRS中,OSGeo是“开源地理空间基金会”项目。 相同的搜索将我带到了旧的CS-Map Wiki以及PROJ GitHub页面,其中PROJ似乎与CS-Map类似。

Stéphane answered 2020-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 = Pattern.compile("\\$..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 2020-01-14T00:54:28Z

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用高德地图的Web服务API来获取经纬度对应的海拔高度。具体步骤如下: 1. 首先,你需要在高德开放平台上注册一个开发者账号,并创建一个应用,获取应用的API Key。 2. 使用Java的HttpURLConnection类或者OkHttp库发送HTTP请求到高德地图Web服务API的URL,将经纬度作为查询参数发送到API。例如: ``` https://restapi.amap.com/v3/geocode/regeo?key=YOUR_API_KEY&location=116.481488,39.990464&poitype=&radius=1000&extensions=all&batch=false&roadlevel=0 ``` 其中,YOUR_API_KEY是你在高德开放平台上获取的API Key,location参数是经纬度,poitype参数表示查询的POI类型,radius参数表示查询半径,extensions参数表示返回结果的扩展信息,batch参数表示是否批量查询,roadlevel参数表示道路等级。 3. 解析API返回的JSON格式结果,获取海拔高度信息。可以使用Java自带的JSON库或者第三方库如Gson来进行JSON解析。例如: ``` import com.google.gson.JsonObject; import com.google.gson.JsonParser; String result = sendGetRequest(apiUrl); JsonObject jsonObject = new JsonParser().parse(result).getAsJsonObject(); double altitude = jsonObject.get("elevation").getAsDouble(); ``` 其中,sendGetRequest是发送HTTP请求的方法,elevation是API返回结果中表示海拔高度的属性。 需要注意的是,高德地图Web服务API是收费的,每天有免费的调用次数限制,超过限制后需要付费购买。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值