如何在AngularFire中绑定Geofire查询的半径?

时间:2014-08-05 10:13:19

标签: angularjs firebase angularfire geofire

我在angularJS中有一个模型,该模型绑定到firebase $scope.items=$firebase(blah),我使用ng-repeat来遍历这些项目。 firebase中的每个项目都通过项目的键具有相应的地理位置位置。

如何将控制器更新为仅包含用户周围自定义半径的项目?我不想按角度过滤距离,只要求firebase只检索更近的物品(比如说一个地方0.3公里)。我环顾了几个geoqueries,但他们有不同的目的,我不知道如何将它们绑定到模型上。用户可以更改半径,并且应该相应地更新项目列表,因此需要以某种方式绑定它们。

任何建议都是值得欢迎的,但是我会非常感激一个例子,因为我还没有流畅地使用这个三角形/ firebase / geofire:P

1 个答案:

答案 0 :(得分:0)

如果没有看到您的代码,很难弄清楚您需要做什么。但一般情况下,您需要查询包含 Geohash 的Firebase参考作为子名称或优先级。

这里可以找到这种数据结构的一个很好的例子:https://publicdata-transit.firebaseio.com/_geofire/i

i
  9mgzcy8ewt:lametro:8637: true
  9mgzgvu3hf:lametro:11027: true
  9mgzuq55cc:lametro:11003: true
  9mue7smpb9:nctd:51117: true
  ...
l
  ...
  lametro:11027
    0: 33.737797
    1: -118.294708
  actransit:1006
  actransit:1011
  actransit:1012
  ...

实际的运输车辆在l节点下。它们中的每一个都有一个数组,其中包含该车辆的位置作为长距离和纬度对。

i节点是将每辆车映射到Geohash的索引。您可以看到每个节点的名称都构建为<geohash>:<metroarea>:<vehicleid>

由于Geohash位于名称的开头,我们可以使用查询过滤Geohash:

var ref = new Firebase("https://publicdata-transit.firebaseio.com/_geofire");
var query = ref.child('i').startAt(null, '9mgzgvu3ha').endAt(null, '9mgzgvu3hz');
query.once('child_added', function(snapshot) { console.log(snapshot.name()); });

使用此查询,Firebase将为我们提供名称在该范围内的所有节点。如果一切顺利,这将输出一个节点的名称:

  9mgzgvu3hf:lametro:11027

拥有该节点后,您可以解析名称以提取车辆,然后在l下查找车辆的实际位置。

根据位置和范围计算Geohashes

在上面的代码段中,我硬编码了要使用的geohash值。通常,您需要在中心周围的某个范围内获取所有节点。我建议不要自己计算这些,而是​​建议使用GeoFire的geohashQueries函数:

var whitehouse = [38.8977, -77.0366];
var rangeInKm = 0.3;
var hashes = geohashQueries(center, radiusInKm*1000);

console.log(JSON.stringify(hashes));

这会输出许多Geohash范围:

[["dqcjqch","dqcjqc~"],["dqcjr10","dqcjr1h"],["dqcjqbh","dqcjqb~"],["dqcjr00","dqcjr0h"]]

您可以将每个Geohash范围传递到Firebase查询中:

hashes.forEach(function(hash) {
  var query = geoFireRef.child('i').startAt(null, hash[0]).endAt(null, hash[1]);
  query.once('child_added', function(snapshot) { log(snapshot.name()); });
});

我希望这可以帮助您进行设置。

这是我前一段时间创建的小提琴,用于试验这些内容:http://jsfiddle.net/aF9mN/