2016-12-08 33 views
1

物體的最小距離我有一套縣的每個質心的緯度和經度一起:查找一組R或Python的

county lat  lon 
Abiline 32.134 -23.322 
Cook  43.324 -32.219 
Allegheny 31.949 -30.123 

我也有很多醫院的列表,每個醫院的經度和緯度。我想找出每個縣質心最近醫院的距離。

到目前爲止,我已經使用ggmap的geocode()函數來查找每個縣與各醫院的距離,然後選擇最小距離。但是,由於我縣有很多醫院,所以這個問題很快就會變得很嚴重,需要很長時間。

我想避免使用arcgis - 是否有直接的方式在R或Python中執行此操作?

+0

你在尋找歐幾里德距離嗎? –

+0

如果你正在尋找R的最小歐氏距離,你可以使用'min(dist(c(df $ lat,df $ lon)))' –

+0

是的,我正在尋找歐幾里德距離。在你的解決方案中,'df $ lat'和'df $ lon'指的是每個醫院和縣的疊加(經緯度)對? – svenkatesh

回答

0

我想你正在努力實現的是這樣的問題 closest pair of points下面是完整的算法和解釋,以達到相同的:

我們給出的n個點在平面陣列,並問題是要找出陣列中最接近的一對點。這個問題出現在許多應用程序中。例如,在空中交通管制中,您可能需要監視太靠近的飛機,因爲這可能表明可能發生碰撞。回想兩點p和q之間距離的下列公式。 蠻力解決方案是O(n^2),計算每對之間的距離並返回最小值。我們可以使用分治策略計算O(nLogn)時間的最小距離。

算法

以下是一個爲O​​(n(logN)的^ 2)algortihm的詳細步驟。 輸入:n個點的數組P [] 輸出:給定數組中兩點之間的最小距離。

作爲預處理步驟,輸入數組按x座標排序。

  1. 找到排序數組中的中點,我們可以把P [n/2]作爲中間點。
  2. 將給定數組分成兩半。第一個子數組包含從P [0]到P [n/2]的點。第二個子數組包含從P [n/2 + 1]到P [n-1]的點。
  3. 遞歸找到兩個子陣列中的最小距離。讓距離爲dl和dr。找到dl和dr的最小值。讓最小值爲d。
  4. 遞歸找到兩個子陣列中的最小距離。讓距離爲dl和dr。找到dl和dr的最小值。讓最小值爲d。
  5. 根據y座標對數組strip []進行排序。這一步是O(nLogn)。它可以通過遞歸排序和合並來優化爲O(n)。
  6. 查找帶[]中的最小距離。這很棘手。從第一眼看,它似乎是一個O(n^2)步,但它實際上是O(n)。從幾何上可以證明,對於條帶中的每個點,我們只需要檢查它後面的最多7個點(注意條帶按Y座標排序)。
  7. 最後返回最小d和距離上述步驟中計算出(步驟6)

執行is here

希望這有助於:)

來源:Geeksforgeeks.org