【问题标题】:finding other user according to my location根据我的位置查找其他用户
【发布时间】:2016-10-31 11:57:34
【问题描述】:

我正在使用 firebase (android) 来存储数据,并且正在保存用户,如下所示:

users{
    abcdefghi{
      name:"abc",
      lat:"12.988",
      long:-0.123,
      desc:"all other desc"
    },KLMNGHT{
        name:"def",
        lat:"11.988",
        long:-1.123,
        desc:" other desc"
    }
}

我想显示所有进入我的半径区域(接近区域)的用户,这些用户是我根据我的位置定义的。我没主意了。我看了Haversine公式。但我不知道要做到这一点。

找到用户的最佳算法是什么?

【问题讨论】:

  • 可以考虑使用 geofire - github.com/firebase/geofire-java
  • 请考虑添加您已采取的更多步骤以达到预期结果。从经纬度到显示用户的完整算法是一个很大的问题。
  • @michaelcarrano 目前无法使用 geofire,因为它支持旧版本的 firebase
  • @FishStix 我没明白你要添加更多步骤的意思吗?
  • @Davin 你看过github.com/firebase/geofire-java/tree/geofire-2,它正在努力支持最新的firebase sdk。自己还没有实际测试过它有多稳定。

标签: java android android-gps geofire


【解决方案1】:
private const double EARTH_RADIUS = 6378.137;
private static double rad(double d)
{
   return d * Math.PI / 180.0;
}

public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
   double radLat1 = rad(lat1);
   double radLat2 = rad(lat2);
   double a = radLat1 - radLat2;
   double b = rad(lng1) - rad(lng2);

   double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
    Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
   s = s * EARTH_RADIUS;
   s = Math.Round(s * 10000) / 10000;
   return s;
}

也许这段代码可以帮助你。

【讨论】:

    【解决方案2】:

    严格来说,问题是:给定地球上的两个点 A(lan1,lon1) B(lan2,lon2) 找到 A 和 B 之间的距离?当您说“最佳算法”时,您的意思是在开发时间、时间、内存方面最好吗?!

    无论如何,假设您可以使用的开发时间为“最佳”: 1.Google的API在这里解释:https://developers.google.com/maps/documentation/distance-matrix/intro#DistanceMatrixRequests

    2.这是一个简单的实现-但我自己还没有测试过- https://www.geodatasource.com/developers/java

    【讨论】:

    • @Yoni Keren best algo 意思是说最好的方法。怎么样才能过滤用户。在 2 点示例中,我需要每次都将其他用户放长,纬度来计算距离。这是根据我的位置过滤用户的唯一最佳方法吗?总之谢谢
    • 哦,我明白了,这是最幼稚的方式。如果您要拥有数千万用户,因为这将通过他们每个人,它可能不是最有效的。给定您自己的位置,例如(lan1,lon1),如果您想找到所有用户,使他们的位置(lan2,lon2)在您的位置 X 公里附近,那么您可以在我的头顶对他们进行排序表,以便 lan2 介于两个值之间,而 lon2 介于两个值之间。请记住,除非您有很多用户,否则现在可​​能不值得您花时间。这是一个服务器端代码 - 您可以稍后改进。
    • 为了有效地做到这一点,您可能希望根据 lan 将用户存储在一些平衡的二叉树中,根据 lon 存储另一个,然后找到这些值之间的用户将需要 log(N)其中 N 是用户数。
    猜你喜欢
    • 2016-08-29
    • 2017-01-13
    • 2013-06-02
    • 2013-11-09
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    相关资源
    最近更新 更多