由于firebase不支持任何空间索引,所以我使用geohash,有人在这里建议。 Geohash正在使用角色来寻找附近的人物。
因此,我想在firebase中使用w22qt4vhye1c
w99qt4vdf4vc
w22qt4vhzerct
geohash存储,我只想查询接近w22qt4
的哪个geohash。
怎么做?
我知道firebase有startAt。我试过但不行。
更新
将geohash存储到firebase
//Encode lat lng, result w22qt4vhye1c3
var geoHashLatLng = encodeGeoHash(lat,lng);
firebaseRef.child('/geohash/' + geoHashLatLng).set(id);
所以在json
root
- geohash
- w22qt4vhye1c3
- id
- z99qt4vdf4vc
- w22qt4vhzerct
我的问题在这里。
我只想查询从字符w22qt4
开始的geohash。我们可以在firebase中这样做吗?
更新2
startAt()
似乎不是以字符开头的查询...
示例:我有以下gehash
geohash节点
geohash
- a123
- a333
- b123
- c123
- d123
使用以下代码
var firebaseRef = new Firebase('https://test.firebaseio.com');
var query = firebaseRef.child('/geohash').startAt(null, 'a');
query.on('child_added', function(snapshot) {
console.log(snapshot.name());
});
会得到这个结果
startAt(null, 'a') //return a123, a333, b123, c123, d123
startAt(null, 'c123') //return c123, d123
startAt(null, 'd') //return d123
我的预期结果
startAt(null, 'a') //return a123, a333
startAt(null, 'c123') //return c123
startAt(null, 'd') //return d123
我的猜测,startAt()将按顺序查询26个字母但不匹配。 那么,我可以在firebase中做些什么,这样我才能得到上面的预期结果?
答案 0 :(得分:7)
除了安德鲁上面的答案之外,你想做些什么来获得地理位置的预期效果(即能够做前缀查询,让你在'查询'中指定准确性,特别是,例如,每3个字符geohash让你〜+ -80km)以更细化和离散的方式存储数据。
所以,不是你现在如何存储它,你需要通过将geohash字符串键切割成片段来保存数据(我已经在3个字符边界处完成了,但你应该选择一个合适的标记化提供所需精确度的策略)并将每个片段用作子名称,如下所示:
root
- geohash
- w22
- qt4
- vhy
- e1c
- w22qt4vhye1c3
- id
- vhz
- erc
- w22qt4vhzerct
- id
- z99
- qt4
- vdf
- z99qt4vdf4vc
- id
然后,如您的问题所示,当您需要获取以w22qt4
开头的所有地理位置时,您将对以下内容进行查询:
firebaseRef.child('/geohash/w22/qt4/')
然后会为您提供vhy
和vhz
个孩子,然后这些孩子会拥有您感兴趣的所有实际地理位置。
答案 1 :(得分:2)
您可以使用普通的startAt查询来查找指定键附近的键。例如,在这种情况下你会:
var query = firebaseRef.child("geohash").startAt(null, 'c').limit(5);
query.on("child_added", ...);
这将在lexigraphically排序后为geoHashLatLng提供5个元素。
如果要在某个指定的键上结束查询,也可以这样做。例如:
var query = firebaseRef.child("geohash").startAt(null, 'c').endAt('d');