我将位置(lat / long)的对象存储在Android应用程序的普通SQLite数据库中。应用程序接收带有存储在此DB中的新对象的消息(UDP数据包)。
为了避免DB在某一点爆炸并保持光亮,我想删除所有远离特定半径的物体。 DB通过实现DB Helper的DB-Adapter类来控制。
由于我不想使用距离近似,我想使用hasrsine公式。现在我有以下问题:
答案 0 :(得分:2)
这是我用来获取存储在数据库中的GPS数据的对象的排序子句的方法:
public String getOrderString(double latitude, double longitude) {
double fudge = Math.pow(Math.cos(Math.toRadians(latitude)), 2);
return "((" + latitude + " - " + KEY_LATITUDE + ") * (" + latitude
+ " - " + KEY_LATITUDE + ") + (" + longitude + " - "
+ KEY_LONGITUDE + ") * (" + longitude + " - " + KEY_LONGITUDE
+ ") * " + fudge + ") ASC";
}
从here'借来'。我对软糖因素的理解是它考虑了不在赤道附近的坐标。到目前为止,这个等式对我来说效果很好,并且相当快。
现在,我认为您可以通过执行以下操作来使用相同的等式:
public String getWhereString(double latitude, double longitude, double threshold) {
double fudge = Math.pow(Math.cos(Math.toRadians(latitude)), 2);
return "((" + latitude + " - " + KEY_LATITUDE + ") * (" + latitude
+ " - " + KEY_LATITUDE + ") + (" + longitude + " - "
+ KEY_LONGITUDE + ") * (" + longitude + " - " + KEY_LONGITUDE
+ ") * " + fudge + ") < " + threshold;
}
然后你的删除方法就像:
public int removeBuildingEntry(double latitude, double longitude, double threshold) {
String where = getWhereString(double latitude, double longitude, double threshold)
return db.delete(TABLE, where, null);
}
唯一的问题是我不知道等式结果的单位,因此你应该把它作为一个阈值传递给你。在我的情况下,我不关心那些,因为我只想要订单,但在你的情况下可能会有所作为。如果您需要更准确的数字,您可以使用不同的值来尝试计算它。