如何计算给定高度和压力下的海平面气压

时间:2015-03-01 09:45:22

标签: java android wear-os

我正在写一个显示海拔高度的表盘。海拔高度使用SensorManager.getAltitude(seaLevelPressure, currentPresure)计算。

但是为了初始化这个我需要海平面的压力。不幸的是,没有SensorManager.getSeaLevelPressure(currentPressure,currentAltitude)

为此,我找到了以下公式(见http://rechneronline.de/barometer/

private float calcSeaPressure(float pressure, int altitude) {
  float temperature = 9 + 273.15f;
  float tempGradient = 0.0065f;

  float v3 = temperature + tempGradient * altitude;
  float sealevelPressure = (float) (pressure / Math.pow((1 - tempGradient * altitude / v3), .03416f / tempGradient));
  sealevelPressure = (float) Math.round(sealevelPressure * 100) / 100;
  return sealevelPressure;
}

但似乎这个算法和SensorManager.getAltitude中使用的算法并不适合。如果我这样做:

public void setCurrentAltitude(int currentAltitude) {
  sealLevelPressure = calcSealevel(currentAltitude,currentPresure);
  altitude = SensorManager.getAltitude(seaLevelPressure, currentPresure)
}

计算的高度与给定的currentAltitude不同。对于小值(<1000m),差异是可接受的。但是例如4000米,差异是250米,这是不可接受的。

现在我的问题:我如何计算sealevel,以便setCurrentAltitude()不报告不同的值?

或者你知道其他Java类可用于此吗? 请记住,应该计算值!

由于

3 个答案:

答案 0 :(得分:2)

如果你是从海拔高度校准(毕竟你有setCurrentAltitude方法),那么这就是技巧:

public void setCalibrationAltitudeAndPressure(float calibrationAltitude, float currentPressure) {
   this.calibrationAltitude = calibrationAltitude;
   this.calibrationPressure = currentPressure;
}

public float getCurrentAltitude(float currentPressure) {
    float altitudeDifference =
            sensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, currentPressure) -
            sensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, calibrationPresure);
    return calibrationAltitude + altitudeDifference;
}

现在你不需要关心海平面压力。

校准

您需要校准高度,您可以使用GPS进行此操作。它的高度可能不那么准确(参见Android: How to get accurate altitude?),但您可以使用lat和long来获得此服务的高度:https://developers.google.com/maps/documentation/elevation/但这对于在飞机上使用该应用程序的人来说并不好!

但如果您正在为此服务,那么也可以从服务中获得准确的海平面压力:http://www.worldweatheronline.com/api/marine-weather-api.aspx

答案 1 :(得分:1)

有关getAltitude()的文档说:

  

通常,从TYPE_PRESSURE传感器读取大气压。必须知道海平面的压力,通常可以从附近的机场数据库中检索。如果未知,您可以使用PRESSURE_STANDARD_ATMOSPHERE作为近似值,但绝对高度不会准确。

     

要计算高度差异,您必须计算两个点的高度之间的差异。如果您不知道海拔高度,则可以使用PRESSURE_STANDARD_ATMOSPHERE,考虑到通常涉及的压力范围,这将产生良好的结果。

所以你可以使用PRESSURE_STANDAR_ATMOSPERE,但它不能成为&#34;对&#34;值。我的建议是使用Google Play融合位置API,以获得更准确的价值(主要来自GPS)。您可以检查您的手表是否在代码中包含GPS,如果有,请直接使用可穿戴位置API,否则请将位置请求到您的手机。

答案 2 :(得分:1)

我现在已经在阿尔卑斯山的滑雪假期,可以验证传感器的准确性和高度的计算。我使用了以下公式

sensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, currentPressure) 
- sensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, calibrationPresure);

这非常好用!准确度为+/- 30米。起点是1200米,我上升到2700米。

我现在自豪地拥有一个新的高度计: - )