2000緯度/経度が別の2000緯度/緯度のペアとの距離を計算する必要があるという問題がある場合、すなわち1対1である。これをルビーで行うための最も速い方法は何か。Rubyでの2つの緯度/経度の距離
Cエクステンションはもっと速くできますか?またはjava。現時点で私はGeoKitの宝石を使用しています。それは非常に多くの点では少し遅いです。
編集1:
時刻は現在30秒以上です。
2000緯度/経度が別の2000緯度/緯度のペアとの距離を計算する必要があるという問題がある場合、すなわち1対1である。これをルビーで行うための最も速い方法は何か。Rubyでの2つの緯度/経度の距離
Cエクステンションはもっと速くできますか?またはjava。現時点で私はGeoKitの宝石を使用しています。それは非常に多くの点では少し遅いです。
編集1:
時刻は現在30秒以上です。
どのように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
あなたがデータベースとして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/spawn、https://github.com/rfc2822/spawnを使用して、計算をグループに分割します。距離の計算がマッチしたペアの間にあるように聞こえるので、最後に結果をマージするのはかなり簡単です(Karelが示唆しているように)。
最終結果を受け取ったときに最終注文をクライアント側で行うことはできますが、完了したら結果をクライアントにストリーミングすることができます(注文する必要がない場合)。
私はPostgreSQLを使用していません - それらはメモリにあります。ありがとう –
"少し遅い" の手段を何?あなたはそれをベンチマークしようとしましたか? http://ruby-doc.org/stdlib-1.9.2/libdoc/benchmark/rdoc/Benchmark.html –
いいえ私はやっていないが編集する –
30秒は、 –