2

ここで少し苦労しています。Fused API を使用して位置情報の更新を取得しています。私の意図は、ユーザーが歩いたときに地図上に道を描くことです。

私はそれを次のように実装しました:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.map_layout, container, false);

        // some other initialization
        //....
        //
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(mContext)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }

        return view;
    }

次に、次の方法で作業を開始します

private void startReceivingLocationUpdates() {
        if (checkGPSPermission() && mGoogleApiClient.isConnected() && !isReceivingLocationUpdates) {
            LocationRequest locationRequest = new LocationRequest();
            locationRequest.setInterval(5000);
            locationRequest.setFastestInterval(5000);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                    locationRequest, this);
            isReceivingLocationUpdates = true;
        }
    }

&ここで私は場所の更新を受け取ります

@Override
    public void onLocationChanged(Location location) {
      if(getDistanceBetweenTwoLacation(mCoordinates.get(mCoordinates.size() - 1), location) > 3d) {
            for(int i= 0; i < mCoordinates.size(); i++) {
                Location locationTemp = mCoordinates.get(i);
                Log.d(TAG, "i => " + i + " Lat => " + String.valueOf(locationTemp.getLatitude()) + " Lng => " + String.valueOf(locationTemp.getLongitude()));
            }
            if(mCoordinates.size() > 0)
                Log.d(TAG, "lat difference is => " + getDistanceBetweenTwoLacation(mCoordinates.get(mCoordinates.size() - 1), location));
            mCoordinates.add(location);
        }
    }

問題は、onLocationChangedデバイスが同じ場所で安定している場合でも、過去の場所との差/距離が約 5 ~ 90 メートルである緯度経度の場所を何度も提供することです。何か不足していますか?

ところで、これは私が使用した2つの緯度経度からの距離を返すメソッドです

private double getDistanceBetweenTwoLacation(Location origin, Location destination) {
        return origin.distanceTo(destination);
    }
4

1 に答える 1

2

屋内での不正確な (および移動/ドリフト/ジャンプ) GPS の修正はかなり一般的です。空がはっきり見えなければ、正確な GPS 修正は不可能です。LocationオブジェクトにはgetAccuracy()、float を返すメソッドがあります。この値はメートル単位の位置修正の精度であり、68% (1 標準偏差) の信頼度で、円の半径を表します。

屋内では、緯度と経度がその距離内でジャンプしている間、おそらく 20、30、さらには 50 メートルの精度値が表示されます。屋外に出ると、精度の値は 10 メートル未満、多くの場合 5 メートル未満に低下し、位置が飛び跳ねる頻度ははるかに低くなります。

tl;dr : GPS は屋内では正確な結果を提供しません。

于 2016-08-03T15:14:38.260 に答える