2012-09-23 5 views
0

J'ai utilisé le code suivant pour vérifier les coordonnées GPS, mais le problème est que si je suis au même endroit, les coordonnées changent et la distance est comprise entre 4 et 20 mts. Je veux le changer seulement quand j'ai déménagé min 10 mtrs.Les coordonnées GPS changent trop fréquemment

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; 
      } 
     } 

Si j'utilise 50 comme la distance minimale entre les mises à jour, alors il fonctionne bien. J'ai aussi essayé de le faire 30 mais aussi des données erronées sur une période de 4 km en voyageant en voiture.

S'il vous plaît suggérer ce que je devrais faire.

+0

J'ai donné une valeur aléatoire à plat et plon ci-dessus dans le code mai et fait flag_gps = 0 juste pour sauter première mise à jour de changement d'emplacement –

Répondre

0

Je l'ai vu aussi, en prenant plusieurs lectures de position et je n'ai pas bougé. Vous pouvez obtenir des résultats variables avec différentes précisions. Vous pourriez essayer de prendre, disons, 10 lectures de position et prendre celui avec la meilleure précision et ne pas tenir compte du reste. Ensuite, lors de la lecture suivante, assurez-vous qu'il se trouve à une distance correspondant à deux fois la précision de l'emplacement précédent. Par exemple, si votre premier emplacement a une précision de, disons 16 mètres, assurez-vous que la lecture suivante est à au moins 32 mètres de l'emplacement précédent ET a une précision supérieure à 32 mètres.

0

Vous devez utiliser minTime et minDistance en combinaison. Vous passez zéro et zéro pour les deux, de sorte que le temps minimum entre les mises à jour sera d'au moins zéro seconde et la distance min sera zéro. Réglez donc minTime sur une durée raisonnable et minDistance sur 10 pendant dix mètres.

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

Il n'y a pas de solution miracle pour résoudre ce ... le GPS n'est pas précis à 100% et vous aurez toujours des lectures différentes à chaque fois que vous obtenez une nouvelle mise à jour de l'emplacement.

Vous pouvez réduire le problème à l'aide d'un filtre passe-bas pour les valeurs de l'emplacement:

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; 

Avec ce l'effet des changements soudains aux valeurs seront réduites au minimum, ce qui est bon pour les changements faux en position, mais cela retardera également la réponse aux changements réels dans les positions lorsque l'appareil est en mouvement. Vous devriez choisir soigneusement la valeur de la multiplication constante (0.2 ci-dessus) pour obtenir les meilleurs résultats.

Vous pouvez même faire mieux, en utilisant une variable au lieu d'une constante, et ajustez la valeur en fonction de la précision de la mise à jour de loaction (bonne précision pour la variable proche de 1, pour la précision à 0)

bonne chance