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

How to calculate sealevel pressure for given altitude and pressure

我正在写一个显示高度的表盘。海拔高度用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),差异是可以接受的。但是比如4000m,相差250m,已经不能接受了

现在我的问题是:我必须如何计算海平面,以便 setCurrentAltitude() 不会报告不同的值?

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

谢谢

关于 getAltitude() 的文档说:

Typically the atmospheric pressure is read from a TYPE_PRESSURE sensor. The pressure at sea level must be known, usually it can be retrieved from airport databases in the vicinity. If unknown, you can use PRESSURE_STANDARD_ATMOSPHERE as an approximation, but absolute altitudes won't be accurate.

To calculate altitude differences, you must calculate the difference between the altitudes at both points. If you don't know the altitude as sea level, you can use PRESSURE_STANDARD_ATMOSPHERE instead, which will give good results considering the range of pressure typically involved.

因此您可以使用 PRESSURE_STANDAR_ATMOSPERE 但它的值不能是 "right" 值。我的建议是使用 Google 播放融合位置 api,以获得更准确的值(主要来自 GPS)。您可以检查您的手表是否在代码中有 GPS,如果存在,直接使用可穿戴位置 API,否则向您的 phone 请求位置。

如果你是从一个高度校准(毕竟你有 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?), but you could use the lat and long to get altitude from this service: https://developers.google.com/maps/documentation/elevation/ 但这对在飞机上使用该应用程序的人不利!

但是,如果您为此准备了一项服务,那么不妨从一项服务中获得准确的海平面压力:http://www.worldweatheronline.com/api/marine-weather-api.aspx

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

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

这个效果很好!精度为 +/-30m。起点大约是 1200 米,我上升到 2700 米。

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