35 votes

Problème de précision de la localisation GPS sur Android

Je travaille sur des applications de géolocalisation sous Android. Voici l'architecture de mon code :

  1. BackgroundSyncService : Une classe de service qui est utilisée pour obtenir la mise à jour de la localisation. Ici, GoogleApiClient est initialisé et implémente d'autres méthodes liées à la localisation.
  2. AppRunCheckerReceiver : Une classe BroadcastReceiver qui va vérifier si mon BackgroundSyncService est en marche ou non dans un intervalle de temps. S'il s'est arrêté, il démarre.
  3. GpsEnableReceiver : Un BroadcastReceiver qui se déclenchera si le statut du GPS a changé. Il vérifiera si mon BackgroundSyncService est en cours ou non dans un intervalle de temps. S'il s'est arrêté, il démarre.
  4. InternetConnectionStateReceiver : Un BroadcastReceiver qui se déclenche lorsque l'état d'Internet change. Il vérifiera si mon BackgroundSyncService est en cours d'exécution ou non dans un intervalle de temps. S'il est arrêté, il démarre.

Dans mon BackgroundSyncService j'initialise le GoogleApiClient de cette façon :

public void setLocationLocationRequest() {

        try {
            googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).addApi(com.google.android.gms.location.LocationServices.API).build();

            locationRequest = new LocationRequest();
            locationRequest.setInterval(3000);
            locationRequest.setFastestInterval(3000);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            googleApiClient.connect();
        } catch (Exception e) {

    }

Ici, la précision est LocationRequest.PRIORITY_HIGH_ACCURACY et l'intervalle est

locationRequest.setInterval(3000)

ici est le code de mise en œuvre de GoogleApiClient.

Ce site application Infos GPS La section contient les paramètres Latitude, Longitude et Précision.

Mes conclusions : en onLocationChanged(Location location) Je vérifie la précision de l'objet Location de cette manière : location.getAccuracy() . Ici, si la précision est inférieure à 50 mètres, alors je l'accepte.

Dans 85% des cas, cela fonctionne comme un charme. Il m'envoie la position exacte du GPS. Mais dans 15% des cas, il m'envoie une localisation imprécise comme plus de >300 mètres.

Les 15% d'appareils sont des mobiles de marque chinoise à bas prix.

Mes questions :

  1. Comment puis-je obtenir un niveau de précision proche de 99%. Y a-t-il un problème dans l'architecture de mon code ?
  2. La précision du GPS dépend-elle de la configuration de l'appareil ? Si OUI, que puis-je faire pour un appareil à faible configuration ?
  3. Comment les applications de covoiturage Uber, Go-JEK etc. fonctionnent-elles sur tous les appareils ? Ont-ils un codage supplémentaire pour le GPS seulement ?
  4. Ma demande concerne le Bangladesh. Ici, l'Internet est lent. Cela a-t-il un impact négatif sur la précision du GPS ?

Merci d'avance pour ce fil de discussion. Et aussi désolé pour le mauvais anglais.

2 votes

Avez-vous essayé avec FusedLocationProviderAPI ?

0 votes

Merci @Piyush, je l'ai utilisé mais aucune amélioration.

0 votes

Lorsque vous dites qu'il fonctionne correctement dans 85 % des cas, voulez-vous dire 85 % des emplacements que vous obtenez ou 85 % des appareils ? En ce qui concerne la question 4, la vitesse d'Internet n'a rien à voir avec le GPS. Il s'agit de deux systèmes différents.

23voto

Krrish Points 566

Les mises à jour de la localisation peuvent être effectuées de la manière suivante :

  1. La localisation que vous obtenez par GPS est plus précise que celle que vous obtenez par le réseau, donc si vous avez besoin de précision, utilisez le GPS.

  2. Je ne suis pas sûr de cela, mais je pense que c'est en fonction du contexte, du type de localisation que vous voulez, comme la précision ou la rapidité, et en fonction de cela, choisissez votre fournisseur.

  3. Le fournisseur FusedLocation est la solution la plus efficace pour obtenir l'emplacement sur Android maintenant, il rassemble les données d'emplacement de différentes sources et selon les paramètres passés comme dans combien de temps vous voulez que l'emplacement soit mis à jour, vous voulez une grande précision ou non etc.Il vous fournit le meilleur emplacement.

  4. Oui, vous devez utiliser le FusedLocationProvider pour obtenir la localisation sur Android, car Google le recommande également et c'est le moyen le plus efficace d'obtenir la localisation sur Android pour le moment.

enter image description here

Pourquoi ne pas essayer en créant Criteria.ACCURACY_HIGH

Une constante indiquant une exigence de haute précision - peut être utilisée pour la précision horizontale, d'altitude, de vitesse ou de relèvement. Pour la position horizontale et verticale, cela correspond approximativement à une précision de moins de 100 mètres.

Android tente de nous masquer la réalité du matériel, mais en pratique, il n'existe que deux fournisseurs de localisation : le GPS et le réseau. La localisation par GPS est lente et tous les appareils n'en sont pas équipés, mais elle est précise. La localisation par réseau est plus rapide et est prise en charge par presque tous les appareils, mais elle est moins précise.

Google a amélioré sa gestion des cartes et des emplacements avec fournisseur de localisation fusionné.

Le point d'entrée principal pour interagir avec le fournisseur de localisation fusionné. Les méthodes doivent être utilisées conjointement avec un GoogleApiClient.


Code :

 new GoogleApiClient.Builder(context)
         .addApi(LocationServices.API)
         .addConnectionCallbacks(this)
         .addOnConnectionFailedListener(this)
         .build()

gps -> (GPS, AGPS) : Nom du fournisseur de localisation GPS. Ce fournisseur détermine la localisation à l'aide de satellites. En fonction des conditions, ce fournisseur peut prendre un certain temps avant de renvoyer une localisation. Requiert la permission Android.permission.ACCESS_FINE_LOCATION.

réseau -> (AGPS, CellID, WiFi MACID) : Nom du fournisseur de localisation du réseau. Ce fournisseur détermine l'emplacement en fonction de la disponibilité des tours cellulaires et des points d'accès WiFi. et de points d'accès WiFi. Les résultats sont récupérés au moyen d'un réseau recherche de réseau. Requiert l'une des permissions suivantes Android.permission.ACCESS_COARSE_LOCATION ou Android.permission.ACCESS_FINE_LOCATION.


Autres options :

getLastKnownLocation()

El getLastKnownLocation() ceci renvoie le dernier emplacement connu...après avoir réinstallé l'application, il n'y aura pas de dernier emplacement connu...donc il en résultera un NPE...utilisez plutôt le code ci-dessous

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        // getting GPS status
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } else {
            this.canGetLocation = true;
            //here is the if-else change so code avoids falling into both loops
         // if GPS Enabled get lat/long using GPS Services
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            } else if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network Enabled");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
        }

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

    return location;
}

Vérifiez les quelques meilleurs exemples que j'ai trouvés :

Ça a marché pour moi... ça devrait marcher pour vous aussi...

0 votes

@user2450263 selon le code, il vérifiera d'abord le GPS et s'il est trouvé, il récupérera la localisation à partir du GPS uniquement.

0 votes

Incorrect, selon le code, il va tomber dans la boucle else, passer par les deux boucles if indépendamment de l'emplacement qu'il va utiliser, c'est le même problème d'où le code est soulevé :)

1 votes

Comment il va entrer dans les deux conditions que j'ai if() puis else if() Il vérifiera la condition if et si elle est vraie, il entrera dans la condition et n'appellera donc jamais else if() Bien que l'OP ait vérifié et approuvé cette logique. J'en reste là, merci ! !!!

7voto

ugur Points 2018
  1. Comment puis-je obtenir un niveau de précision proche de 99%. Y a-t-il un problème dans l'architecture de mon code ?

C'est un scénario de la vie réelle. Vous ne pouvez pas garantir que tous les fournisseurs d'emplacements fonctionneront comme prévu. Vous devez demander la meilleure position disponible.

  1. a) La précision du GPS dépend-elle de la configuration de l'appareil ?

OUI. Certains appareils peuvent avoir des puces GPS plus anciennes qui ne peuvent suivre que les signaux GPS (États-Unis) car il existe d'autres systèmes de positionnement comme Galileo (Europe), GLONASS (Russie), QZSS (Japon) et Beidou (Chine). Plus le chipset prend en charge ces types de systèmes, plus vous avez de chances de suivre d'autres satellites et d'obtenir ainsi une position fixe. Le TTFF (time to first fix) dépend également du nombre de canaux dont dispose le récepteur GPS.

b) Si OUI, que puis-je faire pour un appareil à faible configuration ?

Comme il s'agit d'un problème matériel, vous ne pouvez rien faire ici. Mais d'autres sources de localisation peuvent compenser le manque de données GPS, comme l'AGPS (aided gps), le positionnement wifi et cellulaire. Il existe également des options payantes qui fournissent une base de données pour localiser votre appareil en utilisant les points d'accès wifi et les cellulaires (ils prétendent fournir la meilleure solution sur le wifi mais je n'en suis pas sûr car je ne l'utilise pas. http://combain.com ). Le Wifi et le cellulaire dépendent également du nombre de points d'accès wifi et de tours de téléphonie mobile disponibles dans les environs et de leur distance (force du signal). Si vous avez besoin d'une précision de 50m, le positionnement cellulaire n'a rien à faire mais le wifi a une chance de se rapprocher de cette valeur.

Quelques résultats d'études de 2009 [3]

  • iPhone 3G avec A-GPS ~ 8 mètres
  • iPhone 3G w/ wifi ~ 74 mètres
  • iPhone 3G avec positionnement cellulaire ~ 600 mètres
  1. Comment les applications de covoiturage Uber, Go-JEK etc. fonctionnent-elles sur tous les appareils ? Ont-ils un codage supplémentaire pour le GPS seulement ?

Ils peuvent avoir des stratégies de localisation spécifiques, mais elles seront basées sur l'utilisation d'autres sources pendant la panne du GPS.

  1. Ma demande concerne le Bangladesh. Ici, l'internet est lent. Cela a-t-il un impact négatif sur la précision du GPS ?

D'autres réponses affirment qu'Internet n'est pas lié au GPS. Oui, c'est vrai, il n'est pas lié au GPS mais à la localisation. L'AGPS utilise Internet pour récupérer 3 types de données (signaux satellites, almanachs et éphémérides) qui aident le GPS à fournir une position fixe plus rapidement. Si les éphémérides et les almanachs sont périmés ou si l'appareil s'est déplacé de plusieurs centaines de km par rapport à la position précédente, on parle de démarrage à froid et cela prend environ 12 à 15 minutes sans AGPS.

Le fournisseur de localisation fusionné sait déjà comment fournir la meilleure solution avec ces configurations, vous devriez donc le bénir.

Références :

3voto

Pararth Points 7312

+1 pour la description en question.
J'espère que nous trouverons la meilleure réponse à votre question et que nous l'améliorerons au fil du temps, d'après ce que je sais il n'y aura pas qu'une seule bonne réponse ici.

Premièrement, (et deuxièmement)

  1. Comment puis-je obtenir un niveau de précision proche de 99%. Y a-t-il un problème dans l'architecture de mon code ?

  2. La précision du GPS dépend-elle de la configuration de l'appareil ? Si OUI, que puis-je faire pour un appareil à faible configuration ?

Les deux - la configuration du dispositif et l'architecture du code, sont importantes ici. Si vous avez déjà un taux de réussite de 85%, l'architecture du code est correcte, je pense.
En ce qui concerne le GPS, la visibilité directe est un facteur important pour la configuration et la précision des appareils. Bien qu'un mobile à bas prix puisse renvoyer une localisation précise avec une ligne de visée claire. Vous pouvez essayer d'exécuter 2 cycles de plus/attendre pour obtenir une meilleure précision.

Dans le pire des cas et pour ce que ça vaut, vous pouvez aussi essayer de récupérer l'emplacement en utilisant la fonction LocationManager et la technique du fournisseur de GPS qui fonctionne comme une solution de repli dans les 15% juste pour comparer et s'assurer que vous utilisez la localisation la plus précise possible. Stratégies de localisation le mettre comme

Dans la plupart des cas, vous obtiendrez de meilleures performances de la batterie, ainsi que plus de précision, en utilisant l'API des services de localisation.

  1. Comment les applications de covoiturage Uber, Go-JEK etc. fonctionnent-elles sur tous les appareils ? Ont-ils un codage supplémentaire pour le GPS seulement ?
    Ils fonctionnent mais pas toujours avec la plus grande précision pour les emplacements reçus dans l'application. S'il existe des astuces de localisation pour nous, développeurs, nous devons les trouver, peut-être en cinquième page de google :) ou profiter de l'environnement open source. Pour moi, les meilleures pratiques et les liens vers les dépôts Android suffisent. Vous avez déjà suivi des posts comme Recevoir des mises à jour de la localisation

  2. Ma demande concerne le Bangladesh. Ici, l'Internet est lent. Cela a-t-il un impact négatif sur la précision du GPS ?
    Pas de relation entre l'internet et LocationManager + GPS_PROVIDER

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X