4

在 mysql 中,我使用 hasrsine 公式来查询附近的对象。

使用这个公式公式

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance 
FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

哪一个

  • 3959:地球半径,以英里为单位
  • 37,-122 : 给定纬度 lng
  • 25:25英里以内

在 Firebase 中,我可以像在 mysql 中那样存储用户 lat lng 吗?创建一个标记表。id, lat, lng 列然后使用公式查询

更新

我应该问,在firebase中使用这个公式查询附近的方法是什么。

4

2 回答 2

8

简短的回答,不像你想要的那样。

Firebase 本质上有两种查询数据的方法:按路径和按优先级。这比 SQL 更受限制,并且有一个很好的理由——我们的 API 是经过精心设计的,只允许我们可以保证快速的操作。Firebase 是一个实时且可扩展的后端,我们希望您能够构建出色的应用程序,在不影响响应能力的情况下为数百万用户提供服务。

看,什么是 firebase 和 deNormalizing data 另外,这个SO question是相似的。

回复评论:Firebase 不会sin( radians(X) )为您计算。这是一个“缓慢”的操作。因此,您需要在保存数据时将该信息存储到数据中。我不是 100% 确定,但您可以存储标记并将经度/纬度存储在单独的父项中。

Root
    -> Markers
    -> longitude (Use the value as priority) -> MarkerId
    -> latitude (Use the value as priority) -> MarkerId

然后你应该能够使用边界来找到最大和最小经度和纬度。使用它来按优先级查询经度和纬度路径。如果两者都存在 MarkerId,则使用它。

快速研究发现这篇关于纬度经度边界坐标的文章

于 2013-06-03T14:39:11.743 回答
4

嘿,我刚刚使用 firebase 和 GeoFire 构建了一个实时谷歌地图。GeoFire 非常酷且易于使用。它允许您使用 lon lat 和 radius 进行查询。它返回一个键,您可以使用它来查询您的 firebase 数据库。您在创建 geoFire 对象时将密钥设置为您想要的任何内容。它通常是一个 ref,您可以使用它来获取与该距离关联的对象。

这是geoFire的链接: https ://github.com/firebase/geofire-js

这是一个示例用例:

你有一个 lon lat,你使用导航器得到:

var lon = '123.1232';
var lat = '-123.756';
var user = {
    name: 'test user',
    longitude: lon,
    latitude: lat
}
usersRef.push(user).then(function(response) {
    var key = response.key;
    var coords = [lon, lat];
    geoFire.set(key, coords, function(success){
         console.log('User and geofire object has been created');
    });
})

现在您可以使用以下命令查询用户:

// Set your current lon lat and radius
var geoQuery = geoFire.query({
    center: [latitude, longitude],
    radius: radiusKm
});
geoQuery.on('key_entered', function(key, location, distance) {
    // You can now get the user using the key
    var user = firebaseRefUrl + '/' + key;

    // Here you can create an array of users that you can bind to a   scope in the controller
});

如果您使用的是谷歌地图。我建议您使用 angular-google-maps。它是一个非常酷的谷歌地图指令,它接受一系列标记和圆圈。因此,当控制器中的 $scope.markers 或 $scope.circles 发生变化时,它会自动应用于地图,而不会出现任何杂乱的代码。他们有很好的文档。

这是一个链接: http ://angular-ui.github.io/angular-google-maps/

于 2015-03-27T21:43:21.017 回答