2010-11-03 74 views
1

我有一個特定的問題,我發現很難找到解決方案!通過指向方向查找對象

使用GPS設備我可以在地球上找到我目前的位置。我需要能夠指向一個方向(iPhone或類似設備上的指南針),並找出朝哪個方向重要的物體(位置)!假設我確實將所有這些位置存儲在數據庫中。

+0

您需要提供比這更多的信息。你是否通過一些API訪問設備?那樣的話,哪個API?或者你的應用程序直接從設備讀取'$ GPRMC'語句? – 2010-11-03 23:59:44

+0

我正在開發一個Android應用程序,該應用程序使用本地SQLite數據庫,在該應用程序中存儲有關「地標」的信息。每個地標都有其經緯度。現在我想用我的內置指南針,它會告訴我我指向哪個方向的設備,並告訴我哪個物體朝着那個方向。所以Java或C#代碼可能會有所幫助。 – user496607 2010-11-04 00:07:37

+0

當我想確定兩個物體之間的距離時,我已經使用了Haversine。我認爲答案是三角學,儘管我對該領域的知識非常謙虛! – user496607 2010-11-04 00:12:40

回答

1

假設你有一個位置和一個方向,你的目標是找到你的數據庫中的哪些項目與該位置相鄰,方向正確。

顯然,您可以掃描數據庫中的每個元素,然後爲每個元素回答「這是否在該區域?」。真正的魔法就是效率;如何將數據索引到數據庫中,以便您可以回答該問題而無需查看每條記錄。

一個很好的例子是MongoDB。但是它的實現不處理方向,所以你需要過濾結果。您將使用該數據庫來獲取x距離範圍內的所有對象,並將過濾掉那些不在適當方向的元素。

如果您不能使用具有本地地理空間索引的數據庫引擎,則必須自己實施它。正如在評論中提到的那樣,Haversine函數用於計算球體(在本例中爲地球)的距離。除了計算每個點與你自己之間的距離之外,你可以從消除任何超出範圍的元素開始,例如, (你的緯度+你的搜索距離)<(對象的緯度)。然後使用Haversine進一步過濾。您也可以使用地理空間散列函數來預先完成大部分工作。

一旦你有了範圍內的所有元素,就可以將數據庫中的x-y座標轉換爲極座標。簡而言之:

arctan((item_y - users_y)/(item_x - users_x)) = the angle between the item and the user 

如果計算該用戶的「範圍」內的每一項,並篩選出其不是指南針角的一些範圍之內的任何元件(+/- 20度,例如) ,你會得到你需要的元素。

如果效率仍然是一個問題,您可以通過立即使任何元素無效,例如在用戶的反面(如果用戶朝西,比具有更高x座標的元素比用戶不可能在他看來)。根據您的編程語言,使用比通常提供的準確度更低的arctan靜態表也可能更高效。

如果您特別聰明,您還可以找到按角度對數據進行索引的方法,這將進一步降低所需的計算量。

+0

謝謝扎克這個徹底的答案。我將開始實施此解決方案,並使用我的發現/源代碼發佈更新。 – user496607 2010-11-04 09:12:43