2012-03-26 63 views
1

考慮到您有2000 lat/lng需要計算它們與另一個2000 lat/lngs成對距離的問題。即1比1.什麼是最快的方式來完成這個紅寶石。Ruby中兩個Lat/Lng的距離

C擴展可以更快嗎?或Java。目前我正在使用GeoKit gem,並且它有點慢。

編輯1:

現在時間超過30秒。

+0

什麼是 「有點慢」 的意思?你有沒有嘗試過基準測試? http://ruby-doc.org/stdlib-1.9.2/libdoc/benchmark/rdoc/Benchmark.html – 2012-03-26 09:18:48

+0

不,我沒有但會做和編輯 – 2012-03-26 10:10:39

+0

30秒的時間 – 2012-03-26 11:50:05

回答

1

您如何使用GeoKit?在我的機器上,需要0.016s來計算2000點之間的距離。

require 'benchmark' 
require 'geokit' 

ll_arr = 2000.times.map {|i| 
       [Geokit::LatLng.new(rand(-180..180), rand(-180...180)), 
       Geokit::LatLng.new(rand(-180..180), rand(-180...180))]} 

distances = [] 

Benchmark.bm do |x| 
    x.report do 
    ll_arr.each do |ll| 
     distances << ll[0].distance_from(ll[1], :units=>:kms) 
    end 
    end 
end 

10.times do |n| 
    m = n * 200 
    puts "ll #{m} from: #{ll_arr[m][0]} to: #{ll_arr[m][1]} distance: #{distances[m]}" 
end 

輸出:

user  system  total  real 
0.016000 0.000000 0.016000 ( 0.015624) 

而結果似乎是合理的(千米):

ll 0 from: -180,71 to: 111,164 distance: 10136.21791028502 
ll 200 from: 40,-127 to: -62,-23 distance: 14567.00843599676 
ll 400 from: 23,-178 to: -163,-140 distance: 16014.598170496456 
ll 600 from: 85,155 to: 25,3 distance: 7727.840511097989 
ll 800 from: -26,57 to: 145,-36 distance: 11384.743155770688 
ll 1000 from: -111,-137 to: 5,-5 distance: 9007.969496928148 
ll 1200 from: 118,-98 to: -153,179 distance: 12295.886774709148 
ll 1400 from: 44,-139 to: -91,-134 distance: 15024.485920445308 
ll 1600 from: 48,126 to: -37,-92 distance: 16724.015574628884 
ll 1800 from: -174,-77 to: -69,75 distance: 7306.820947156828 
0

如果你使用PostgreSQL作爲數據庫,你可以看看http://postgis.refractions.net/

這需要重裝緯度/經度點背與PostGIS的點數據類型數據庫表,但作爲獎金數據庫應現在可以處理邊界和邊界等形狀文件。

SQL函數兩個geoms

http://postgis.refractions.net/documentation/manual-1.5/ST_Distance.html

安裝

http://postgis.refractions.net/documentation/manual-1.5/ch02.html

編輯之間找到距離:

如果這些只存儲在內存中我想你可以使用的東西像spawn(或自己的版本)https://github.com/tra/spawnhttps://github.com/rfc2822/spawn將計算分成組。由於聽起來像距離計算只是在匹配對之間進行,所以在結尾合併結果應該非常直接(如Karel所建議的)。

您可以在結束時將結果流式傳輸回客戶端(如果它們不需要訂購 - 儘管最終結果收到時最終訂購可以在客戶端完成)。

+0

我沒有使用PostgreSQL - 它們在內存中。謝謝 – 2012-03-26 11:50:28