web-dev-qa-db-fra.com

Android Problème de précision de localisation GPS

Je travaille sur des applications de suivi GPS dans Android. Voici mon architecture de code:

  1. BackgroundSyncService : classe de service utilisée pour obtenir la mise à jour de l'emplacement. Ici, GoogleApiClient est initialisé et implémente d'autres méthodes liées à la localisation.
  2. AppRunCheckerReceiver : classe BroadcastReceiver qui vérifiera si mon BackgroundSyncService fonctionne ou non dans un intervalle de temps. S'il s'est arrêté, il a commencé.
  3. GpsEnableReceiver : Un BroadcastReceiver se déclenchera si l'état du gps a changé. Il vérifiera si mon BackgroundSyncService fonctionne ou non dans un intervalle de temps. S'il s'est arrêté, il a commencé.
  4. InternetConnectionStateReceiver : Un BroadcastReceiver se déclenchera lorsque l'état d'Internet changera. Il vérifiera si mon BackgroundSyncService fonctionne ou non dans un intervalle de temps. S'il est arrêté, il démarre.

Dans mon service BackgroundSyncService, j'initialise GoogleApiClient en utilisant cette méthode:

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 d'implémentation de GoogleApiClient.

This application La section info GPS contient la longitude Latitude et le paramètre de précision

Mes résultats: dans la méthode 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, 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, cela m'envoie un emplacement inexact comme plus de 300 mètres.

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

Mes questions:

  1. Comment puis-je atteindre un niveau de précision proche de 99%. Y a-t-il un problème sur mon architecture de code?
  2. La précision 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 partage de trajet Uber, Go-JEK, etc. fonctionnent-elles pour tous les appareils? Ont-ils un codage supplémentaire pour le GPS uniquement?
  4. Ma demande concerne le Bangladesh. Ici, Internet est lent. Cela a-t-il un impact négatif sur la précision GPS?

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

32
Md. Sajedul Karim

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

  1. L'emplacement que vous obtenez du GPS est plus précis que l'emplacement que vous obtenez du 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 dans le contexte quel type d'emplacement vous voulez comme vous voulez la précision ou le plus rapide donc en fonction de cela choisissez votre fournisseur

  3. Le fournisseur FusedLocation est la solution la plus efficace et la plus efficace pour obtenir l'emplacement sur Android maintenant, il rassemble les données de localisation à partir de différentes sources et en fonction des paramètres transmis comme en 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 l'emplacement sur Android, car Google le recommande également et c'est le moyen le plus efficace et le plus efficace pour obtenir l'emplacement sur Android pour l'instant.

enter image description here

Pourquoi n'essayez-vous pas en créant Criteria.ACCURACY_HIGH

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

Android essaie de nous masquer la réalité du matériel, mais dans la pratique, il n'y a que deux fournisseurs de localisation: le GPS et le réseau. La localisation GPS est lente et tous les appareils ne l'ont pas, mais elle est précise. L'emplacement réseau est plus rapide et est pris en charge par presque tous les appareils, mais il est moins précis.

Google a amélioré sa gestion de carte et de localisation avec fournisseur de localisation fusionné.

Le principal point d'entrée pour interagir avec le fournisseur de localisation fusionné. Les méthodes doivent être utilisées en conjonction 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 l'emplacement à l'aide de satellites. Selon les conditions, ce fournisseur peut prendre un certain temps pour renvoyer un correctif de position. Nécessite l'autorisation Android.permission.ACCESS_FINE_LOCATION.

réseau -> (AGPS, CellID, WiFi MACID): nom du fournisseur de localisation réseau. Ce fournisseur détermine l'emplacement en fonction de la disponibilité de la tour cellulaire et des points d'accès WiFi. Les résultats sont récupérés au moyen d'une recherche réseau. Nécessite l'une des autorisations Android.permission.ACCESS_COARSE_LOCATION ou Android.permission.ACCESS_FINE_LOCATION.


Autres options:

getLastKnownLocation ()

La getLastKnownLocation() ceci renvoie le dernier emplacement connu ... après avoir réinstallé l'application, elle n'aura pas de dernier emplacement connu ... il en résultera donc en NPE ... à la place, utilisez 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;
}

Cochez quelques meilleurs exemples que j'ai trouvés:

Cela a fonctionné pour moi ... devrait également fonctionner pour vous ...

21
Krrish
  1. Comment puis-je atteindre un niveau de précision proche de 99%. Y a-t-il un problème sur mon architecture de code?

Ceci est un scénario réel. Vous ne pouvez pas vous assurer que tous les fournisseurs de localisation fonctionneront comme prévu. Vous devriez demander le meilleur poste disponible.

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

OUI. Certains appareils peuvent avoir des chipsets GPS plus anciens qui ne peuvent suivre que les signaux GPS (USA) 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, plus vous avez de chances de suivre plus de satellites pour corriger la position. Le TTFF (temps avant la première correction) 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?

Puisqu'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 telles que l'AGPS (gps assisté), le wifi et le positionnement cellulaire. Il y a aussi des options payantes qui fournissent une base de données pour localiser votre appareil en utilisant des points d'accès wifi et des cellids (ils prétendent qu'ils fournissent la meilleure solution sur le wifi mais je ne suis pas sûr car je ne l'utilise pas. Vous pouvez le vérifier http : //combain.com ). Le wifi et le cellid dépendent également du nombre de points d'accès wifi et de la tour de cellule disponibles autour et de leur distance (puissance du signal). Si vous avez besoin d'une précision de 50 m, le positionnement cellulaire n'a rien à voir 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 avec wifi ~ 74 mètres
  • IPhone 3G avec positionnement cellulaire ~ 600 mètres
  1. Comment les applications de partage de trajet Uber, Go-JEK, etc. fonctionnent-elles pour tous les appareils? Ont-ils un codage supplémentaire pour le GPS uniquement?

Ils peuvent avoir des stratégies de localisation spécifiques, mais cela reposera sur l'utilisation d'autres sources pendant une panne GPS.

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

D'autres réponses affirment qu'Internet n'est pas lié au GPS. Oui c'est vrai ce n'est pas lié au GPS mais à la localisation. AGPS utilise Internet pour récupérer 3 types de données (signaux satellite, almanach et éphémérides) qui aident le GPS à fournir une position plus rapidement. Si les éphémérides et les almanachs sont obsolètes ou que l'appareil s'est éloigné de plusieurs centaines de kilomètres de la position précédente, il est appelé démarrage à froid et 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.

Les références:

5
ugur

+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.

D'abord (et ensuite)

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

  2. La précision 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 des périphériques et l'architecture du code sont ici importants. Si vous êtes déjà à un taux de réussite de 85%, l'architecture du code est bien je pense.
En ce qui concerne le GPS, la visibilité directe est un facteur important en ce qui concerne la configuration et la précision des appareils. Bien qu'un mobile à faible coût puisse renvoyer un emplacement précis avec une ligne de visée claire. Vous pouvez essayer d'exécuter 2 cycles de plus/en attente pour atteindre une plus grande précision.

Dans le pire des cas et pour ce que cela vaut, vous pouvez également essayer de récupérer la position à l'aide de la technique LocationManager et du fournisseur de GPS qui fonctionne comme une solution de rechange dans les 15% juste pour comparer et vous assurer que vous utilisez le plus emplacement précis que vous pouvez obtenir. Stratégies de localisation mettez-le comme

Dans la plupart des cas, vous obtiendrez de meilleures performances de la batterie, ainsi qu'une précision plus appropriée, en utilisant l'API Location Services.

  1. Comment les applications de partage de trajet Uber, Go-JEK, etc. fonctionnent-elles pour tous les appareils? Ont-ils un codage supplémentaire pour le GPS uniquement?
    Ils fonctionnent, mais pas toujours avec la plus grande précision pour les emplacements reçus dans l'application. S'il existe des hacks de localisation pour nous, développeurs, nous devons les trouver, peut-être un résultat de recherche Google sur la 5ème page :) ou bénéficier de l'environnement open source. Pour moi, les meilleures pratiques et Android suffisent. Vous avez déjà suivi des articles comme Recevoir les mises à jour de l'emplacement

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

3
Pararth