Problème de précision de localisation GPS Android

je travaille sur les applications de suivi gps dans android. Voici mon architecture de code:

  1. BackgroundSyncService: une classe de service qui est utilisée pour obtenir la mise à jour d'emplacement. Ici GoogleApiClient est initialisé et implémente d'autres méthodes liées à la localisation.
  2. AppRunCheckerReceiver: une classe de diffusion qui vérifiera si mon BackgroundSyncService est en cours d'exécution ou non dans un intervalle de temps. Si elle s'est arrêtée alors elle commencer.
  3. GpsEnableReceiver: un émetteur-récepteur qui se déclenche en cas de changement d'état gps. Il va vérifier si mon BackgroundSyncService est en cours d'exécution ou non dans un intervalle de temps. Si il a cessé ensuite de démarrer.
  4. InternetConnectionStateReceiver: un émetteur-récepteur qui se déclenche lorsque le statut internet change. Il va vérifier si mon BackgroundSyncService est en cours d'exécution ou non dans un intervalle de temps. Si elle est arrêtée, alors elle commence.

Dans mon BackgroundSyncService service que je initialiser le GoogleApiClient à l'aide 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 accuricy est LocationRequest.PRIORITY_HIGH_ACCURACY et l'intervalle est

locationRequest.setInterval(3000)

ici est le code de mise en œuvre GoogleApiClient.

application GPS info section contient des de Latitude, la longitude et la Précision du paramètre

Mes Conclusions:onLocationChanged(Location location) méthode je vérifie l'exactitude de L'objet de localisation de cette façon:location.getAccuracy(). Ici, si l' la précision est de moins de 50 mètres, alors je l'accepte.

Dans 85% des cas, il fonctionne comme un charme. Il m'envoie la position exacte du GPS. Mais dans 15% des cas, ça m'envoie une localisation inexacte comme plus de 300 mètres.

l'appareil de 15% sont à faible coût Chine marque mobile.

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 du GPS dépend de la configuration du périphérique? si oui, que puis-je faire pour le périphérique de configuration basse?
  3. Comment Uber, Allez-JEK etc. le covoiturage apps fonctionne pour tous les appareils? Est-ce qu'ils ont des codes supplémentaires pour GPS seulement?
  4. ma demande est pour le Bangladesh. Ici, internet est lent. A-t-il un impact négatif sur la précision du GPS?

Merci à l'avance pour ce thread. Et aussi désolé pour le mauvais anglais.

24
demandé sur Md. Sajedul Karim 2017-02-21 10:56:01

3 réponses

les mises à jour des emplacements peuvent être faites de la façon suivante:

  1. la localisation que vous obtenez à partir du GPS est plus précise que la localisation que vous obtenez à partir du réseau,donc si vous avez besoin de précision utilisez GPS

  2. Pas sûr de cela, mais je pense que sur le contexte de ce type d'emplacement que vous voulez comme vous voulez l'exactitude ou la plus rapide selon que choisir votre fournisseur

  3. le fournisseur de services D'installation de fusées est le plus efficace et solution efficace pour obtenir l'emplacement sur android maintenant,il rassemble les données de localisation à partir de différentes sources et selon les paramètres passés comme dans combien de temps vous voulez emplacement à être mis à jour, vous voulez haute précision ou non, etc It provides you the best location.

  4. Oui, vous devez utiliser le FusedLocationProvider pour obtenir l'emplacement sur android,comme google recommande également CE et il le moyen le plus efficace et efficace pour obtenir l'emplacement sur android pour maintenant.

enter image description here

Pourquoi n'essayez-vous pas par la création d' 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 à peu près à une précision de moins de 100 mètres.

Android essaie de masquer la réalité du matériel de nous, mais en 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. Emplacement réseau est plus rapide et est soutenu 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ée.

le principal point d'entrée pour interagir avec le fournisseur d'emplacement 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. Selon conditions, ce fournisseur peut prendre un certain temps pour revenir à un emplacement fixe. Nécessite la permission androïde.autorisation.ACCESS_FINE_LOCATION.

réseau –> (AGPS, CellID, WiFi MACID): nom du fournisseur de l'emplacement du réseau. Ce fournisseur détermine l'emplacement en fonction de la disponibilité de la tour cellulaire et les points d'accès WiFi. Les résultats sont extraits au moyen d'un réseau Lookup. Nécessite des autorisations Android.autorisation.ACCESS_COARSE_LOCATION ou Android.autorisation.ACCESS_FINE_LOCATION.


Autres Options:

getLastKnownLocation ()

getLastKnownLocation() renvoie la dernière position connue...après avoir ré-installer l'application, il n'aura pas la dernière l'emplacement...pour qu'il en résulte des 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;
}

Cochez les meilleurs exemples que j'ai a travaillé pour moi...devrait fonctionner pour vous aussi...

16
répondu Krrish 2018-03-20 14:15:06
  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?

c'est un scénario réel. Vous ne pouvez pas garantir que tous les fournisseurs d'emplacement fonctionnera comme prévu. Vous devriez demander des places disponibles.

  1. a) la précision du 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 le GPS signals (USA) puisqu'il existe D'autres systèmes de positionnement comme Galileo (Europe), GLONASS (Russie), QZSS (Japon) et Beidou (Chine). Plus le support de chipset pour ces types plus de chance vous obtenez de suivre plus de satellite par la présente position fixe. De même TTFF (temps de première correction) dépend de combien de canaux dispose le récepteur gps.

b) Si oui, que puis-je faire pour le périphérique de configuration basse?

Puisque c'est 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 cellidés (ils prétendent qu'ils fournissent la meilleure solution sur wifi mais je ne suis pas sûr car je ne l'utilise pas. you can check it out http://combain.com). Wifi et cellid dépendent également du nombre de points d'accès wifi et de la tour cellulaire disponibles et de la distance sont (force du signal). Si vous avez besoin de précision de 50m, positionnement cellulaire n'a rien à faire, mais le wifi a une chance de se rapprocher de cette valeur.

Certains résultats de l'étude de 2009 [3]

  • 3G iPhone w / A-GPS ~ 8 mètres
  • iPhone 3G w/ wifi ~ 74 mètres
  • iPhone 3G w/ positionnement Cellulaire ~ 600 mètres
  1. Comment Uber, Allez-JEK etc. le covoiturage apps fonctionne pour tous les appareils? Est-ce qu'ils ont des codes supplémentaires 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 lors de la panne GPS.

  1. ma demande est pour le Bangladesh. Ici, internet est lent. A-t-il un impact négatif sur la précision du GPS?

d'Autres réponses prétend qu'internet n'est pas lié au GPS. Oui, il est vrai que ce N'est pas lié au GPS mais à sa localisation. AGPS utilise internet pour récupérer 3 types de données (signaux satellites, almanac et ephemeris) qui aident le GPS à régler la position plus rapidement. Si ephemeris et Almanach sont dépassés ou l'appareil déplacé à plusieurs centaines de kilomètres du point de position précédent, alors il est appelé démarrage à froid et prend environ 12-15min sans AGPS.

le fournisseur D'emplacement fusionné sait déjà comment fournir la meilleure solution avec ces configurations, donc vous devriez le bénir.

Références:

5
répondu ugur 2017-03-01 21:34:54

+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 ne sera pas seulement une bonne réponse ici.

la Première(et deuxième)

  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 du GPS dépend-elle de la configuration de l'appareil? si oui, que puis-je faire pour une configuration basse? dispositif?

la configuration de l'appareil et l'architecture du code sont importantes ici. Si vous êtes déjà à un taux de succès de 85%, l'architecture du code est très 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 pourrait retourner un emplacement précis avec une ligne de visibilité claire. Vous pouvez essayer d'exécuter 2 cycles 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 retrouver l'emplacement en utilisant le LocationManager et la technique du fournisseur de GPS qui fonctionne comme un repli dans le 15% juste pour comparer et s'assurer que vous utilisez l'emplacement le plus précis que vous pouvez obtenir. Stratégies De Localisation

dans la plupart des cas, vous obtiendrez une meilleure performance de la batterie, ainsi que plus précision appropriée, en utilisant les Services de Localisation API.

  1. Comment Uber, Allez-JEK etc. le covoiturage apps fonctionne pour tous les appareils? Est-ce qu'ils ont des codes supplémentaires pour GPS seulement?

    Ils fonctionnent, mais pas toujours avec la plus grande précision pour les emplacements reçus dans l'application. S'il y a des hacks de localisation pour nous développeurs, nous devons les trouver, peut-être une 5ème page google search result :) ou profiter de l'environnement open source. Pour moi, les meilleures pratiques et les liens repo android suffisent. Vous avez déjà suivi des postes comme emplacement de réception des mises à jour

  2. ma demande est pour le Bangladesh. Ici, internet est lent. A-t-il un impact négatif sur la précision du GPS?

    Aucune relation entre internet et LocationManager+ GPS_PROVIDER

3
répondu user2450263 2017-02-24 06:33:07