2017-04-22 154 views
0

有關的散列的一個數組元素的鍵以不同的排列我有一個hash(city: [coordinates])這樣的:在紅寶石

cities = { 
    l1: [41.91372380139719,-87.72308349609375], 
    l2: [42.092312110873536,-87.79449462890625], 
    l3: [42.08008203350686,-87.73406982421875], 
    l4: [41.86976539904969,-87.68325805664062], 
    l5: [41.8861255478388,-87.63381958007812], 
    l6: [41.8891926094646,-87.60635375976562], 
    l7: [41.91678953772886,-87.63107299804688], 
    l8: [41.92496411465408,-87.68051147460938], 
    l9: [41.87283324596932,-87.61734008789062], 
    l10: [41.84828634806966,-87.61184692382812], 
    l11: [41.86772008597142,-87.63931274414062], 
    l12: [41.88510316124205,-87.60498046875], 
    l13: [41.84930932360913,-87.62420654296875] 
} 

然後我計算所述第一位置和所述位置的像的其餘部分之間的距離寫在下面,然後我把這些距離到一個數組稱爲temp

temp = [] 

def distance loc1, loc2 
    rad_per_deg = Math::PI/180 # PI/180 
    rkm = 6371     # Earth radius in kilometers 
    rm = rkm * 1000    # Radius in meters 

    dlat_rad = (loc2[0]-loc1[0]) * rad_per_deg # Delta, converted to rad 
    dlon_rad = (loc2[1]-loc1[1]) * rad_per_deg 

    lat1_rad, lon1_rad = loc1.map {|i| i * rad_per_deg } 
    lat2_rad, lon2_rad = loc2.map {|i| i * rad_per_deg } 

    a = Math.sin(dlat_rad/2)**2 + Math.cos(lat1_rad) * Math.cos(lat2_rad) * Math.sin(dlon_rad/2)**2 
    c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a)) 

    rm * C# Delta in meters 
end 

cityarr = cities.to_a 

for i in 1..(cityarr.length-1) do 
    temp.push (distance [cityarr[0][1][0], cityarr[0][1][1]],[cityarr[i][1][0], cityarr[i][1][1]]) 
end 

puts temp 

此代碼的工作,我得到的距離的數組。我的最終目標是將最近的位置輸出到第一個位置(「l1」)。

例如:「L7是離L1最近的位置」。由於temp數組中的元素與城市散列中的鍵沒有關聯,因此我不確定如何執行此操作。我只需使用puts temp.min 即可獲得最小距離,但不會輸出位置的名稱。

有沒有辦法做到這一點?

回答

1
for i in 1..(cityarr.length-1) do 
    temp.push([cityarr[i][0], distance([cityarr[0][1][0], cityarr[0][1][1]], 
            [cityarr[i][1][0], cityarr[i][1][1]])]) 
end 

temp.min_by { |dist| dist[1] } 

這給你距離最近的點。猜猜可以找到更好的方法來做到這一點。我相信有人會喜歡用替代品來啓發我們。

+0

非常感謝。奇蹟般有效。 – Dinukaperera

+1

不客氣。請接受答案,如果它回答了你的問題。這樣你可以表明你的問題不一定需要更多的關注和答案完全符合你的問題。 – infiniteRefactor

+0

謝謝你讓我知道「接受」答案。直到你提到它,我才知道它。 – Dinukaperera