如何在安卓系统中实现类似Tinder的基于距离的搜索?

4
我已经开始开发一个Android应用程序,需要进行基于距离的搜索。用户应该能够选择最大距离,比如说3公里。我已经编写了一些代码,其中获取每个用户的当前位置(Lat,Lng)并将其存储在mysql数据库中。然后应用程序检索每个用户的位置,并找到用户和其他用户之间的距离。通过if循环,应用程序检查用户输入的值是否小于或等于每个用户的距离。
我已经测试过它,效果良好,但问题是我想知道这是否仍然适用于成千上万的用户?
如果您有任何建议或答案,请告诉我!

你可以查找haversine公式来计算两点之间的实际距离。然后检查result =< MAX_DIST以便添加它。 - KarelG
嗨,@David,你找到了解决这个问题的好方法吗?我喜欢你的问题,我也想要类似的东西。你能详细解释一下你的问题,并附上一些代码吗? - Rucha Bhatt Joshi
如果您感兴趣,我已经用NODE写了一个。https://github.com/designalchemy/node-tinder-sort-by-distance/blob/master/tinder.js - Luke Robertson
4个回答

0
我在想,你是否真的需要为每个用户计算距离。如果你通过在纬度和经度上设置上限和下限来过滤可能在3公里半径内的用户,这样会有帮助吗?
从我所见,通常第二位小数的变化会导致1公里的差异。
第一个位置:纬度:13.756331 经度:100.501762
纬度:13.746331 经度:100.501762 => 距第一个位置不同1公里
纬度:13.756331 经度:100.511762 => 距第一个位置不同1公里
我还没有仔细考虑过这个问题,这只是我的一些想法,我很想听听你们的意见。

0

我不知道这个后端将如何实现,但我可以建议查找空间对象和R树。

如果一个对象至少有一个属性捕捉到它在2D或3D空间中的位置,则被称为空间对象。此外,空间对象很可能在空间中具有几何范围。例如,我们可以说建筑物是空间对象,因为它在2D或3D地图上具有位置和几何范围。

R树中的“R”代表矩形。数据结构的关键思想是将附近的对象分组,并用矩形表示它们。最小边界矩形或MBR简称。这是递归发生的。

由于所有对象都位于此边界矩形内,因此不与边界矩形相交的查询也不能与任何包含的对象相交。在叶级别,每个矩形描述一个单一的空间对象。所有其他级别只是节点指针。

您可以使用此方法快速过滤用户,因为您将使用这些树,这些树根据用户的MBR附近,并且其他MBR相交。


0

将当前用户位置分配给currentLocation

      Location databaseLocation = new Location("databaseLocation");
      databaseLocation.setLatitude(database_latitude);
      databaseLocation.setLongitude(database_longitude);
      //< 3000 meters = 3km
      if (currentLocation.distanceTo(databaseLocation) < 3000) {
        //**This entry is within limits**
      }

谢谢,但我已经做了类似的事情。我想知道如果这个应用程序要计算50,000个距离,那么它是否仍然适用于大量用户,比如50,000个用户。因为如果应用程序必须计算50,000个距离,那需要多长时间.. - David Seroussi
你可以同时发起5个异步调用。在你获得所有结果之前,比如说放在一个列表里,你可以显示一个加载器。但最好的方法是将你的坐标发送到后端,这样可以快速获取结果。这不会花费太多时间。 - Vaibhav Sharma
哦...我刚刚重新阅读了你的问题,意识到你所有的位置都在数据库中。对于这种情况,这不会花费太多时间。继续实现它吧 (y) - Vaibhav Sharma
@DavidSeroussi 你是怎么做到的?我获取每个用户的当前位置(纬度,经度) 你是如何获取所有用户的纬度和经度的? - Rucha Bhatt Joshi

0

这是一个完整的方法,用于查找两个位置之间的距离,只需将两个经纬度作为参数传递,它将返回一个字符串表示的距离。

public static String distFrom(double current_lat, double current_long, double latst, double longst) {
    double earthRadius = 3958.75;
    double dLat = Math.toRadians(latst-current_lat);
    double dLng = Math.toRadians(longst-current_long);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat)) * Math.cos(Math.toRadians(latst)) * Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double dist = earthRadius * c;
    double meterConversion =  1.609344;       //Kilometer
  //for two digits float value:
    String s = String.format("%.2f", (dist * meterConversion));

    return s;

    }

返回的距离单位为公里,您可以进一步转换为英里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接