我正在写一个显示海拔高度的表盘。海拔高度使用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类可用于此吗? 请记住,应该计算值!
由于
答案 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米。
我现在自豪地拥有一个新的高度计: - )