GPS定位及获取卫星参数实例整理
2017-06-07 10:04
211 查看
1、Android定位服务接口
sdk中已有一些可用的定位服务接口:这里着重说一下GpsSatellite 接口
GpsSatellite结构
继承关系
public final class GpsSatellite extends Objectjava.lang.Object
android.location.GpsSatellite
类描述
此类用于描述当前GPS卫星状态,和GpsStatus联合使用。公共方法
public float getAzimuth ()
返回卫星的方位角,方位角范围0至360度。返回值 卫星的方位角,浮点型数据。
public float getElevation()
返回卫星的高度角,高度角范围0至90度。返回值 卫星的高度角,浮点型数据。
public int getPrn ()
返回伪随机噪声码,译者注:所谓伪噪声码,不是卫星编号,是一个具有一定周期的取值0和1的离散符号串,它具有类似于白噪声的自相关函数
返回值 伪随机噪声码,整形数据
public float getSnr ()
返回卫星的信噪比。(译者注:即放大器的输出信号的电压与同时输出的噪声电压的比,常常用分贝数表示。设备的信噪比越高表明它产生的杂音越少。一般来说,信噪比越大,
说明混在信号里的噪声越小,声音回放的音质量越高,否则相反)
返回值 卫星信噪比,浮点型数据
public boolean hasAlmanac ()
如果GPS引擎有近似轨道信息(卫星是否有年历表)则返回true返回值 如果GPS引擎有近似轨道信息则返回true,布尔型数据
public boolean hasEphemeris ()
如果GPS引擎有卫星星历(卫星是否有星历表)则返回true(译者注:卫星星历用于描述太空飞行体位置和速度的表达式)
返回值 如果GPS引擎有卫星星历则返回true,布尔型数据
public boolean useInfix ()
当卫星被GPS引擎用于计算最近位置(卫星是否被用于近期的GPS修正计算)时,返回true返回值 当卫星被GPS引擎用于计算最近位置时,返回true
2、LocationMananger接口应用
1、获取定位服务mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); //toast 消息出来 private void putToast(Context context, String text){ Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); } //判断GPS provider是否有效否则进入设置选择provider private void openGpsSettings(){ if(mLocationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){ putToast(getApplicationContext(),"GPS OK!"); }else{ putToast(getApplicationContext(),"GPS OFF!"); Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivityForResult(intent, 0); } }用法例如:
// 通过GPS定位 String LocateType= locationManager.GPS_PROVIDER; Location location = locationManager.getLastKnownLocation(LocateType); // 设置监听器,设置自动更新间隔这里设置1000ms,移动距离:0米。 locationManager.requestLocationUpdates(provider, 1000, 0, locationListener); // 设置状态监听回调函数。statusListener是监听的回调函数。 locationManager.addGpsStatusListener(statusListener); //另外给出 通过network定位设置 String LocateType= locationManager.NETWORK_PROVIDER; Location location = locationManager.getLastKnownLocation(LocateType);
2、在android mainfest中添加权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>//精确定位 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>//粗咯定位
3、可以设置定位规则
Criteria criteria = new Criteria(); // 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细 criteria.setAccuracy(Criteria.ACCURACY_FINE); // 设置是否要求速度 criteria.setSpeedRequired(false); // 设置是否允许运营商收费 criteria.setCostAllowed(false); // 设置是否需要方位信息 criteria.setBearingRequired(false); // 设置是否需要海拔信息 criteria.setAltitudeRequired(false); // 设置对电源的需求 criteria.setPowerRequirement(Criteria.POWER_LOW);用法
mProvider = mLocationManager.getBestProvider(criteria,true); mLocation = mLocationManager.getLastKnownLocation(mProvider);
3、GpsStatus监听器
上面给出了定位服务的初始化设置步骤,但我们都知道GPS卫星是定期广播数据的,也就是说会定期收到卫星的GPS数据。我们并不能跟卫星主动申请数据,只能被动接收数据。(中国的北斗2倒是可以发送卫星报文给卫星)因此我们需要注册一个监听器来处理卫星返回的数据。例如:
private final GpsStatus.Listener statusListener = new GpsStatus.Listener() { public void onGpsStatusChanged(int event) { // GPS状态变化时的回调,获取当前状态 GpsStatus status = locationManager.getGpsStatus(null); //自己编写的方法,获取卫星状态相关数据 GetGPSStatus(event, status); } };
4、获取搜索到的卫星
//定义一个List存放所搜索到的卫星信息 private List<GpsSatellite> numSatelliteList = new ArrayList<GpsSatellite>(); private String updateGpsStatus(int event,GpsStatus status){ StringBuilder stringBuilder = new StringBuilder(""); if(status == null){ stringBuilder.append("没有捕捉到卫星!"); }else if(event == GpsStatus.GPS_EVENT_FIRST_FIX){ stringBuilder.append("第一次定位成功!"); }else if(event == GpsStatus.GPS_EVENT_SATELLITE_STATUS){ int maxSatellites = status.getMaxSatellites(); Iterator<GpsSatellite> it = status.getSatellites().iterator(); numSatelliteList.clear(); int count = 0;//记录搜索到的实际卫星数 while(it.hasNext()&& count < maxSatellites){ GpsSatellite s = it.next(); numSatelliteList.add(s);//将卫星信息存入队列 count++; } stringBuilder.append("获得卫星总数:"+numSatelliteList.size()); }else if(event == GpsStatus.GPS_EVENT_STARTED){ //定位启动 }else if(event == GpsStatus.GPS_EVENT_STOPPED){ //定位结束 } return stringBuilder.toString(); }
以上主要是通过从状态值里面status.getSatellite()获取c存放搜索到的卫星数目对象,并保存在队列中。
除了GPS状态信息,还要利用LocationListener实现对位置定位信息的监听:
5、LocationListener监听器
//弹出toast private void putToast(Context context, String text){ Toast.makeT bb98 ext(context, text, Toast.LENGTH_SHORT).show(); } private final LocationListener locationListener = new LocationListener(){ @Override public void onLocationChanged(Location location) { //当坐标改变时调用此函数 如果provider传相同坐标 则不促发 putToast(MainActivity.this,"onLocationChanged!"); updateNewLocation(location); } @Override public void onProviderDisabled(String provider) { //provider 被disabled 时触发 例如GPS被关闭 putToast(MainActivity.this,"onProviderDisabled!"); updateNewLocation(null); } @Override public void onProviderEnabled(String provider) { //provider 被enable 时触发 例如GPS被打开 putToast(MainActivity.this,"onProviderEnabled!"); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { //provider 被enable 时触发 例如GPS被打开 putToast(MainActivity.this,"onStatusChanged! status:"+status); //provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发 if (status == LocationProvider.OUT_OF_SERVICE||status == LocationProvider.TEMPORARILY_UNAVAILABLE){ } } };
位置监听回调是用来处理GPS位置发生变化的时候,自动回调的方法,我们可以从这里获取到当前的GPS数据。另外我们可以通过回调函数提供的location参数,获取GPS的地理位置信息,包括经纬度、速度、海拔等信息
6、获取定位位置等信息(经纬度、卫星个数、海拔高度、定位状态、授时时间)
//location对象是从上面定位服务回调函数的参数获取。 mLatitude = location.getLatitude(); //经度 mLongitude = location.getLongitude(); //纬度 mAltitude = location.getAltitude(); //海拔 mSpeed = location.getSpeed(); //速度 mBearing = location.getBearing(); //方向
7、获取特定卫星信息(方位角、高度角、信噪比)
//temgGpsSatellite就是上面保存的搜索到的卫星 float azimuth = temgGpsSatellite.getAzimuth(); //方向角 float elevation = temgGpsSatellite.getElevation();//高度角 float snr = temgGpsSatellite.getSnr(); //信噪比利用方位角、高度角可以绘画出一个二维位置图像,表示卫星在地球的哪个方位。而信噪比则可以表示GPS模块搜星能力的代表。
8、绘制二维卫星效果图
根据方向角和高度角,计算卫星二维图里面位置的方法,上面效果图左边的绿色圆点就代表卫星位置。
计算方法:
//根据方向角和高度角计算出,卫星显示的位置 Point point = new Point(); int x = mEarthHeartX; //左边地球圆形的圆心位置X坐标 int y = mEarthHeartY; //左边地球圆形的圆心位置Y坐标 int r = mEarthR; x+=(int)((r*elevation*Math.sin(Math.PI*azimuth/180)/90)); y-=(int)((r*elevation*Math.cos(Math.PI*azimuth/180)/90)); point.x = x; point.y = y; //point就是你需要绘画卫星图的起始坐标
右边的信噪比柱状图,代表卫星的接收信号能力。信噪比的绘画,就是一个单位换算,这里就不给代码了。
9、总结
Android为我们提供了很方便的位置服务获取接口,主要通过GpsStatus、LocationManager、GpsSatellite等类来实现相关服务的监听。相关文章推荐
- android基础:获取GPS定位简单实例
- jsp源码实例3(获取jsp各种参数)
- jsp源码实例2(获取表单参数)
- Android入门之简单GPS定位实例
- android网络-GPS获取定位信息
- Android 使用GPS定位获取经纬度的方法
- jsp源码实例3(获取jsp各种参数)
- 如何获取gps卫星导航定位,解决getLastKnownLocation返回null
- 【收集整理】request获取参数为中文乱码解法方法
- GoogleMapAPI实例 根据地名定位获取经纬度
- iphone中GPS精确定位及反向获取地址信息
- jsp源码实例3(获取jsp各种参数)
- jsp源码实例2(获取表单参数)
- GPS全球卫星定位导航系统
- Android GPS定位 获取经纬度
- jsp源码实例2(获取表单参数)
- js获取url参数的使用扩展实例
- 【个人整理】关于JS获取与设置文本框、文本域光标的实例大全
- android 获取GPS定位,