使用GeoFire查询附近的位置

时间:2017-03-04 21:25:01

标签: firebase geofire

我很难理解GeoFire如何查询附近的位置;

我正在构建一个基于地理位置的应用,该应用将根据用户位置获取附近的位置。我的数据结构如下

locations
    -Ke1uhoT3gpHR_VsehIv
    -Kdrel2Z_xWI280XNfGg
        -name: "place 1"
        -description: "desc 1"
geofire
    -Ke1uhoT3gpHR_VsehIv
    -Kdrel2Z_xWI280XNfGg
        -g: "dr5regw90s"
        -l
            -0: 40.7127837
            -1: -74.00594130000002

我似乎无法理解" tracking keys"和离开的地点进入GeoQueries。 (也许这个概念与类似Uber的功能更相关)

假设上面的locations在附近,我将如何使用自己的lat和long坐标来获取它们?我确定我误解了GeoFires文档,但我还没有看到它。

1 个答案:

答案 0 :(得分:7)

要获取附近的所有位置, 首先,我们获得数据库参考,以保存我们的GeoFire位置。从你的问题来看,它应该是

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("geofire");

接下来,我们使用GeoFire位置参考作为参数

创建一个GeoFire实例
GeoFire geoFire = new GeoFire(ref);

现在我们使用geoFire方法查询GeoFire参考 queryAtLocation queryAtLoction方法有2个参数:GeoLocation对象和距离范围。因此,如果我们使用3作为距离范围,则距离用户3公里的任何位置都将显示在onKeyEntered(...)方法中。

注意:GeoLocation对象有两个参数:纬度和经度。因此我们可以使用用户的纬度和经度作为参数         GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(userLatitde,userLongitude),3);

    geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
        @Override
        public void onKeyEntered(String key, GeoLocation location) {
            //Any location key which is within 3km from the user's location will show up here as the key parameter in this method 
            //You can fetch the actual data for this location by creating another firebase query here
Query locationDataQuery = new FirebaseDatabase.getInstance().child("locations").child(key);
locationDataQuery..addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        //The dataSnapshot should hold the actual data about the location
dataSnapshot.getChild("name").getValue(String.class); //should return the name of the location and dataSnapshot.getChild("description").getValue(String.class); //should return the description of the locations
                    }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

        @Override
        public void onKeyExited(String key) {}

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

        @Override
        public void onGeoQueryReady() {
            //This method will be called when all the locations which are within 3km from the user's location has been loaded Now you can do what you wish with this data
        }

        @Override
        public void onGeoQueryError(DatabaseError error) {

        }
    });