Autore Topic: Precisione coordinate GPS  (Letto 1747 volte)

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Precisione coordinate GPS
« il: 08 Aprile 2015, 12:44:02 CEST »
0
Buongiorno a tutti.

Ultimamente mi sono posto un problema non da poco: la precisione, o l'accuratezza, delle rilevazioni delle coordinate GPS del dispositivo Android che utilizza l'App.

Mi sono posto questo problema osservando i dati di rilevazione relativi ad una mia App che rileva la posizione con coordinate gps, comunica l'indirizzo (in base alle coordinate) e raccoglie anche la precisione con cui è stata effettuata la rilevazione.
Tale precisione oscilla tra i 0.5 metri ai 2 km. Direi un divario eccessivo. Penso sia dovuto alla scarsa qualità del dispositivo in uso, alle condizione atmosferiche ed altri fattori di cui non mi è dato sapere.
Ma come posso migliorare le rilevazioni, con del codice,  rendendole il più accurate possibile?

Grazie.
Stupido è chi lo stupido fa!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Precisione coordinate GPS
« Risposta #1 il: 14 Aprile 2015, 19:07:26 CEST »
0
Posto che suppongo stai utilizzando i Google Play Services...

Innanzitutto se hai bisogno di accuratezza, devi impostare LocationRequest.PRIORITY_HIGH_ACCURACY.

Però cmq, il sistema FusedLocationApi usa diversi meccanismi per identificare la posizione e cmq ti dà il prima possibile una stima della posizione, per poi raffinare.
Quindi se all'inizio ha solo la posizione della cella a cui sei collegato ti darà una precisione anche di Km, per poi darti derivata dai Wifi (che sono mappati da Google) per poi, se serve, identificare la posizione triangolando il GPS (che può impiegare diverso tempo).

Poi il tutto dipende da cosa l'utente ha attivato. Se non ha attivato né GPS né Wifi (nelle ultima versioni di Android puoi decidere indipendentemente se usarlo per la localizzazione anche se è spento), sarà dura ottenere una posizione con precisione sotto al Km.

Ti dico per esperienza personale, se la tua applicazione ha bisogno di precisione, verifica cosa l'utente ha attivato e digli chiaramente che non riesci ad ottenere la posizione a causa di impostazione del telefono (proponigli di attivarle)
Io ho avuto (ed ho ancora) un sacco di recensioni negative di gente che vuole che il telefono sia onnisciente, pur tenendo tutto disattivato "così risparmio la batteria".

Ciao.

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Precisione coordinate GPS
« Risposta #2 il: 14 Aprile 2015, 22:17:39 CEST »
0
Innanzi tutto ti ringrazio per la risposta chiara. Ma i dispositivi che usano la mia App danno precisioni varie. Dai pochi metri al paio di km. Vorrei fare in modo da ottenere sempre una precisione di metri e non km.
Ma ancora grazie, vedrò cosa posso fare.
Stupido è chi lo stupido fa!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Precisione coordinate GPS
« Risposta #3 il: 14 Aprile 2015, 22:20:02 CEST »
0
Verifica che i dispositivi che hanno precisione di km abbiano WiFi e GPS attivi.

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Precisione coordinate GPS
« Risposta #4 il: 14 Aprile 2015, 22:55:35 CEST »
0
sì, li configuro io stesso. hanno GPS e localizzazione di Google attivi. Usano la connessione dati e non WiFi.
Stupido è chi lo stupido fa!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Precisione coordinate GPS
« Risposta #5 il: 14 Aprile 2015, 23:21:45 CEST »
0
Intendevo il wifi attivo per la localizzazione, non per la concessione dati. Il GPS può impiegare del tempo a fare il fixing, e in ambienti chiusi lontano da finestre può anche non riuscire.

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Precisione coordinate GPS
« Risposta #6 il: 15 Aprile 2015, 09:28:17 CEST »
0
Per l'A-GPS non viene usato indistintamente la connessione dati o il WiFi?
Ad ogni modo i dispositivi non sono usati al chiuso.
Stupido è chi lo stupido fa!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Precisione coordinate GPS
« Risposta #7 il: 15 Aprile 2015, 09:42:16 CEST »
0
Non è dell'agps che parlo.
Google con le sue google car non ha solo scattato tante belle foto per il mondo. Ha anche mappato tutti i WiFi che ha potuto.
Quando cerca di identificare una posizione il modo più efficiente è appunto quello di identificare tutti i WiFi che il telefono vede.... Inviarlo a Google che ti risponde la posizione dove li ha visti.

Certo non sempre è perfetto. Una volta ero su un traghetto GNV a Genova a Google mi diceva che ero a Palermo... Probabilmente quando è passata la google car la nave era  a Palermo.

Cmq, volevo capire, quanto tempo aspetti prima di date forfait e dire che la miglior posizione ha un errore di 2km? Il GPS a volte può impiegare parecchio. Anche con i dati agps.

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Precisione coordinate GPS
« Risposta #8 il: 15 Aprile 2015, 09:50:25 CEST »
0
Non scarto nessuna rilevazione.
All'avvio, dopo il login parte un conto alla rovescia che alla fine mi lancia la rilevazione, qualunque essa sia. E così via: conto alla rovescia -> Rilevazione -> conto alla rovescia -> Rilevazione... fino all'arresto dell'App.

Non scarto nulla. La "regione" in cui viene usato il dispositivo è piccola, le posizioni rilevate in base al lavoro svolto è conoscibile con tutta la "precisione" di 2km. Ho notato che il "centro" del raggio di precisione è esattamente la posizione del dispositivo (almeno nei miei test col mio dispositivo è così) ma poi la precisione manda alle ortiche il mio lavoro. Non voglio che i clienti, nonostante la posizione sia precisa, dicano che per via della precisione usata dal dispositivo la mia app non sia degna.
Alla fine sono solo dei telefoni in giro tutto il giorno, che agganciano questa o quella cella, questa o quella rete wifi o determinati satelliti. In pochi minuti ci si sposta da un paese all'altro. quindi... non mi arrovello molto la testa ma almeno vorrei poter non dovermi giustificare.
Stupido è chi lo stupido fa!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Precisione coordinate GPS
« Risposta #9 il: 15 Aprile 2015, 10:03:17 CEST »
0
Mi stai dicendo che prendi per buona la prima rilevazione che ti dà qualunque essa sia?

Ma ti registri un listener o usi getLastLocation?

Come ti dicevo, se ti registri un listener, ti viene il prima possibile la stima più veloce che il telefono riesce ad ottenere (in 1-2 secondi, la posizione ottenuta dalla cella o dal wifi), successivamente continuerà a cercare e ti ritornerà aggiornamenti con la nuova posizione o la posizione più precisa. Non riuscirà MAI a fare un fixing GPS prima di una posizione della cella o del Wifi. A meno che tu sia completamente offline, la prima posizione ottenuta quindi non sarà fatta con il GPS (a meno che un altra applicazione stia contestualmente effettuando fixing tramite Google Play Services).

Io opero in questo modo:
 - Mi pongo una precisione minima richiesta (20m)
 - Mi registro un listener
 - Ad ogni rilevamento se la tolleranza è inferiore a quella che mi sono imposto stoppo la localizzazione, altrimenti rimango in attesa.
 - Dopo qualche minuti abbandono comunque e mi tengo la migliore stima che ho avuto, significa che il GPS non è in grado di fare il fixing.

Ciao.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Precisione coordinate GPS
« Risposta #10 il: 15 Aprile 2015, 10:10:53 CEST »
0
Alla fine sono solo dei telefoni in giro tutto il giorno, che agganciano questa o quella cella, questa o quella rete wifi o determinati satelliti. In pochi minuti ci si sposta da un paese all'altro. quindi... non mi arrovello molto la testa ma almeno vorrei poter non dovermi giustificare.

Come stava dicendo anche arlabs, non puoi pretendere che le localizzazioni siano sempre tutte precise e perfette. Per ovviare al problema che stai citando devi lavorare a livello software: nascondi (in senso buono) all'utente le localizzazioni di bassa qualità e nel frattempo cerca di averne di migliori con tentativi addizionali. D'altra parte l'importante è l'esperienza utente, cioè filtrare via i risultati chiaramente non corretti e riprovare autonomamente.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Precisione coordinate GPS
« Risposta #11 il: 15 Aprile 2015, 10:17:29 CEST »
0
Posto direttamente il codice che uso

Codice (Java): [Seleziona]
public Location getLocation() {
                try {
                        locationManager = (LocationManager) mContext
                                        .getSystemService(Context.LOCATION_SERVICE);

                        // Vedo lo stato I/O del GPS
                        isGPSEnabled = locationManager
                                        .isProviderEnabled(LocationManager.GPS_PROVIDER);

                        // Vedo lo stato I/O di Internet
                        isNetworkEnabled = locationManager
                                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                        if (!isGPSEnabled && !isNetworkEnabled) {
                                // NO GPS - NO INTERNT -> impossibile determinare la posizione
                        } else {
                                this.canGetLocation = true;
                                if (isNetworkEnabled) {
                                        locationManager.requestLocationUpdates(
                                                        LocationManager.NETWORK_PROVIDER,
                                                        MIN_TIME_BW_UPDATE,
                                                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                                        // log.d("network", "Network");
                                        if (locationManager != null) {
                                                location = locationManager
                                                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                                                if (location != null) {
                                                        latitude = location.getLatitude();
                                                        longitude = location.getLongitude();
                                                        accuracy = location.getAccuracy();
                                                        altitude = location.getAltitude();
                                                }
                                        }
                                }
                                // Se è attivo il GPS prendiamo le coordinate usando il sensore
                                // GPS
                                if (isGPSEnabled) {
                                        if (location == null) {
                                                locationManager.requestLocationUpdates(
                                                                LocationManager.GPS_PROVIDER,
                                                                MIN_TIME_BW_UPDATE,
                                                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                                                // Log.d("GPS Enabled", "GPS Enabled");
                                                if (locationManager != null) {
                                                        location = locationManager
                                                                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                                        if (location != null) {
                                                                latitude = location.getLatitude();
                                                                longitude = location.getLongitude();
                                                                accuracy = location.getAccuracy();
                                                                altitude = location.getAltitude();
                                                        }
                                                }
                                        }
                                }
                        }

                } catch (Exception e) {
                        e.printStackTrace();
                }

                return location;
        }

e si prendo per buona la prima posizione perché quella di partenza.
Stupido è chi lo stupido fa!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Precisione coordinate GPS
« Risposta #12 il: 15 Aprile 2015, 10:30:44 CEST »
0
Ok, guardando il codice vedo 2 cose:

1.
Innanzitutto usi il LocationService e non i Google Play Services.
Non dico che sia male, ognuno ha i suoi pregi ed i difetti, l'interfaccia poi è molto simile.

2.
Vedo che ti registri a successivi aggiornamenti con requestLocationUpdates E prendi l'ultima posizione nota con getLastKnownLocation.
Ma non vedo il codice della onLocationChanged (e nemmeno dove ti deregistri).
getLastKnownLocation non è affidabile, può non tornarti niente o una posizione vecchia.

Visto che usi i LocationService ti consiglio di leggerti questo:
http://developer.android.com/guide/topics/location/strategies.html

La localizzazione è un operazione per cui serve tempo, non puoi pretendere di avere precisione, senza attendere...


Offline dimandrea

  • Nuovo arrivato
  • *
  • Post: 39
  • In realtà detesto con tutto me stesso Android.
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus MemoPad HD 7
  • Sistema operativo:
    Windows 7 - Windows 8.1 Up 1
Re:Precisione coordinate GPS
« Risposta #13 il: 15 Aprile 2015, 10:34:21 CEST »
0
Come stava dicendo anche arlabs, non puoi pretendere che le localizzazioni siano sempre tutte precise e perfette. Per ovviare al problema che stai citando devi lavorare a livello software: nascondi (in senso buono) all'utente le localizzazioni di bassa qualità e nel frattempo cerca di averne di migliori con tentativi addizionali. D'altra parte l'importante è l'esperienza utente, cioè filtrare via i risultati chiaramente non corretti e riprovare autonomamente.

Dover nascondere i risultati poco accurati, poco precisi, vuol dire non comunicare la posizione.
Purtroppo fare vari tentativi di rilevazione finché non si ottiene una rilevazione con una precisione accettabile significare saltare rilevazioni, saltare paesi...
Stupido è chi lo stupido fa!

Offline arlabs

  • Utente normale
  • ***
  • Post: 434
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Precisione coordinate GPS
« Risposta #14 il: 15 Aprile 2015, 10:42:33 CEST »
0
Non è quello che stiamo dicendo... stiamo dicendo che:

 - Se usi SOLO getLastKnownLocation (immagino, visto che non mi hai postato il codice della onLocationChanged), non stai effettuando la ricerca di una posizione. Stai solo chiedendo al telefono quale è l'ultima posizione che lui conosce... la precisione e la datazione di questa dipende da ricerche fatte da altre App. Se vuoi conoscere una posizione precisa, devi lanciare la ricerca ed attendere... Certo, chiamare getLastKnownLocation prima non fa male, magari la posizione conosciuta ti va già bene, ma non puoi fare affidamento solo su quest'ultima.
 - Bradipao non ti diceva di non visualizzare le posizioni che non ti piacciono, ma ti raffinarle (cioé, mentre sei nello stesso paese, attendere una localizzazione più precisa)