比较两个位置以避免将同一位置保存在数据库中

时间:2019-03-22 15:25:18

标签: android firebase-realtime-database

我的应用程序将用户位置保存到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 :(得分:0)

对不起,我将其发布为答案,因为我没有足够的声望点。

问题出在您在此处定义的比例

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

您如何获得2.0

也许您应该Log distance(lat, lng, latc, lonc)在相同位置给您的结果,并根据您的比例(在这里是2.0)进行定义。

答案 1 :(得分:0)

存储最后一个“接受位置”对象。 然后检查每个新的Location对象并使用它的“ accuracy”属性。 只需检查一下即可与以前的已知位置进行比较。如果精度提高并且地址不同,则更新您接受的位置对象并将其存储。如果精度较差或地址相同,则放弃它。

private Location currentLocation;

//inside Location Update Method
if(newLocation.getAccuracy() < currentLocation.getAccuracy()){
    currentLocation = newLocation;
    //update database location info
}