Autore Topic: Calcolo delle distanze percorse  (Letto 615 volte)

Offline Thunderjet

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Motog 2
  • Sistema operativo:
    Windows 8
Calcolo delle distanze percorse
« il: 17 Luglio 2015, 15:05:44 CEST »
0
Allora sempre il solito niubbo che sta (autoimparando)
La mia app dovrebbe calcolare le distanze percorsa mentre mi muovo e aggiornare e visualizzare due contatori parziali (modificabili) e uno totale (non modificabile se no da apposita activity).

ma mi capita una cosa strana, anche se sono fermo in ufficio le distanze calcolate continuano a crescere ( di multipli di 5120) .

Dove cavolo sbaglio???

Grazie

Codice (Java(TM) 2 Platform Standard Edition 5.0): [Seleziona]
package it.pietrobruni.android.app.tripmaster;

import java.util.Locale;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Tacho  extends Activity
{
       
        String odoVal ;        
    private String providerId = LocationManager.GPS_PROVIDER;
    private Geocoder geo = null;
    private LocationManager locationManager=null;
    private static final int MIN_DIST=0;
    private static final int MIN_PERIOD=500;
    private static final float converse = (float) 3.6;
    double lastDistance;
   
        private final static String MY_PREFERENCES = "MyPref";
       
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.linear_activity_tacho);
                final SharedPreferences prefs = getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE);    
        final TextView outputspeedView = (TextView) findViewById(R.id.tachoSpeed);
        final TextView outputOdoView = (TextView) findViewById(R.id.odoValue);
        final TextView outputPartialView = (TextView) findViewById(R.id.parziale);
        outputspeedView.setText("0.0");
        this.inizializeOdo(prefs);
        this.speedViewButton();
        this.setPtripReset(prefs);
        }

       
        private void speedViewButton()
        {
                Button setOdo=(Button)findViewById(R.id.viewTrip);
                setOdo.setOnClickListener(new OnClickListener()
                {    
                        @Override    
                        public void onClick(View arg0)
                        {                              
                                Intent setMainReturn = new Intent(Tacho.this,MainActivity.class);
                        startActivity(setMainReturn);  
                        finish();
                    }    
              });
        }
       
        private void setPtripReset (final SharedPreferences sharedPref )
        {              
                Button setPtripH=(Button)findViewById(R.id.reset);    
                setPtripH.setOnClickListener(new OnClickListener()
                {
                        @Override    
                        public void onClick(View arg0)
                        {    
                                String pKmStr;
                                TextView outputView = (TextView) findViewById(R.id.parziale);
                                pKmStr = "0.0" ;
                                outputView.setText(pKmStr);
                                writePreference (sharedPref,"partSpeed",pKmStr);
                    }
                });            
        }
       
        private void inizializeOdo(SharedPreferences prefs)
        {              
                String textOdoData =prefs.getString("odo", "0");
                String textPartData =prefs.getString("partSpeed", "0.0");
                TextView outputPartialView = (TextView) findViewById(R.id.parziale);   
                TextView outputOdoView = (TextView) findViewById(R.id.odoValue);        
                outputOdoView.setText(textOdoData);
                outputPartialView.setText(textPartData);               
        }
       
        private LocationListener locationListener = new LocationListener()
    {
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras)
        {
             
        }
        @Override
        public void onProviderEnabled(String provider)
        {
            // attivo GPS su dispositivo
           
        }
        @Override
        public void onProviderDisabled(String provider)
        {
            // disattivo GPS su dispositivo
         
        }
        @Override
        public void onLocationChanged(Location location)
         {             
            updateGUI(location);
         }
       
    };
   
   
     
    @Override
    protected void onResume()
    {
        super.onResume();
        geo=new Geocoder(this, Locale.getDefault());
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location!=null)
            updateGUI(location);
        locationManager.requestLocationUpdates(providerId, MIN_PERIOD,MIN_DIST, locationListener);
    }
     
    @Override
    protected void onPause()
    {
        super.onPause();
        if (locationManager!=null && locationManager.isProviderEnabled(providerId))
            locationManager.removeUpdates(locationListener);
    }
   
    private void updateGUI(Location location)
    {
        final SharedPreferences sharedPref = this.getPreferences(CONTEXT_RESTRICTED);
       
        Location loc ;         
        float speed;
        Float floatSpeed ;
        int intSpeed;
        int odoInt;
        int newOdo ;
       
        String odoVal;
        String locStr;
       
       
       
        if (location.hasSpeed ())
        {
                speed = location.getSpeed();
                speed = speed*converse;
        }
        else
        {
                speed = 0;
        }
       
        floatSpeed = (Float )speed;
        intSpeed= floatSpeed.intValue();
        updateText(R.id.tachoSpeed, String.valueOf(intSpeed));
       
       
       
        String locationStr = sharedPref.getString("location", null);
        if( locationStr != null )
        {
            loc = new Location(locationStr);
            lastDistance = (loc.distanceTo(location))/1000;
            locStr = location.toString();
            this.writePreference (sharedPref,"location",locStr);
        }
        else
        {
                lastDistance = 0;
                locStr = location.toString();
            this.writePreference (sharedPref,"location",locStr);
        }
        // upgrade_distanza
       
        odoVal = sharedPref.getString("odo","0") ;
        double lastDP = Double.parseDouble(sharedPref.getString("part","0.0"));
        odoInt = Integer.parseInt(odoVal);
        newOdo = odoInt + (int) lastDistance;        
       
        TextView outputOdoView = (TextView) findViewById(R.id.odoValue);
        TextView outputLstPView = (TextView) findViewById(R.id.parziali);
        TextView outputLstTView = (TextView) findViewById(R.id.totali);      
       


        double newDP = (lastDP + lastDistance)*10 ;
       
        int newIP = (int) newDP;

        newDP = newIP/10;

       
        updateText(R.id.parziale, String.valueOf(newDP));
        updateText(R.id.odoValue, String.valueOf(newOdo));
       
        this.writePreference (sharedPref,"partSpeed",String.valueOf(newDP));
        this.writePreference (sharedPref,"odo",String.valueOf(newOdo));
        this.writePreference (sharedPref,"location",locStr);
       
        }
 
    private void updateText(int id, String text)
    {
        TextView textView = (TextView) findViewById(id);
        textView.setText(text);
    }
       
    public void writePreference (SharedPreferences sharedPref,String keyVal,String val)
        {              
                SharedPreferences.Editor prefsEditor = sharedPref.edit();
                prefsEditor.putString(keyVal, val);
                prefsEditor.commit();
        }
       
}

Offline Thunderjet

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Motog 2
  • Sistema operativo:
    Windows 8
Re:Calcolo delle distanze percorse
« Risposta #1 il: 27 Luglio 2015, 15:36:32 CEST »
0
ma già tutti in ferie?

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Calcolo delle distanze percorse
« Risposta #2 il: 30 Luglio 2015, 15:19:04 CEST »
0
Forse sto invecchiando... ma non avevo risposto ad una domanda simile qualche settimana fa?

Post unito: 30 Luglio 2015, 15:29:41 CEST
Avevo scritto questo:

"Se vuoi misurare una distanza percorsa come somma delle distanze delle posizioni tornate dalla onLocationChanged, credo che rischi di sovrastimare parecchio la lunghezza del percorso. Era un problema comune in molte app di tracking della corsa (qualche anno fa, ora è una vita che non ne uso una). I punti tornati dal GPS possono ballare parecchio attorno alla tua posizione reale. Credo dovresti fare un post processing delle posizioni. Magari facendo un interpolazione ad n punti tenendo conto dell'accuracy di ogni punto ed escludendo gli outlayer."

Fondamentalmente, sommi ogni errore di posizione che ottieni. Come ti dicevo dovresti in qualche modo tener conto dell'accuracy e non prendere ogni punto come buono.
Mettiamo in un mondo 1D.

Se all'istante 1 il GPS ti dice che sei in posizione 100, con accuratezza 10.
All'istante 2 ti dice che sei a 110 con accuratezza 10
All'istante 3 ti dice che sei a 90 con accuratezza 15

Sommando risulterebbe che hai percorso 30m.
E' invece possibile che tu sia stato FERMO in una posizione fra 100 e 105.

La cosa più semplice è non aggiornare se la posizione vecchia e nuova sono compatibili usando l'accuracy (se una rientra nel cerchio dell'altra). Direi che è anche meglio tenere come valida quella con l'accuratezza migliore.
Questo però ti salva solo se stai fermo.
Se cammini ottieni comunque un percorso più lungo di quello che hai fatto (provato con un paio di programmi di running, qualche anno fa)
La cosa più intelligente sarebbe quella di interpolare in qualche modo le posizioni ottenute, magari con una spline, tenendo conto per ogni punto dell'accuracy. E supponendo che la persona non stia correndo a zig zag.

ciao
« Ultima modifica: 30 Luglio 2015, 15:29:41 CEST da arlabs, Reason: Merged DoublePost »

Offline Thunderjet

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Motorola Motog 2
  • Sistema operativo:
    Windows 8
Re:Calcolo delle distanze percorse
« Risposta #3 il: 30 Luglio 2015, 15:48:07 CEST »
0
no sono io che sto invecchiando e non avevo capito..

grazie..