關於Android上GPS獲取地理信息座標的體會

最近應爲工作需要,要做定位的功能

在定位的功能實現中首先我們需要獲取到系統的LocationManager,獲取方式爲

// 獲取系統定位管理
        String context = Context.LOCATION_SERVICE;
        locationManager = (LocationManager) getSystemService(context);

然後可以設置Criteria:


        // 設置Criteria(服務商)的信息
        Criteria criteria = new Criteria();
        // 經度要求
        // criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(false);
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        // 取得最好效果的criteria
        String provider = locationManager.getBestProvider(criteria, true);


這個時候就可以獲得相應的座標信息了:

// 獲得座標相應信息
        Location location = locationManager.getLastKnownLocation(provider);

當然我們還可以設置監聽事件:

//設置監聽
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,500, 20,locationListener);

參考信息

 由於人的位置是不斷變化,我要設置一個位置變化的範圍,包括同時滿足最小的時間間隔和最小的位移變化,如果兩個條件要同時滿足,將位置監聽器將被觸發。實際上該方法有多個參數格式,特別是requestLocationUpdates (long minTime, float minDistance, Criteria criteria,PendingIntent intent),當位置變化時可調用其他的Activity。 在本例中,我們制定用GPS,則在權限中必須要求精確定位許可。
        mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000/*10秒,爲測試方便*/, 1000/*1公里*/, onLocationChange/*位置監聽器*/);



監聽事件:


// 提供定位信息發生改變時的回調。必須事先在定位管理器中註冊監聽器對象。
    private LocationListener locationListener = new LocationListener() {
        // Provider的轉態在可用、暫時不可用和無服務三個狀態直接切換時觸發此函數
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

        // Provider啓用時觸發此函數,比如GPS被打開。
        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        // Provider禁用時觸發此函數,比如GPS被關閉。
        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
            

        }

        // 當座標改變時候觸發該函數,如果Provider傳相同的座標,它就不會觸發。
        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
            if (location != null) {
                // 爲繪製標誌的類設置座標
                // myPosition.
                // 取得經度和緯度
                Double geoLat = location.getLatitude() * 1E6;
                Double geoLng = location.getLongitude() * 1E6;

                Log.i("latitudetag", Double.toString(geoLat));

                Log.i("latitudetag", Double.toString(geoLng));
                edittext.setText(Double.toString(geoLat) + "," + Double.toString(geoLng));
            }

        }
    };


之前一直不知道餓了麼這種送餐平臺爲什麼定位需要開啓wifi現在也有些瞭解:

參考知乎上面的回答:

1.每一個無線AP都有一個全球唯一的MAC地址,並且一般來說無線AP在一段時間內是不會移動的
2.設備在開啓Wi-Fi的情況下,即可掃描並收集周圍的AP信號,無論是否加密,是否已連接,甚至信號強度不足以顯示在無線信號列表中,都可以獲取到AP廣播出來的MAC地址

3.設備將這些能夠標示AP的數據發送到位置服務器,服務器檢索出每一個AP的地理位置,並結合每個信號的強弱程度,計算出設備的地理位置並返回到用戶設備

其中步驟有:
1、AP的信號中包含全球唯一的MAC地址。
2、只要能夠搜索到wifi信號,就能得知AP的MAC地址,並不需要連接到wifi。
3、每一個AP在地理座標上作爲一個錨點,並且用MAC地址來唯一標識它。
4、wifi定位是通過參照一個或多個AP的座標計算得出來的。
5、在服務器端維護了一個AP的座標數據庫。
6、AP的位置(座標)是通過參照連網的GPS設備得到,GPS設備定位成功後GPS應用自動將其周邊的AP信息反饋給服務器,自動維護AP座標數據庫。
7、通過wifi定位時,GPS應用通過周邊AP信號的MAC地址去查詢每個AP的座標,並根據信號的強度計算出所在的位置。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章