我已经开始开发一个需要基于距离的搜索的 Android 应用程序。用户应该能够选择最大距离,比如 3 公里。我已经编写了一些代码来获取每个用户的当前位置(Lat、Lng)并将其存储在 mysql 数据库中。然后应用程序检索每个用户的位置并找到用户与其他用户之间的距离。通过 if 循环,应用程序检查用户输入的值是否小于或等于每个用户的距离。
我已经对其进行了测试并且运行良好,但问题是我想知道这是否仍然适用于成千上万的用户?
如果您对此有任何建议或答案,请告诉我!
我想知道您是否真的需要为每个用户计算距离。如果您过滤可能在 3 公里半径内的用户,可能会有纬度和经度的上限和下限,这会有所帮助吗?从我所看到的情况来看,通常第二个小数点的变化会导致一公里的差异。第一个位置:纬度:13.756331 经度:100.501762
纬度:13.746331 长:100.501762 => 与第一个位置不同为 1 公里 纬度:13.756331 长:100.511762 => 与第一个位置不同为 1 公里
我没有想太多,这只是一个想法,我很想对此有所了解
让当前用户位置分配给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**
}
这是查找两个位置之间距离的完整方法,只需将两个 lats 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;
}
返回距离以公里为单位,您可以进一步将其转换为英里
我不知道这将如何在后端实现,但我可以推荐查找空间对象和 R 树。
如果一个对象具有至少一个捕捉其在 2D 或 3D 空间中的位置的属性,则该对象被表征为空间对象。此外,空间对象很可能在空间中具有几何范围。例如,我们可以说建筑物是一个空间对象,因为它在 2D 或 3D 地图中具有位置和几何范围。
R-tree 中的“R”代表矩形。数据结构的关键思想是将附近的对象分组并用矩形表示它们。最小边界矩形或简称 MBR。这会递归地发生。
由于所有对象都位于此边界矩形内,因此不与边界矩形相交的查询也不能与任何包含的对象相交。在叶级,每个矩形描述一个空间对象。所有其他级别都只是节点指针。
您可以使用它来过滤快速用户,因为您将使用这些树,这些树根据用户的 MBR 位于附近以及其他 MBR 相交的位置。