Расстояние по двум широтам и шинам в рубине - PullRequest
1 голос
/ 26 марта 2012

Учитывая проблему, что у вас есть 2000 лат / lng, которые должны рассчитать их расстояние до еще 2000 лат / lngs попарно то есть с 1 по 1. Какой самый быстрый способ сделать это в ruby.

Может ли расширение C быть быстрее? или Java. В данный момент я использую GeoKit, и он слишком медленный для многих точек.

РЕДАКТИРОВАТЬ 1:

В данный момент время превышает 30 секунд.

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Как вы используете 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 голосов
/ 26 марта 2012

Если вы используете PostgreSQL в качестве базы данных, вы можете взглянуть на http://postgis.refractions.net/

Это потребует перезагрузки точек Lat / Lng обратно в таблицу базы данных с типами точек PostGIS, но в качестве бонусатеперь база данных должна иметь возможность обрабатывать шейп-файлы для таких вещей, как границы и границы.

Функция SQL для поиска расстояния между двумя гемами

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/spawn, https://github.com/rfc2822/spawn чтобы разбить расчеты на группы.Поскольку кажется, что вычисления расстояний выполняются только между согласованными парами, в конце должно быть довольно просто объединить результаты обратно вместе (как предлагает Карел).

Вы можете передать результаты обратно клиенту какони завершены (если их не нужно заказывать - хотя окончательный заказ может быть выполнен на стороне клиента после получения окончательных результатов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...