Android上的Sqlite:如何创建一个sqlite dist db函数 – 在app中用于使用lat,long进行距离计算

我们正在构建一个Android应用程序,它将使用用户的当前位置(lat,long)并显示当前位置的前50个场所,按距离排序。

我们将这些场所存储在SQLite DB中。 我们计划随应用程序一起发布sqlite数据库。

为了只获取相关的前50个最近的场地,我们想要定义一个db函数DIST(计算两点之间的距离)并在我们的查询中使用它。

如何为Android应用程序定义自定义SQLitefunction? 执行此操作的Java API调用是什么?

我们已经在iPhone App中成功实现了这种方法 – 使用Objective C.

更新:答案是你不能这样做。

来自: Android。 是否可以在C / C ++上编写自定义函数并在SQL查询中使用它?

解决方法可能是获取其中一个值(例如,经度)接近当前位置的所有记录。 如果您使用此列作为索引,那么获取这些将非常快。

然后,你有一个大大减少的子集来迭代比较纬度并进行全距离计算。

它可以完成,但您无法从Java API将其加载到数据库中。 您需要提供自己的sqlite库实现,该库的扩展将提供您希望在C级别执行的function。 这不好玩,但效果很好。 请注意,使用非标准体系结构的Android设备可能存在问题。

我知道这是一个老问题,但我认为有一个更简单的解决方案。

这是一个例子,但是当它穿过0度时它会失败,尽管你可以移动所有纬度/经度以进行调整。

整体解决方案对于排序非常有效,但只是使用毕达哥拉斯定理来计算相对距离(注意:在sqlite中没有平方根函数,但这不相关)。

  String calcDistance = "( ( (abs(" + cLat + ") - " + Math.abs(lat) + ") * (abs(" + cLat + ") - " + Math.abs(lat) + ") )" + "+ ( (abs(" + cLng + ") - " + Math.abs(lng) + ") * (abs(" + cLng + ") - " + Math.abs(lng) + ") ) ) as calc_distance"; 

如果你需要修正这个距离,你可以通过在所有纬度上加90,在所有经度上加180来调整。 然后你可以摆脱那些讨厌的absfunction。