我的应用程序将用户位置保存到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
}
答案 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
}