web-dev-qa-db-ja.com

Android GPS位置精度の問題

AndroidのGPS追跡アプリに取り組んでいます。コードアーキテクチャは次のとおりです。

  1. BackgroundSyncService:ロケーションの更新を取得するために使用されるサービスクラス。ここで、GoogleApiClientは初期化され、他のLocation関連のメソッドを実装します。
  2. AppRunCheckerReceiverBackgroundSyncServiceが時間間隔で実行されているかどうかをチェックするBroadcastReceiverクラス。停止したら、起動します。
  3. GpsEnableReceiver:gpsステータスが変更された場合に配信されるBroadcastReceiver。 BackgroundSyncServiceが時間間隔で実行されているかどうかをチェックします。停止したら、起動します。
  4. InternetConnectionStateReceiver:インターネットステータスが変化したときに起動するBroadcastReceiver。 BackgroundSyncServiceが時間間隔で実行されているかどうかをチェックします。停止している場合は、起動します。

BackgroundSyncServiceサービスで、次の方法でGoogleApiClientを初期化します。

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

    }
_

ここで、精度は_LocationRequest.PRIORITY_HIGH_ACCURACY_であり、間隔は

_locationRequest.setInterval(3000)
_

here はGoogleApiClient実装コードです。

これ アプリケーションGPS情報セクションには、緯度経度と精度パラメーターが含まれます

私の調査結果:onLocationChanged(Location location)メソッドでこのようにLocationオブジェクトの精度をチェックします:location.getAccuracy()。ここで、精度が50メートル未満の場合、それを受け入れます。

85%のケースで、それは魅力のように機能しています。 GPSから正確な位置を送信します。しかし、15%の場合、300メートル以上の不正確な位置を送信します。

15%のデバイスは低コストの中国ブランドのモバイルです。

私の質問:

  1. 精度レベルを99%近くにするにはどうすればよいですか。コードアーキテクチャに問題はありますか?
  2. GPSの精度はデバイスの構成に依存しますか? 「はい」の場合、低構成デバイスに対して何ができますか?
  3. Uber、Go-JEKなどのライドシェアリングアプリはすべてのデバイスでどのように機能しますか? GPS専用の追加コーディングはありますか?
  4. 私の申請はバングラデシュ向けです。ここでインターネットは遅いです。 GPSの精度に悪影響がありますか?

このスレッドを事前に感謝します。また、英語が下手でごめんなさい。

32

ロケーションの更新は、次の方法で実行できます。

  1. GPSから取得した場所は、ネットワークから取得した場所よりも正確なので、精度が必要な場合はGPSを使用してください

  2. これについてはわかりませんが、コンテキストについては、正確さや最速の場所を望むように、プロバイダーの選択に応じてどのタイプの場所が必要かを考えます

  3. FusedLocationプロバイダーは、位置を取得するための最も効率的かつ効果的なソリューションですAndroid今、それはさまざまなソースから位置データを収集し、位置に必要な時間のように渡されたパラメーターに従って更新され、高精度が必要かどうかなど。最高のロケーションを提供します。

  4. はい、Googleはこれを推奨しており、現在のところAndroidで場所を取得するための最も効果的かつ効率的な方法です。

enter image description here

_Criteria.ACCURACY_HIGH_ を作成して試してみませんか

高精度要件を示す定数-水平、高度、速度、または方位精度に使用できます。水平および垂直位置の場合、これはほぼ100メートル未満の精度に相当します。

Androidは私たちからハードウェアの現実を隠そうとしますが、実際にはGPSとネットワークの2つのロケーションプロバイダーしかありません。 GPSの位置は遅いため、すべてのデバイスにあるわけではありませんが、正確です。ネットワークロケーションは高速で、ほぼすべてのデバイスでサポートされていますが、精度は低くなります。

Googleは fused location provider。 で地図と位置管理を改善しました

融合ロケーションプロバイダーと対話するためのメインエントリポイント。メソッドは、GoogleApiClientと組み合わせて使用​​する必要があります。


コード:

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

gps –>(GPS、AGPS):GPSロケーションプロバイダーの名前。このプロバイダーは、衛星を使用して場所を特定します。条件によっては、このプロバイダーが位置修正を返すまでに時間がかかる場合があります。許可Android.permission.ACCESS_FINE_LOCATIONが必要です。

network –>(AGPS、CellID、WiFi MACID):ネットワークロケーションプロバイダーの名前。このプロバイダーは、セルタワーとWiFiアクセスポイントの可用性に基づいて場所を決定します。結果は、ネットワーク検索によって取得されます。権限Android.permission.ACCESS_COARSE_LOCATIONまたはAndroid.permission.ACCESS_FINE_LOCATIONのいずれかが必要です。


別のオプション:

getLastKnownLocation()

getLastKnownLocation() thisは、最後の既知の場所を返します...アプリを再インストールすると、最後の既知の場所がなくなります...そのため、NPEになります...代わりに以下のコードを使用します

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

私が見つけたいくつかの最高の例をチェックしてください:

それは私のために働いた...あなたのためにも働くはずです...

21
Krrish
  1. 精度レベルを99%近くにするにはどうすればよいですか。コードアーキテクチャに問題はありますか?

これは現実のシナリオです。すべてのロケーションプロバイダーが期待どおりに動作することを保証できません。最適なポジションを要求する必要があります。

  1. a)GPSの精度はデバイスの構成に依存しますか?

はい。ガリレオ(ヨーロッパ)、GLONASS(ロシア)、QZSS(日本)、北斗(中国)などの他の測位システムがあるため、一部のデバイスにはGPS信号(米国)しか追跡できない古いGPSチップセットが搭載されている場合があります。これらのタイプに対するチップセットのサポートが多いほど、位置修正により多くの衛星を追跡できる可能性が高くなります。また、TTFF(最初の修正までの時間)は、gpsレシーバーのチャンネル数によって異なります。

b)YESの場合、低構成デバイスに対して何ができますか?

これはハードウェアの問題であるため、ここでは何もできません。しかし、他の位置情報源は、AGPS(aips gps)、wifi、携帯測位などのGPSデータの不足を補うことができます。また、wifiアクセスポイントとcellidを使用してデバイスを見つけるためのデータベースを提供する有料オプションもあります(彼らはwifiで最高のソリューションを提供すると主張していますが、私はそれを使用していないのでわかりません。あなたはそれをチェックアウトすることができます http ://combain.com )。 Wifiとcellidは、利用可能なWi-Fiアクセスポイントとセルタワーの数とそれらの距離(信号強度)にも依存します。 50mの精度が必要な場合、セルラーポジショニングは何の関係もありませんが、wifiはこの値に近づくチャンスがあります。

2009年の調査結果[3]

  • A-GPS付き3G iPhone〜8メートル
  • 3G iPhone with wifi〜74メートル
  • 3G iPhone with Cellular Positioning〜600メートル
  1. Uber、Go-JEKなどのライドシェアリングアプリはすべてのデバイスでどのように機能しますか? GPS専用の追加コーディングはありますか?

彼らは特定のロケーション戦略を持っているかもしれませんが、GPS停止中に他のソースを使用することに基づいています。

  1. 私の申請はバングラデシュ向けです。ここでインターネットは遅いです。 GPSの精度に悪影響がありますか?

他の回答では、インターネットはGPSとは関係ないと主張しています。はい、それはGPSではなく位置に関連しています。 AGPSはインターネットを使用して3種類のデータ(衛星信号、アルマナック、エフェメリス)を取得します。これらのデータは、GPSが位置修正を迅速に提供するのを支援します。エフェメリスと暦が古いか、デバイスが以前の位置修正から数百km移動した場合、コールドスタートと呼ばれ、AGPSなしで約12〜15分かかります。

融合ロケーションプロバイダーは、これらの構成で最適なソリューションを提供する方法を既に知っているため、祝福する必要があります。

参照:

5
ugur

問題の説明については+1。
あなたの質問に対する最良の答えを見つけて、時間の経過とともに、私が知っていることからそれを改善することを望みます。ここには正しい答えが1つだけではありません。

最初の(そして2番目の)

  1. 精度レベルを99%近くにするにはどうすればよいですか。コードアーキテクチャに問題はありますか?

  2. GPSの精度はデバイスの構成に依存しますか?はいの場合、低構成デバイスに対して何ができますか?

ここでは、デバイス構成とコードアーキテクチャの両方が重要です。すでに85%の成功率に達している場合、コードアーキテクチャは大丈夫だと思います。
GPSに関する限り、視線はデバイスの構成と精度に関して重要な要素です。低コストのモバイルは、明確な視線で正確な位置を返すことができますが。より高い精度を達成するために、2サイクル以上/待機して実行してみてください。

最悪の場合のシナリオとその価値については、 LocationManager とGPSプロバイダーテクニックを使用して位置の取得を試みることもできます。これは、15%でフォールバックとして機能し、あなたが得ることができる正確な位置。 ロケーション戦略 としてそれを置きます

ほとんどの場合、Location Services APIを使用することで、バッテリーのパフォーマンスが向上し、適切な精度が得られます。

  1. Uber、Go-JEKなどのライドシェアリングアプリはすべてのデバイスでどのように機能しますか? GPS専用の追加コーディングはありますか?
    これらは機能しますが、アプリ内で受信した場所の精度が常に最高とは限りません。開発者向けのロケーションハッキングがある場合は、それらを見つける必要があります(5ページ目のGoogle検索結果:)、またはオープンソース環境のメリットがあります。私にとっては、ベストプラクティスとAndroidリポジトリリンクで十分です。 位置情報の更新を受信する

  2. 私の申請はバングラデシュ向けです。ここでインターネットは遅いです。 GPSの精度に悪影響がありますか?
    インターネットと LocationManager + GPS_PROVIDER の間に関係はありません

3
Pararth