1. 程式人生 > >GPS定位及獲取衛星引數例項整理

GPS定位及獲取衛星引數例項整理

1、Android定位服務介面

sdk中已有一些可用的定位服務介面:


這裡著重說一下GpsSatellite 介面

GpsSatellite結構 

繼承關係 

public final class GpsSatellite extends Object

java.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.makeText(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等類來實現相關服務的監聽。

相關推薦

GPS定位獲取衛星引數例項整理

1、Android定位服務介面 sdk中已有一些可用的定位服務介面: 這裡著重說一下GpsSatellite 介面 GpsSatellite結構  繼承關係  public final class GpsSatellite extends Object java.lan

express中的路由規則獲取請求引數方法

express中常見的路由規則 主要使用的路由規則是get和post兩種,即 var express = require('express'); var app = express(); app.get(); // get和post兩種請求方式 app.post();

示例Express中路由規則獲取請求引數

本次給大家分享一篇基於express中路由規則及獲取請求引數的方法,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 express中常見的路由規則 主要使用的路由規則是get和post兩種,即 var express = requir

Android GPS定位獲取經緯度)

簡述:     android 定位一般有四種方法,這四種方式分別是:GPS定位,WIFI定位,基站定位,AGPS定位。 本篇博文主要記錄一下GPS定位:這種方式需要手機支援GPS模組硬體支援。通過GPS方式準確度是最高的,但是它的缺點也非常明顯:             

Go發起Http請求獲取相關引數

golang要請求遠端網頁,可以使用net/http包中的client提供的方法實現。查看了官方網站有一些示例,沒有太全面的例子,於是自己整理了一下。 get請求 get請求可以直接http.Get方法,非常簡單。 func httpGet() { resp, err :

Spring boot PUT、DELETE 請求無法定位方法獲取引數解決方案

在使用spring boot過程中帶著之前使用spring mvc的慣性思維操作,雖然spring boot已經整合了HiddenHttpMethodFilter , 結果卻出現了 PUT方法不支援

Python中函式定義引數例項

1.函式定義 函式就是完成特定功能的一個語句組,這組語句可以作為一個單位使用,並且給它取一個名字 ,可以通過函式名在程式的不同地方多次執行(這通常叫函式呼叫) 預定義函式(可以直接使用) 自定義函式(自己編寫) 為什麼使用函式? 降低程式設計難度,通常將

批量獲取mysql資料庫例項指定引數的值

需求:需要對比所有mysql資料庫例項上面的指定引數配置情況,同時需要需要能看到如ip,埠,master or slave,畢竟主和從引數不一樣還是有可能的。 說明:必須要有個資料庫儲存所有是資料庫的資訊,如ip,埠,主從關係等,我這裡恰好都滿足,相關敏感資訊已脫敏。 #!/bin/bash # #

Linux系統date命令的引數獲取時間戳的方法

date指令相關用法示例 date 用法: date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] 直接輸入date date 指定格式顯示時間: date +%Y

服務間RestTemplate 呼叫 獲取請求頭部引數資訊方法

通過RestTemplate 實現服務間呼叫 @Autowired RestTemplate restTemplate; ResponseEntity tokenResp = restTemplate.postForEntity(“http://osg-uc0003/member/c7/f0

GET方法和POST獲取中文引數出現亂碼的問題解決方法

PS:編碼名稱要遵守大小寫規則!!!!!!! <pre name="code" class="java">如果我們用get方法向伺服器傳遞中文資料的話,是會出現這樣的情況 String queryString = request.getQueryString(

GPS定位系統協議介紹

以前人們說起定位、導航習慣性的叫做GPS,因為從前的美國GPS系統"一家獨大"。不過GPS只是現今全球四大導航系統之一。 目前全球衛星導航系統定位(GNSS)已經發展成由GPS、GLONASS、GALILEO、BDS四分天下。甚至未來可能還有印度(GAGAN)、日本(QZSS)等國家

使用Android原生的Api進行GPS定位獲取位置資訊

執行效果: 程式碼: public class LocationActivity extends AppCompatActivity { private TextView tv_location; private Context c

面試題:GPS定位一個點,至少需要幾個衛星

題目描述 GPS全球衛星定位系統,定位地球上的一個點,至少需要幾個衛星?為什麼? GPS系統組成 空間部分:21顆工作衛星,3顆備用衛星。 地面支援系統:1個主控站,3個注入站,5個監測站。 使

window.open()引數傳遞獲取

20161021 1、帶引數開啟新視窗 $window.open("/bdfence/bdfence-division/bdfence.html?vehicleId="+ id  ); 2、獲取

Struts2中將global-exception定位到一個Action中處理,獲取其異常資訊的方法

通常情況下,會使用Struts2的異常框架對系統中產生的異常進行統一處理,其好處是可以讓開發人員減少程式成中的try catch塊,更多的關於業務處理,並且可以通過global與區域性異常的配合使用,達到理想的效果。 當使用了這種方式之後,其異常可以指向一個re

Caffe 例項筆記 1 CaffeNet從訓練到分類視覺化引數特徵 微調

本文主要分四部分 1. 在命令列進行訓練 2. 使用pycaffe進行分類及特徵視覺化 3. 進行微調,將caffenet使用在圖片風格的預測上 1 使用caffeNet訓練自己的資料集 1.1 建立lmdb 使用對應的資料集建立lmd

Android開發之位置定位詳解與例項解析(GPS定位、Google網路定位,BaiduLBS(SDK)定位

/** * 由經緯度獲取所在的城市及區域資訊 * @author caizhiming * */ private class ReadJSONFeedTask extends AsyncTask<String, Void, String> {

使用 aop攔截 springMVC的controller並獲取請求引數返回結果

有人說使用aop攔截不到springMVC的controller,一般出現此種情況大多是由於配置錯誤造成,不廢話直接進入主題: 1、applicationContext.xml 配置掃描 除@controller外的bean <context:component

使用layer 彈出對話方塊 子父頁面相互引數傳遞 父頁面獲取子頁面引數例項

最近使用了layui框架,是一套非常好用的整合吧,沒研究太深,但是用起來很方面。主要是因為要寫一個選擇彈出框,類似使用者登入一樣的彈出框。學習肯定是先看官網,下載原始碼的,地址 http://www.layui.com/doc/  但是官網程式碼的demo不夠詳盡,還是我沒