2012-03-26 21 views
1

2000緯度/経度が別の2000緯度/緯度のペアとの距離を計算する必要があるという問題がある場合、すなわち1対1である。これをルビーで行うための最も速い方法は何か。Rubyでの2つの緯度/経度の距離

Cエクステンションはもっと速くできますか?またはjava。現時点で私はGeoKitの宝石を使用しています。それは非常に多くの点では少し遅いです。

編集1:

時刻は現在30秒以上です。

+0

"少し遅い" の手段を何?あなたはそれをベンチマークしようとしましたか? http://ruby-doc.org/stdlib-1.9.2/libdoc/benchmark/rdoc/Benchmark.html –

+0

いいえ私はやっていないが編集する –

+0

30秒は、 –

答えて

1

どのようにGeoKitを使用しますか?私のマシンでは、2000ポイント間の距離を計算するのに0.016秒かかる。

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関数は、2つのgeom

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

インストール

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

EDITの間の距離を見つけるためにスポーンのような(または自分のバージョンのロール)https://github.com/tra/spawnhttps://github.com/rfc2822/spawnを使用して、計算をグループに分割します。距離の計算がマッチしたペアの間にあるように聞こえるので、最後に結果をマージするのはかなり簡単です(Karelが示唆しているように)。

最終結果を受け取ったときに最終注文をクライアント側で行うことはできますが、完了したら結果をクライアントにストリーミングすることができます(注文する必要がない場合)。

+0

私はPostgreSQLを使用していません - それらはメモリにあります。ありがとう –

関連する問題