2011-10-25 87 views
3

我在Android應用程序的正常SQLite數據庫中存儲具有位置(lat/long)的對象。應用程序接收存儲在此DB中的新對象的消息(UDP數據包)。根據當前位置刪除數據庫行

爲了避免數據庫在一個點爆炸並保持點亮,我想刪除所有遠離特定半徑的對象。數據庫通過DB-Adapter類來實現DB Helper。

由於我不想使用距離近似值,我想使用haversine公式。現在我有以下問題:

  1. 在輕量級智能解決方案中實現此任務的最佳方法是什麼?
  2. 我想過使用AsyncTask來完成這項工作。這是建議嗎?
+0

看這個答案http://stackoverflow.com/a/12997900/779408 – breceivemail

回答

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); 
} 

唯一的問題是,我不知道方程結果的單位,因此應該通過什麼作爲閾值。在我的情況下,我不關心那些,因爲我只想要訂單,但在你的情況下,可能會有所作爲。如果您需要更精確的數字,您可以使用不同的值或嘗試計算它。

+0

非常感謝你的代碼和解釋!這真的很有幫助!我會嘗試一下並報告! – Palund

+0

好吧,我用這種方式實現它,它工作得很好。對於單位,我乘以兩個產品111.2公里,這是約。赤道一度的寬度。有了它的巧妙因素,它也起作用。近似值可以。再次感謝! – Palund

+0

很高興工作。如果它回答你的問題,請標記爲已接受 – Craigy