2012-09-23 39 views
0

我已經使用下面的代碼來檢查GPS座標,但問題是,如果我站在同一個地方座標變化,距離是4到20 mts之間的任何地方。 只有當我移動了10分鐘時,我纔想改變它。GPS座標變化太頻繁

locationManager_gps = (LocationManager) this 
        .getSystemService(Context.LOCATION_SERVICE); 
      locationManager_gps.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 0, 0, 
        new MyLocationListener_gps()); 

class MyLocationListener_gps implements LocationListener { 
     public void onLocationChanged(Location location) { 

      clat = location.getLatitude(); 
      clon = location.getLongitude(); 

      if (clat != plat || clon != plon) { 
       float[] results = new float[3]; 
       Location.distanceBetween(plat, plon, clat, clon, results); 

       if (flag_gps == 0) { 
        flag_gps = 1; 
       } else { 
        GeoPoint geoPoint = new GeoPoint((int) (clat * 1E6), 
          (int) (clon * 1E6)); 
        mapView.getController().animateTo(geoPoint); 
        draw = new MyOverLay(geoPoint); 
        mapView.getOverlays().add(draw); 

        dist_mtr += results[0]; 

       } 
       plat = clat; 
       plon = clon; 
      } 
     } 

如果我使用50作爲更新之間的最小距離,那麼它工作正常。我也試過把它做成30,但是在汽車旅行時,在4公里的時間段內數據也是錯誤的。

請建議我應該做什麼。

+0

我已經給在5代碼的隨機值以PLAT和上述普隆和製成flag_gps = 0只是跳過第一位置變化更新 –

回答

0

我也看過這個,當時有幾個位置讀數,我沒有移動。您可以獲得不同精度的可變結果。 你可以嘗試取10個位置讀數,並以最好的準確度取其中一個,然後忽略其餘。然後在進行下一次閱讀時,確保它位於前一個位置準確度的兩倍的距離處。例如,如果您的第一個位置的準確度爲16米,請確保下一個讀數距離之前的位置至少32米,準確度優於32米。

0

您需要結合使用minTime和minDistance。兩者都通過零和零,因此更新之間的最短時間至少爲零秒,最小距離爲零。因此,將minTime設置爲合理的時間,將minDistance設置爲10米。

locationManager_gps.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 0, 0, 
        new MyLocationListener_gps()); 
0

沒有靈丹妙藥來解決這個...的GPS是不是100%準確,你將永遠有不同的解讀每次你得到一個新的位置更新的時間。

可以使用低通濾波器的位置值最小化問題:

clat = plat + (clat-plat) * 0.2; // you should adjust the 0.2 value to the best results 
clon = plon + (clon-plon) * 0.2; 
.... 
//your code 
.... 
plat = clat; 
plon = clon; 

有了這個突然的變化值將被最小化的效果,這是很好的位置假冒的變化,但它也會延遲對設備移動時位置的實際變化的響應。您應該謹慎選擇恆定乘法(0.2以上)的值以獲得最佳結果。

你甚至可以做得更好,使用變量而不是常量,並根據更新的準確性調整它的值(良好的準確性,使變量接近1,澆注準確性,使變量接近爲0)

好運