Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中实现基于距离的类似tinder的搜索?_Java_Android_Mysql_Search_Tinder - Fatal编程技术网

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

Java 如何在Android中实现基于距离的类似tinder的搜索?,java,android,mysql,search,tinder,Java,Android,Mysql,Search,Tinder,我已经开始开发一个Android应用程序,我需要一个基于距离的搜索。用户应该能够选择最大距离,比如说3公里。我已经编写了一些代码,可以获取每个用户的当前位置(Lat、Lng),并将其存储在mysql数据库中。然后,应用程序检索每个用户的位置,并查找用户与其他用户之间的距离。通过if循环,应用程序检查用户输入的值是否小于或等于每个用户距离 我已经对它进行了测试,它运行得很好,但问题是我想知道这是否仍然适用于成千上万的用户 如果你对此有任何建议或答案,请告诉我 将当前用户位置分配给currentLo

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

我已经对它进行了测试,它运行得很好,但问题是我想知道这是否仍然适用于成千上万的用户


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

将当前用户位置分配给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**
      }
Location databaseLocation=新位置(“databaseLocation”);
databaseLocation.setLatitude(数据库纬度);
databaseLocation.setLongitude(数据库经度);
//<3000米=3公里
if(currentLocation.distanceTo(databaseLocation)<3000){
//**此条目在限制范围内**
}

这里是查找两个位置之间距离的完整方法,只需将两个lat long作为参数,它将以字符串形式返回距离

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;

    }

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

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

纬度:13.746331长:100.501762=>与第一个位置不同,为1km 纬度:13.756331长:100.511762=>与第一个位置不同的是1km


我没有想太多,这只是一个想法,我很想得到一些关于这方面的意见,我不知道这将如何在后端实现,但我可以建议查找空间对象和R树

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

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

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


您可以使用它来过滤快速用户,因为您将使用这些树,这些树根据用户的MBR位于附近,并且是其他MBR相交的地方。

您可以查找以计算两点之间的实际距离。然后检查是否
result=
,以便添加它。hii@David你找到解决这个问题的好方法了吗,我喜欢你的问题我想要这样的东西。。你能详细解释一下你的问题吗?还有一些代码!?我在NODE中写了一个,如果你感兴趣的话,谢谢,但我已经做过类似的事情了。我想知道这是否仍然适用于很多用户,比如50000。因为如果应用程序必须计算50000个距离,那么这需要多长时间。为此,您可以一次进行5个异步调用。直到你得到所有的结果,比如在一个列表中,你可以显示一个加载器。但是最好的方法是将你的坐标发送到后端,这样会很快给出结果。这不会花费太多时间。哦。。。我刚刚重读了你的问题,意识到你所有的位置都在数据库中。对于这种情况,这不会花费太多时间。继续实施它(y)@davidserousi你是怎么做到的?我获取每个用户的当前位置(Lat,Lng)如何获取所有用户的Lat长度?