Сравнение двух мест, чтобы избежать сохранения одного и того же места в базе данных - PullRequest
1 голос
/ 22 марта 2019

Мое приложение сохраняет местоположение пользователя в базе данных Firebase. Мне нужно сравнить текущее местоположение с местоположением, сохраненным в Firebase, чтобы избежать сохранения того же местоположения в базе данных (если пользователь находится в том же месте). Как мне этого добиться?

Вот мой код. Он не дает желаемого результата, так как он снова сохраняет то же местоположение и без сравнения.

@Override
public void onLocationChanged(final Location location) {

        DatabaseReference dbReference = FirebaseDatabase.getInstance().getReference();
        Query lastQuery = dbReference.child("User").child("Location").orderByKey().limitToLast(1);
        lastQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
        lat = ds.child("latitude").getValue(Double.class);
        lng = ds.child("longitude").getValue(Double.class);

        }
   }

@Override
public void onCancelled(DatabaseError databaseError) {
}
        });

        double latc = location.getLatitude();
        double lonc = location.getLongitude();

        if (distance(lat, lng, latc, lonc) <2.0)
        {
        Log.d("msg","same location");

        }else

        {
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        myRef = firebaseDatabase.getInstance().getReference().child("User").child("Location");

        DatabaseReference newpost = myRef.push();
        newpost.setValue(latLng);
        }
}

 private double distance(double lat1, double lng1, double lat2, double lng2) {

        double earthRadius = 3958.75; // in miles, change to 6371 for kilometer output

        double dLat = Math.toRadians(lat2-lat1);
        double dLng = Math.toRadians(lng2-lng1);

        double sindLat = Math.sin(dLat / 2);
        double sindLng = Math.sin(dLng / 2);

        double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
                * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));

        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

        double dist = earthRadius * c;

        return dist; // output distance, in MILES
    }

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Сохранение последнего «принятого местоположения» объекта.Затем проверьте каждый новый объект Location и используйте его свойство «precision».Просто проверьте его, чтобы сравнить с предыдущим известным местоположением.Если точность повысилась, а адрес отличается, обновите принятый объект местоположения и сохраните его.Если точность хуже или адрес тот же, просто отбросьте его.

private Location currentLocation;

//inside Location Update Method
if(newLocation.getAccuracy() < currentLocation.getAccuracy()){
    currentLocation = newLocation;
    //update database location info
}
0 голосов
/ 22 марта 2019

Извините, я публикую это как ответ, потому что у меня недостаточно очков репутации.

Проблема заключается в том соотношении, которое вы определили здесь

  if (distance(lat, lng, latc, lonc) <2.0)

Как выу тебя это 2.0?

Может быть, вам следует Log, что distance(lat, lng, latc, lonc) дает вам в результате для тех же местоположений, и определить в соответствии с тем вашим соотношением, которое в вашем случае здесь 2.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...