在 SQLite 中查找具有纬度和经度的最近位置
在处理地理数据时,通常需要查找距指定位置最近的位置观点。在 SQLite 中,此任务可能有点具有挑战性,因为它缺少用于计算球体上距离的内置函数。
逼近和过滤
要克服这个问题由于局限性,常见的方法是使用近似和过滤。第一步是估计指定点周围可能位置的范围。这可以通过计算围绕该点形成矩形的四个点来完成。使用这些点,您可以过滤 SQLite 数据,仅检索此矩形近似值内的位置。
计算距离
一旦您有了过滤后的位置列表,下一个步骤是计算每个位置与指定点之间的距离。这可以使用称为半正矢公式的公式来完成。但是,由于 SQLite 没有内置的半正弦公式实现,因此您需要在 Java 中定义自定义函数。
自定义函数
在 Java 中定义自定义函数可以使用 org.sqlite.Function 库来完成。这需要 org.sqlite.jar 依赖项,这可能会显着增加应用程序的大小。为了避免这种情况,您可以使用下面的方法,该方法无需自定义函数即可计算两点之间的距离:
public static double getDistanceBetweenTwoPoints(PointF p1, PointF p2) { double R = 6371000; // m double dLat = Math.toRadians(p2.x - p1.x); double dLon = Math.toRadians(p2.y - p1.y); double lat1 = Math.toRadians(p1.x); double lat2 = Math.toRadians(p2.x); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); double d = R * c; return d; }
通过循环过滤后的位置并计算到每个点的距离,您可以可以识别距您指定点最近的位置。
排序
按距离对结果排序可以使用自定义排序算法或像 Collections.sort() 这样的库在 Java 代码中完成。这使您可以按照距离的顺序呈现最近的位置。
有更好的方法吗?
上面概述的方法非常高效,并且在 Android 应用程序中常用。然而,在没有内置距离函数的情况下,没有真正“更好”的方法来在 SQLite 中查找最近位置。
以上是如何在 SQLite 中使用经纬度高效查找最近的位置?的详细内容。更多信息请关注PHP中文网其他相关文章!