如何在Android中实现基于距离的类似火种的搜索?

时间:2016-02-13 09:50:08

标签: java android mysql search tinder

我已经开始开发一个Android应用程序,我需要基于距离的搜索。用户应该能够选择最大距离,比如说3公里。我已经编写了一些代码,我可以获得每个用户的当前位置(Lat,Lng)并将其存储在mysql数据库中。然后,应用程序检索每个用户的位置,并找到用户与其他用户之间的距离。使用if循环,应用程序会检查用户输入的值是否小于或等于每个用户距离。

我已经测试了它并且它运行良好,但问题是我想知道这是否仍然适用于数千名用户?

如果您对此有任何建议或答案,请告诉我!

4 个答案:

答案 0 :(得分:0)

将当前用户位置分配到 currentLocation

tcl::unsupported::representation

答案 1 :(得分: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;

    }

返回距离以千米为单位,您可以进一步将其转换为英里

答案 2 :(得分:0)

我想知道您是否真的需要计算每个用户的距离。如果您过滤可能在 3 公里半径范围内的用户,可能会有纬度和经度的上限和下限,这会有所帮助。 从我所看到的通常情况下,小数点后第二位的变化会导致一公里的差异。 第一个位置:纬度:13.756331 经度:100.501762

lat: 13.746331 long: 100.501762 => 与第一个位置不同的是 1km lat: 13.756331 long: 100.511762 => 与第一个位置不同的是 1km

我没有想太多,这只是一个想法,我很想得到一些意见

答案 3 :(得分:0)

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

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

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

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

您可以使用它来过滤快速用户,因为您将使用这些树,这些树根据用户的 MBR 和其他 MBR 相交的位置在附近。