使用半正矢公式取得SQLite 中最近的位置
在SQLite 資料庫中儲存緯度和經度座標為基於位置的方法提供了各種可能性應用程式。一項常見任務是根據半正矢公式檢索到給定點的最近位置。雖然 MySQL 本身透過自訂函數支援此操作,但 SQLite 需要更複雜的方法。
半正弦公式的自訂外部函數
SQLite 支援自訂外部函數來實現高階計算。然而,建立和整合這些函數可能會帶來不必要的複雜性和效能開銷。此外,按距離對結果進行排序需要在資料庫中新增距離列,這既低效又不切實際。
使用邊界矩形進行高效過濾
一個實用的解決方案這項挑戰涉及使用邊界矩形過濾資料庫。透過根據給定點和預定義半徑計算矩形的四個角,您可以消除大多數不相關的資料並顯著減少所需的處理量。然後,可以使用派生的緯度和經度來建立 SQL 查詢的 WHERE子句:
PointF center = new PointF(x, y); final double mult = 1.1; // Mult for more reliable results PointF p1 = calculateDerivedPosition(center, mult * radius, 0); PointF p2 = calculateDerivedPosition(center, mult * radius, 90); PointF p3 = calculateDerivedPosition(center, mult * radius, 180); PointF p4 = calculateDerivedPosition(center, mult * radius, 270); strWhere = " WHERE " + COL_X + " > " + String.valueOf(p3.x) + " AND " + COL_X + " < " + String.valueOf(p1.x) + " AND " + COL_Y + " < " + String.valueOf(p2.y) + " AND " + COL_Y + " > " + String.valueOf(p4.y);
計算篩選結果內的距離
資料篩選後,您可以迭代結果並使用半正弦計算實際距離公式:
public static boolean pointIsInCircle(PointF pointForCheck, PointF center, double radius) { if (getDistanceBetweenTwoPoints(pointForCheck, center) <= radius) return true; else return false; } public static double getDistanceBetweenTwoPoints(PointF p1, PointF p2) { // Haversine formula for calculating distance in meters // ... }
透過將高效過濾與精確距離計算相結合,您可以從SQLite資料庫中檢索最近的位置,而無需依賴自訂外部函數或持久距離列。
以上是如何在不使用自訂函數的情況下有效率地在 SQLite 中找到最近的位置?的詳細內容。更多資訊請關注PHP中文網其他相關文章!