今天晚上cba:如果是晚上或晚上 为什么高度会改变

我有以下代码:

public SensorEventListener sensorEventListener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {
        float pressure_value = 0.0f;
        float height = 0.0f;
        if (Sensor.TYPE_PRESSURE == event.sensor.getType())
        {
            pressure_value = event.values[0];
            height = SensorManager.getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure_value);
        }
        value = String.valueOf(height);
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
};

我在 09.AM 拿到了高度计 43,x。

我在 09.PM 再次检查它,结果正在改变。它改变了 2 米或更多。

是因为月球或其他东西改变了压力吗?

以及如何解决这个问题?

我已经阅读了以下线程:Android: How to get accurate altitude?

但我仍然感到困惑。你能指导我如何编写代码吗?

7

气压计提供压力读数,而不是高度读数。

现在,由于存在压力梯度,并且通常它会随高度而降低,因此从理论上讲,您可以从压力差中推断出高度差。使用未校准的高度计,您只知道这一点:您不知道当前的高度,但是您将知道何时爬升或下降以及下降多少。

要根据当前压力计算高度,您需要一个参考压力。例如,您需要知道海平面上的压力。因此,如果在海平面上的压力为 x hPa,而您的气压计读数为 x 3 hPa,并且您知道压力每米增加 1 hPa,则您的高度将高于海平面 3 m。

问题是,由于气象现象,任何参考压力都会一直在变化。因此,它在某个区域只能在一段时间内有效。为飞机提供此信息,以便他们可以将其高度计设置为正确的参考压力 (例如,QNH)。一旦你知道这个参考压力归一化到海平面 (QNH 不是,你最好使用QFF),你可以把它作为第一个方法:

SensorManager.getAltitude(<reference pressure at sea level>, pressure_value);

请记住,您不能对参考压力进行硬编码。它不断变化,例如温度。您需要在互联网上或使用航空气象服务进行查找。

4

昼夜之间的温度变化会导致气压差异,这就是您获得不同高度读数的原因。如果您可以考虑温度的影响,则可以纠正错误。

3

大气压力传感器可测量传感器上方空气柱的压力-它不能测量地面上方的高度。幸运的是,存在(大部分)直接相关性。但是,空气压缩和膨胀,并且色谱柱施加的压力不是恒定的。需要针对空气密度的这种局部变化来校正压力与高度之间的相关性。这种校正对飞机飞行员来说非常重要,因此确保每个都可以免费获得该信息。

因为温度和气压一直在随机变化,所以要最准确,您需要知道您所在地区的当前标准压力。

您可以首先获取最近的当前气压计值,然后使用该值而不是 PRESSURE_STANDARD_ATMOSPHERE。您需要知道车站 ID,或指定一个纬度 / 长度矩形。请参阅METAR station specifications

但是...如果您当前的误差只有 2 米,那已经很好了,您永远不会从气压高度计获得确切的高度-这就是发明雷达高度计的原因。

http://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=KSFO&hoursBeforeNow=1&mostRecent=true

这将返回 KSFO(旧金山)的最新 METAR:

<?xml version="1.0" encoding="UTF-8"?>
<response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XML-Schema-instance" version="1.2" xsi:noNamespaceSchemaLocation="http://aviationweather.gov/adds/schema/metar1_2.xsd">
  <request_index>34600121</request_index>
  <data_source name="metars" />
  <request type="retrieve" />
  <errors />
  <warnings />
  <time_taken_ms>1</time_taken_ms>
  <data num_results="1">
    <METAR>
      <raw_text>KSFO 061756Z 30011KT 10SM FEW008 BKN160 19/13 A2992 RMK AO2 SLP132 T01890133 10189 20150 51006</raw_text>
      <station_id>KSFO</station_id>
      <observation_time>2015-08-06T17:56:00Z</observation_time>
      <latitude>37.62</latitude>
      <longitude>-122.37</longitude>
      <temp_c>18.9</temp_c>
      <dewpoint_c>13.3</dewpoint_c>
      <wind_dir_degrees>300</wind_dir_degrees>
      <wind_speed_kt>11</wind_speed_kt>
      <visibility_statute_mi>10.0</visibility_statute_mi>
      <altim_in_hg>29.920275</altim_in_hg>
      <sea_level_pressure_mb>1013.2</sea_level_pressure_mb>
      <quality_control_flags>
        <auto_station>TRUE</auto_station>
      </quality_control_flags>
      <sky_condition sky_cover="FEW" cloud_base_ft_agl="800" />
      <sky_condition sky_cover="BKN" cloud_base_ft_agl="16000" />
      <flight_category>VFR</flight_category>
      <three_hr_pressure_tendency_mb>0.6</three_hr_pressure_tendency_mb>
      <maxT_c>18.9</maxT_c>
      <minT_c>15.0</minT_c>
      <metar_type>SPECI</metar_type>
      <elevation_m>3.0</elevation_m>
    </METAR>
  </data>
</response>

你想拉sea_level_pressure_mb的值是 1013.2。

这是一个片段,在您当前位置的地图上显示当前的气压。

我开始编写“正确”的代码来解析 XML,但是当我不得不走下节点时失去了兴趣。

/***********************************************************************/
/** Page2: Simple example of using Google Map.                        **/
/** TeasingDart                                                       **/
/***********************************************************************/
package com.nlited.twopages;
import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.xml.prs.DocumentBuilder;
import javax.xml.prs.DocumentBuilderFactory;
public class Page2 extends MapFragment implements LocationListener {
  private static Page2 mObj;
  private Activity mActivity;
  private View mView;
  private MapView mMapView;
  private GoogleMap mMap;
  private LocationManager mLocMgr;
  private String mLocProvider;
  private Location mLoc;
  private LatLng mLatLng= new LatLng(43,-122);
  private boolean mSlpFound= false;
  private float mSLP= 1012;
  private String mStationID;
  private long mNextSlpCheck= 0;
  static public Page2 getInstance() {
    if(mObj==null)
      mObj= new Page2();
    return(mObj);
  }
  public Page2() {
    Debug("constructor %s", this.toString());
    mObj= this;
  }
  @Override public void onAttach(Activity activity) {
    Debug("onAttach()");
    mActivity= (Main)activity;
    super.onAttach(activity);
    startLocation();
    new Thread(new GetSLP(),"GetSLP").start();
  }
  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
    mActivity= (Main)getActivity();
    Debug("onCreateView()");
    super.onCreateView(inflater, container, state);
    mView= inflater.inflate(R.layout.frag_page2, container, false);
    mMapView= (MapView)mView.findViewById(R.id.map);
    mMapView.onCreate(state);
    mMapView.onResume();
    mMap= mMapView.getMap();
    mapUpdate();
    return(mView);
  }
  /***********************************************************************/
  /** Update the map using my GPS location and current SLP.             **/
  /***********************************************************************/
  private void mapUpdate() {
    MarkerOptions opt = new MarkerOptions();
    if(mMap!=null) {
      String status= mSlpFound ? String.format("%.1f %s",mSLP,mStationID) : "????";
      mMap.clear();
      mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLng, 15));
      mMap.addMarker(opt.position(mLatLng).title(status));
    }
  }
  /***********************************************************************/
  /** Retrieve my current GPS location.                                 **/
  /***********************************************************************/
  private void startLocation() {
    mLocMgr= (LocationManager)mActivity.getSystemService(Activity.LOCATION_SERVICE);
    if(mLocMgr==null) {
      Debug("Location services are not available.");
    } else if(!mLocMgr.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
      Debug("GPS is not enabled.");
    } else {
      mLocProvider= mLocMgr.getBestProvider(new Criteria(),false);
      if(mLocProvider==null) {
        Debug("No GPS providers available.");
      } else {
        mLoc = mLocMgr.getLastKnownLocation(mLocProvider);
        mLocMgr.requestLocationUpdates(mLocProvider,30000,1,this);
      }
    }
  }
  @Override public void onLocationChanged(Location loc) {
    Debug("Updated location: %f %f",loc.getLatitude(),loc.getLongitude());
    mLoc= loc;
    mLatLng= new LatLng(mLoc.getLatitude(), mLoc.getLongitude());
    if(System.currentTimeMillis() >= mNextSlpCheck)
      new Thread(new GetSLP(),"GetSLP").start();
    mapUpdate();
  }
  @Override public void onStatusChanged(String provider, int status, Bundle state) {
    Debug("Location %s state is now %d.",provider,status);
    if(status>0)
      mapUpdate();
  }
  @Override public void onProviderEnabled(String provider) {
    Debug("Location %s is now enabled.",provider);
  }
  @Override public void onProviderDisabled(String provider) {
    Debug("Location %s is now disabled.",provider);
  }
  /***********************************************************************/
  /** Background task to request the sea level pressure (SLP) from      **/
  /** the closest reporting station.                                    **/
  /***********************************************************************/
  private class GetSLP implements Runnable {
    public void run() {
      int range;
      boolean found= false;
      //Next check in 15 minutes from now.
      mNextSlpCheck= System.currentTimeMillis()+15*60*1000;
      for(range=10;range<100;range+=10) {
        URL url = buildUrl(range);
        if(url!=null) {
          String xml = fetch(url);
          if(xml!=null) {
            //found= p(xml);
            String slp= hack("sea_level_pressure_mb",xml);
            if(slp!=null) {
              mSLP= Float.pFloat(slp);
              mStationID= hack("station_id", xml);
              found = true;
              break;
            }
          }
        }
      }
      if(found) {
        Debug("Station found within %dkm.", range);
        mSlpFound = true;
        mActivity.runOnUiThread(new Runnable(){ public void run() { mapUpdate(); } });
      } else {
        Debug("No stations found within 100km!");
      }
    }
    //Build the request URL using a radial range from the current (longitude,latitude)
    private URL buildUrl(int range) {
      URL url= null;
      String protocol= "http";
      String host= "www.aviationweather.gov";
      String page= "adds/dataserver_current/httpparam";
      String parms= "dataSource=metars&requestType=retrieve&format=xml&hoursBeforeNow=1&mostRecent=true";
      parms+= String.format("&radialDistance=%d;%f,%f",range,mLatLng.longitude,mLatLng.latitude);
      String urlStr= String.format("%s://%s/%s?%s",protocol,host,page,parms);
      try {
        url = new URL(urlStr);
      } catch(Exception ex) {
        Debug("buildUrl(%s) blew up.", urlStr);
      }
      return(url);
    }
    //Fetch the most current METARS report as an xml document.
    private String fetch(URL url) {
      String text= null;
      try {
        HttpURLConnection connect = (HttpURLConnection)url.openConnection();
        InputStream strm= connect.getInputStream();
        BufferedReader reader= new BufferedReader(new InputStreamReader(strm));
        StringBuilder xml= new StringBuilder();
        String line;
        while((line= reader.readLine())!=null) {
          xml.append(line);
        }
        reader.close();
        text= xml.toString();
      } catch(Exception ex) {
        Debug("GetSLP.fetch() blew up.");
      }
      return(text);
    }
    //Quick hack version to extract a value from the xml string.
    private String hack(String name, String xml) {
      String value= null;
      String tag= String.format("<%s>",name);
      int nStart= xml.indexOf(tag);
      if(nStart>=0) {
        int nEnd = xml.indexOf("</", nStart+tag.length());
        if(nEnd>nStart) {
          value = xml.substring(nStart+tag.length(), nEnd);
        }
      }
      return(value);
    }
    //The proper (but incomplete) method to p the xml document.
    private boolean p(String xml) {
      boolean found= false;
      Float slp= 0.0f;
      try {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        InputSource src= new InputSource();
        src.setCharacterStream(new StringReader(xml));
        Document doc = builder.p(src);
        //TODO: Walk the nodes down to "sea_level_pressure_mb"
        //slp= Float.pFloat(value);
        //found= true;
      } catch(Exception ex) {
        Debug("GetSLP.p() blew up.");
      }
      return(found);
    }
  }
  private void Debug(String fmt, Object... args) { Log.w("2Page:Page2", String.format(fmt, args)); }
}
//EOF: PAGE2.JA

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:background="@color/ForestGreen"
  tools:context=".Page2"
>
  <TextView
    android:id="@+id/Page2_Title"
    android:text="This is Page Two"
    android:textSize="24pt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:gravity="center"
  />
  <com.google.android.gms.maps.MapView
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@+id/Page2_Title"
  />
</RelativeLayout>

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(709)
Android查看cpu占用率:使用Vulkan确定GPU核心占用率的“便携式”方法
上一篇
超敏c反应蛋白意义:蛋白质中原子的杂交(生物蛋白)
下一篇

相关推荐

  • docker游戏服务器:如何使用Docker搭建高性能的游戏服务器

    Docker游戏服务器是一种将游戏服务器部署到容器中的方式,它可以帮助游戏开发者快速、轻松地部署游戏服务器,并且可以更轻松地扩展游戏服务器的容量。…

    2023-04-27 09:55:33
    0 79 90
  • win7玩cf卡顿怎么解决:解决Win7环境下CF游戏卡顿问题

    尝试更新系统:可能是由于系统缺少某些补丁或者更新导致CF卡顿,可以尝试在Windows Update中进行检查更新,并安装最新的补丁和更新。更新显卡驱动:可能是由于显卡驱动过旧或者不兼容导致CF卡顿,可以尝试更新显卡驱动,可以到显卡厂商官网下载最新的驱动进行安装。…

    2023-05-27 11:45:17
    0 12 67
  • cv糖醋排骨是弯的吗弯曲的美味

    cv糖醋排骨不是弯的,它是一种制作方法,通常用来制作排骨。代码:…

    2023-04-01 13:03:36
    0 12 51
  • java ee eclipse使用:如何使用Java EE Eclipse来开发Web应用

    示例示例Java EE Eclipse使用步骤:安装Eclipse IDE。…

    2023-10-12 04:51:32
    0 86 90
  • cookie如何使用:如何使用Cookie来改善用户体验

    Cookie是一种存储在客户端的小型文件,用于记录用户的信息,如访问时间、登录状态等。使用Cookie可以更好地为用户提供服务,比如保存用户的登录状态,记录用户的浏览历史记录等。…

    2023-05-07 02:18:11
    0 14 93
  • cv小敢:如何利用CV小敢提升职业技能?

    cv小敢(Computer Vision Tiny-YOLO)是一种轻量级的物体检测算法,它可以在资源受限的设备上运行,如嵌入式设备、智能手机等。它是基于YOLO(You Only Look Once)算法的一个变体,由Joseph Redmon和Ali Farhadi开发,旨在提高深度学习模型的性能,同时减少模型的大小和计算复杂度。…

    2023-02-09 13:08:59
    0 35 29
  • ubuntu如何编译c语言:在Ubuntu上编译C语言程序的步骤

    示例示例Ubuntu编译C语言的步骤如下:安装gcc编译器:…

    2023-09-08 12:39:20
    0 64 63
  • coremail论客邮箱Coremail论客邮箱

    Coremail论客邮箱是一款专业的企业邮箱服务,可以满足企业对安全、可靠性和高效性的要求。它拥有强大的安全性能,可以提供多种安全保护,包括防止邮件被窃取、拦截恶意邮件、防止跨站脚本攻击等。此外,它还支持多种企业级功能,如组织架构管理、收发邮件管理、文件共享管理、联系人管理等,可以帮助企业提高工作效率,提升企业形象。…

    2023-02-25 04:36:55
    0 89 74

发表评论

登录 后才能评论

评论列表(61条)