按当前位置节点js获取圈内最近的用户

时间:2017-11-10 07:54:09

标签: javascript node.js google-maps firebase-realtime-database geolocation

我用一个例子来解释我的结果。

我有一个用户表。每个用户在数据库中都有自己的纬度和经度位置。我使用的是firebase数据库。数据库看起来像:

$ cat Makefile
PACKAGE = foo
$(PACKAGE).egg: a b
    @echo "Making $@..."
    @touch $@
a b:
    @touch $@
.PHONY: test_egg
test_egg:
ifeq ($(wildcard $(PACKAGE).egg),)
    $(error $(PACKAGE).egg not found, please build it first)
else
    @echo "Test the egg..."
endif
$ make test_egg
Makefile:10: *** foo.egg not found, please build it first.  Stop.
$ make foo.egg
Making foo.egg...
$ make test_egg
Test the egg...
$ touch a b
$ make test_egg
Test the egg...

我需要使用当前位置查找圈内的用户。

我已查看geolib并找到方法isPointInCircle。但是使用它,我们需要迭代用户数据,并需要在每个循环上调用此方法。我需要避免这种多次调用,只需要调用一个方法就可以实现:

users {
  user-id{
     location{
        latitude
        longitude
     }
  }
}

结果应该是具有最近位置的数组。我怎样才能做到这一点?在此先感谢:)

2 个答案:

答案 0 :(得分:1)

GeoFire是基于与特定点的接近度来查询Firebase实时数据库的唯一方法,无需下载所有数据和过滤客户端。

使用GeoFire,create a GeoQuery for a location and a maximum distance

var geoQuery = geoFire.query({
  center: [10.38, 2.41],
  radius: 10.5
});

然后你attach handlers for items that fall within this range

var onKeyEnteredRegistration = geoQuery.on("key_entered", function(key, location, distance) {
  console.log(key + " entered query at " + location + " (" + distance + " km from center)");
});

没有用于查找单个最近项的内置功能。您可以根据回调中的distance参数来执行客户端操作。您仍然需要检索超出需要的数据,但希望它不会超过整个数据库。

答案 1 :(得分:0)

如果没有在本地获取整个数据集和流程,就无法索引和查询Firebase实时数据库。

我建议切换到新发布的测试版云端防火墙,它甚至将地理位置作为数据类型,并更好地支持类似sql的“查询位置”。
Cloud Firestore queries