2012-07-03 63 views
4

我正在研究一個項目,該項目會跟蹤一輛汽車的行駛狀況。車輛的位置取自Geoloqi API,並顯示在自動更新的地圖上。座標傳遞給Drupal中的AHAH函數,該函數將通過其他API加載更多關於位置的信息。其中之一是Geonames.org。gps在兩個地點之間的位置

我不想經常從遠程服務器加載數據,因爲這會增加負載並使用我們的信用過快。然而。我確實希望它儘可能實時,因爲這對項目至關重要。所以我想這樣做:

Geonames爲當前街道提供一串GPS位置,以便它可以在地圖上繪製。 「線」被賦予下一個路口。如果我們在每次改變位置時詢問當前街道名稱,我們都會過快地吃我們的車票,但在每個路口怎麼樣?

是否有可能在PHP中檢查給定的gps座標是否在兩個其他座標之間的直線上?如果這條線可以在各個方向上延伸幾米以清除任何偏移,那也是很好的。

非常感謝你的所有建議。

回答

2

你原來的問題歸結爲一個簡單的數學問題:找到一個給定的兩個點的線的方程,它通過。這部分很簡單:說,你有兩個點(LAT1,lon1)和(LAT2,lon2)座標,則該行的公式將是

(lon2 - lon1) * X + (lat1 - lat2) * Y + (lat1 * lon2 + lat2 * lon1) = 0 

現在,當你得到任何其他點(LAT ,lon),將這些座標分別作爲(X,Y)分別放入方程中。如果你得到0,那麼點就在線上。然後檢查您的lat是在lat1lat2之間,您的lon是在lon1lon2之間。如果是,那麼新的點位於兩個現有點之間的線上。

更復雜的部分來自於兩件事情:

  1. GPS誤差。爲了說明這一點,你可以做一些近似,例如,而不是比較0,給它一些餘地,例如,將-err+err進行比較,其中err是您定義的某個值。

  2. 事實上,大多數街道不是直的。下面的圖片顯示了這個問題。如果你看看頂部街道兩端之間的線路,垂直街道的頂部將位於該線路上 - 但這不是你想要的。
    enter image description here

也許更好的方法是使用距離變化。如果GPS報告的距離變化小於某個預定義值,則不要重新查詢位置。

相關問題