Problem z dokładnością lokalizacji GPS Android

[9]}pracuję nad aplikacjami do śledzenia gps w Androidzie. Oto moja Architektura kodu:

  1. BackgroundSyncService : klasa usług używana do uzyskiwania aktualizacji lokalizacji. Tutaj GoogleApiClient jest inicjowany i implementuje inne metody związane z lokalizacją.
  2. AppRunCheckerReceiver : Klasa BroadcastReceiver, która sprawdzi, czy mój BackgroundSyncService jest uruchomiony, czy nie w przedziale czasu. Jeśli się zatrzymało, to się zaczęło.
  3. GpsEnableReceiver : BroadcastReceiver uruchomi się, jeśli zmieni się status gps. Sprawdzi, czy mój BackgroundSyncService działa, czy nie w przedziale czasowym. Jeśli się zatrzymało, to się zaczęło.
  4. InternetConnectionStateReceiver : BroadcastReceiver zostanie uruchomiony po zmianie statusu Internetu. Sprawdzi, czy mój BackgroundSyncService działa, czy nie w przedziale czasowym. Jeśli zostanie zatrzymany, to się rozpocznie.

W moim serwisie BackgroundSyncService inicjalizuję GoogleApiClient w ten sposób:

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) {

    }

Tutaj jest LocationRequest.PRIORITY_HIGH_ACCURACY a interwał to

locationRequest.setInterval(3000)

Tutaj znajduje się kod implementacji GoogleApiClient.

Ten Aplikacja GPS info sekcja zawiera szerokość długość i parametr dokładności

Moje ustalenia: w metodzie onLocationChanged(Location location) sprawdzam dokładność obiektu lokalizacji w ten sposób: location.getAccuracy(). Tutaj, jeśli dokładność jest mniejsza niż 50 metrów, to akceptuję to.

W 85% przypadków działa jak czar. Wysyła mi dokładną lokalizację z GPS. Ale w 15% przypadki, to wysyła mi niedokładne położenie jak więcej > miernik 300.

15% urządzenia są tanie CHINA brand mobile.

Moje Pytania:

  1. Jak mogę osiągnąć poziom dokładności zbliżony do 99%. Czy jest jakiś problem z moją architekturą kodu?
  2. Czy dokładność GPS zależy od konfiguracji urządzenia? jeśli tak, to co mogę zrobić dla urządzenia o niskiej konfiguracji?
  3. jak Uber, Go-JEK itp. aplikacje do udostępniania jazdy działają na wszystkich urządzeniach? Czy mają dodatkowe kodowanie GPS tylko?
  4. Moja aplikacja jest dla Bangladeszu. Tutaj internet jest powolny. Czy ma to negatywny wpływ na dokładność GPS?

Z góry dzięki za ten wątek. A także przepraszam za zły angielski.

Author: Md. Sajedul Karim, 2017-02-21

3 answers

Aktualizacje lokalizacji można wykonać w następujący sposób:

  1. Lokalizacja otrzymywana z GPS jest dokładniejsza niż lokalizacja otrzymywana z sieci,więc jeśli potrzebujesz dokładności, Użyj GPS

  2. Nie jestem pewien, co do tego, ale myślę, że jego o kontekście, jakiego rodzaju lokalizacji chcesz, jak chcesz dokładności lub najszybszej, więc zgodnie z tym wybierz dostawcę

  3. Fusedlocation provider jest najbardziej wydajnym i skutecznym rozwiązaniem do uzyskania lokalizacja na Androidzie teraz gromadzi dane o lokalizacji z różnych źródeł i zgodnie z parametrami przekazanymi, jak w czasie, w którym chcesz, aby lokalizacja była aktualizowana, chcesz wysokiej dokładności, czy nie etc.It zapewnia najlepszą lokalizację.

  4. Tak, powinieneś użyć FusedLocationProvider, aby uzyskać lokalizację na Androidzie, ponieważ google również to zaleca i jest to najbardziej skuteczny i wydajny sposób, aby uzyskać lokalizację na Androidzie teraz.

Tutaj wpisz opis obrazka

Dlaczego nie spróbujesz stworzyć Criteria.ACCURACY_HIGH

Stała wskazująca wymaganą wysoką dokładność - może być stosowana dla dokładności poziomej, wysokości, prędkości lub łożyska. Dla pozycji poziomej i pionowej odpowiada to mniej więcej dokładności mniejszej niż 100 metrów.

Android stara się maskować rzeczywistość sprzętu od nas, ale w praktyce są tylko dwaj dostawcy lokalizacji: GPS i sieć. Lokalizacja GPS jest powolna i nie wszystkie urządzenia ją mają, ale jest dokładna. Lokalizacja sieciowa jest szybsza i jest obsługiwana przez prawie wszystkie urządzenia, ale jest mniej dokładna.

[[8]}Google poprawiło zarządzanie mapami i lokalizacjami za pomocą połączonego dostawcy lokalizacji.

Główny punkt wejścia do interakcji z dostawcą lokalizacji zespolonej.Metody muszą być używane w połączeniu z GoogleApiClient.


Kod:

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

Gps - > (GPS, AGPS): Nazwa dostawcy lokalizacji GPS. Ten dostawca określa lokalizację za pomocą satelitów. W zależności od warunki, ten dostawca może chwilę potrwać, aby zwrócić poprawkę lokalizacji. Wymaga uprawnień android.pozwolenie.ACCESS_FINE_LOCATION.

Sieć - > (AGPS, CellID, WiFi MACID): Nazwa dostawcy lokalizacji sieciowej. Ten dostawca określa lokalizację na podstawie dostępności wieży komórkowej i punkty dostępowe WiFi. Wyniki są pobierane za pomocą sieci / align = "left" / Wymaga jednego z uprawnień android.pozwolenie.ACCESS_COARSE_LOCATION or android.pozwolenie.ACCESS_FINE_LOCATION.


Inne Opcje:

GetLastKnownLocation ()

The getLastKnownLocation() to zwraca ostatnią znaną lokalizację...po ponownym zainstalowaniu aplikacji nie będzie ona miała żadnych ostatnich znanych location...so spowoduje to NPE...zamiast tego użyj poniższego kodu

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;
}

Sprawdź kilka najlepszych przykładów, które mam znaleziono:

It dla mnie zadziałało...dla ciebie też powinno działać...

 16
Author: Krrish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-20 14:15:06
    Jak mogę osiągnąć poziom dokładności zbliżony do 99%? Czy jest jakiś problem z moją architekturą kodu?
To jest prawdziwy scenariusz. Nie można zapewnić, że wszyscy dostawcy lokalizacji będą działać zgodnie z oczekiwaniami. Powinieneś poprosić o najlepszą dostępną pozycję.
    A) czy dokładność GPS zależy od konfiguracji urządzenia?
Tak. Niektóre urządzenia mogą mieć starsze Chipsety GPS, które mogą śledzić tylko sygnały GPS (USA), ponieważ istnieją inne systemy pozycjonowania takie jak Galileo( Europa), GLONASS (Rosja), QZSS (Japonia) i Beidou (Chiny). Im bardziej obsługa chipsetu dla tych typów, tym większa szansa na śledzenie większej liczby satelitów. Również TTFF (czas na pierwszą naprawę) zależy od tego, ile kanałów ma odbiornik gps.

B) jeśli tak, to co mogę zrobić dla urządzenia o niskiej konfiguracji?

Ponieważ jest to problem sprzętowy, nie możesz tu nic zrobić. Ale inne źródła lokalizacji mogą zrekompensować brak danych GPS, takich jak AGPS (aided gps), wifi i pozycjonowanie komórkowe. Istnieje również kilka płatnych opcji, które zapewnia bazę danych, aby zlokalizować urządzenie za pomocą punktów dostępowych wifi i komórek (twierdzą, że zapewniają najlepsze rozwiązanie na wifi, ale nie jestem pewien, ponieważ go nie używam. możesz to sprawdzić http://combain.com [22]}). Wifi i cellid zależy również od tego, ile punktów dostępu wifi i wieży komórkowej są dostępne w okolicy i jak daleko są (siła sygnału). Jeśli potrzebujesz dokładności 50m, komórkowy pozycjonowanie nie ma nic wspólnego, ale wifi ma szansę zbliżyć się do tej wartości.

Niektóre wyniki badań z 2009 roku [3]

  • iPhone 3G w / A-GPS ~ 8 metrów
  • iPhone 3G W / wifi ~ 74 metry
  • iPhone 3G W / Cellular pozycjonowanie ~ 600 metrów
  1. Jak Uber, Go-JEK itp. aplikacje do udostępniania jazdy działają na wszystkich urządzeniach? Czy mają dodatkowe kodowanie tylko dla GPS?

Mogą mieć określone strategie lokalizacyjne, ale będą oparte na wykorzystaniu inne źródła podczas awarii GPS.

    Moje podanie dotyczy Bangladeszu. Tutaj internet jest powolny. Czy ma to negatywny wpływ na dokładność GPS?

Inne odpowiedzi twierdzą, że internet nie jest związany z GPS. Tak, to prawda, że nie jest to związane z GPS, ale lokalizacja. AGPS wykorzystuje internet do pobierania 3 rodzajów danych (sygnały satelitarne, Almanach i efemerydy), które pomagają GPS szybciej ustalić pozycję. Jeśli efemeryda i Almanach są nieaktualne lub urządzenie przeniosło kilka sto km od poprzedniej pozycji fix to nazywa się zimny start i trwa około 12-15min bez AGPS.

Dostawca lokalizacji zespolonej już wie, jak zapewnić najlepsze rozwiązanie z tymi konfiguracjami, więc powinieneś go pobłogosławić.

Bibliografia:

 5
Author: ugur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-01 21:34:54

+ 1 za dany opis.
Mam nadzieję, że znajdziemy najlepszą odpowiedź na twoje pytanie i z czasem ją poprawimy, z tego co wiem..nie będzie tylko jednej poprawnej odpowiedzi.

Pierwszy, (i drugi)

  1. Jak mogę zrobić poziom dokładności blisko 99%. Czy jest jakiś problem z moją architekturą kodu?

  2. Czy dokładność GPS zależy od konfiguracji urządzenia? jeśli tak, to co mogę zrobić dla urządzenia o niskiej konfiguracji?

Both-device ważna jest tutaj konfiguracja i architektura kodu. Jeśli jesteś już na 85% wskaźnik sukcesu, Architektura kodu jest w porządku, myślę.
Jeśli chodzi o GPS, pole widzenia jest ważnym czynnikiem, jeśli chodzi o konfigurację urządzenia i dokładność. Chociaż tani telefon komórkowy może zwrócić dokładną lokalizację z wyraźną linią wzroku. Możesz spróbować uruchomić 2 cykle więcej / czekając, aby osiągnąć większą dokładność.

W najgorszym przypadku i jeśli ma to wartość, Możesz również spróbować pobieranie lokalizacji za pomocą LocationManager i techniki dostawcy GPS, która działa jako rezerwa w 15% tylko po to, aby porównać i upewnić się, że używasz najdokładniejszej lokalizacji, jaką możesz uzyskać. strategie Lokalizacji umieść to jako

W większości przypadków uzyskasz lepszą wydajność baterii, a także więcej odpowiednią dokładność, korzystając z API usług lokalizacyjnych.

  1. Jak Uber, Go-JEK itp. aplikacje do udostępniania jazdy działają na wszystkich urządzeniach? Czy oni masz dodatkowe kodowanie tylko dla GPS?
    Działają, ale nie zawsze z najwyższą dokładnością dla lokalizacji odbieranych w aplikacji. Jeśli są jakieś hacki lokalizacyjne dla nas programistów, musimy je znaleźć, Może 5-stronicowy wynik wyszukiwania google:) lub skorzystać ze środowiska open source. Dla mnie najlepsze praktyki i linki do repo Androida wystarczą. Śledziłeś już posty typu Otrzymuj aktualizacje lokalizacji

  2. Moja aplikacja jest dla Bangladeszu. Tutaj internet jest powolny. Na ma negatywny wpływ na dokładność GPS?
    Brak relacji między Internetem a LocationManager + GPS_PROVIDER

 3
Author: user2450263,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-24 06:33:07