在 Firebase Realtime DB 中查找附近的用户

Find nearby users in Firebase Realtime DB

我想知道如何获取当前用户位置半径范围内的所有用户。到目前为止,我能够得到每个人的坐标。我无法做的是快速获取附近的用户而不必搜索整个数据库(我正在使用 Firebase 实时数据库)。有算法可以解决这个问题吗?

我发现最快最好的方法是使用 GeoFIre。 在您的 onCreate() 方法中添加以下行

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("path/to/geofire");
GeoFire geoFire = new GeoFire(ref);

如果我们有我们的位置,那么我们可以简单地在方法中使用 GeoQueries 以获得我们想要的结果。

// creates a new query around [latitude, longitude] with a radius of 10.00 kilometers
GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(Double.parseDouble(latitude), Double.parseDouble(longitude)), 10.00);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
            @Override
            public void onKeyEntered(String key, GeoLocation location) {
                    Log.d("KEY", "KEY IS: " + key);
                    if (!key.equals(currentUserID) && !nearbyList.contains(key)) {
                        Log.d("KEY FOUND", "Key " + key + " entered the search area at" + location.latitude + "," + location.longitude);

                        usersRef.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot snapshot) {
                               /* Get your data from Firebase here */
                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError error) {

                            }
                        });
                    }
                }
            }

            @Override
            public void onKeyExited(String key) {
                /* When someone exits the radius */
            }

            @Override
            public void onKeyMoved(String key, GeoLocation location) {

            }

            @Override
            public void onGeoQueryReady() {

            }

            @Override
            public void onGeoQueryError(DatabaseError error) {

            }
        });