Ruby Haversine公式:迭代两个数组

时间:2016-06-15 19:25:08

标签: arrays ruby haversine

我无法使用hasrsine Ruby gem迭代两个数组。

我会在这里发布完整的要点,但让你知道我想要完成的任务。

https://gist.github.com/ornerymoose/c4a45540304706e78191894dfe6b2539

我们有一个光纤网络。只需将其视为地图上的线条。我有构成这个网络的所有纬度/长对,大约24,000行。

我们拥有光纤网络领域的潜在客户。我们希望了解客户距离我们网络1000英尺的范围内。对于我们的潜在客户,我们有大约3,000行。

Haversine公式有四个参数:lat1,long1,lat2,long2。前两个将代表客户,第二个将代表光纤网络。

对于硬编码的客户位置,我可以这样做,并以英尺为单位返回正确的值。通过Google地球验证。

File.open('distance-output.csv', 'w') do |csv_object|
    lat.zip(long).each do |lat_locs,long_locs|  
        csv_object << Haversine.distance(28.59569, -81.21464, lat_locs.pop.to_f, long_locs.pop.to_f).to_feet
        csv_object << "\n"
    end
end

现在,我如何为客户lat / long数据实施相同类型的.zip设置?

如果我将lat.zip(long).each do |lat_locs,long_locs|包裹在客户.zip中,它会返回值但不正确(例如,真的不正确)。如果我在zip中包装客户lat.zip(long).each do |lat_locs,long_locs|块,则返回的值也不正确。

非常感谢您对此的任何意见。

1 个答案:

答案 0 :(得分:2)

我怀疑你的问题是你从单元素数组中弹出坐标。这会永久修改每个数组。当你在循环中执行它时,第二次循环时数组将为空。

快速解决方法是使用.last(它只返回数组的最后一个元素而不是删除它)而不是.pop。由于每个CSV中只有一列,.first.last是等效的。

但是,我建议重写您未在问题中包含的代码部分。从您的CSV读取的数组上的循环根本不做任何有用的事情;他们只是将数组复制到新数组。

相反,剥离单元素数组zip,然后遍历结果:

fib_coords = fib_lat.map(&:last).zip(fib_long.map(&:last))
cust_coords = cust_lat.map(&:last).zip(cust_long.map(&:last))
fib_coords.each do |fib_lat, fib_long|
  cust_coords.each do |cust_lat, cust_long|
    # ...
  end
end