从存储在Firebase中的latlng列表中查找当前位置中最近的latlng

时间:2018-06-07 04:34:16

标签: google-maps firebase firebase-realtime-database google-maps-markers latitude-longitude

我在空闲时间制作应用程序,我有一个难题。

我已经在我的firebase数据库中存储了不同的用户提交的地点(以标记的形式),并且我希望其他用户能够看到这些地方,如果它们在当前位置的某个缩放距离内。我的firebase数据库如下所示:

userPlaces
- userToken
    - lat
    - lng

我现在所有的工作当前用户都拥有当前的latlng。我很难看到我应该如何做到这一点,以便他们可以看到存储在firebase中的其他用户标记。

简而言之,当前用户需要能够从firebase中提取信息并将相关标记放在地图上,这与用户目前的位置有关。我不希望代码拉过太多的数据,所以如果无论如何我可以针对我需要的那些,那会更好(如果可能的话,可能会分类latlng)。如果有1000个条目,我不想检查它们中的每一个,只是这样我就能得到正确的条目。

事先,谢谢:)

1 个答案:

答案 0 :(得分:0)

您可以在orderByChild()lat字段上使用firebase查询lng方法。您必须有一个范围,例如,如果您当前的纬度是30.00,那么给我20.00到40.00范围内的结果。

FirebaseDatabase.getInstance().getReference().child("userPlaces")
            .orderByChild("lat").startAt(20.00).endAt(40.00)
            .addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    /* Write your logic here*/
                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                    /* Write your logic here*/
                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
                    /* Write your logic here*/
                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                    /* Write your logic here*/
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    /* Write your logic here*/
                }
            });

这将有助于您仅获取所需的相关数据。但是不要忘记将.indexOn放入您的firebase数据库规则中,否则它将下载客户端上的所有数据然后对其进行过滤。阅读更多相关信息here

浏览complex queries using firebase realtime database。这可能会帮助您以更优化的方式重构数据库结构。