Ruby Haversine 公式:遍历两个数组

Ruby Haversine Formula: Iterating Through Two Arrays

我在使用 haversine Ruby gem 遍历两个数组时遇到问题。

我将 post 完整的要点在这里,但让您了解我正在努力完成的事情。

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

我们有光纤网络。只需将其视为地图上的线条即可。我拥有构成该网络的所有 lat/long 对,大约 24,000 行。

我们有光纤网络领域的潜在客户。我们想知道我们网络 1,000 英尺内有哪些客户。对于我们的潜在客户,我们大约有 3,000 行。

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

对于硬编码的客户位置,我可以这样做,它 returns 以英尺为单位的正确值。通过 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 中,它 returns 值不正确(就像,真的不正确)。如果我将客户 zip 块包装在 lat.zip(long).each do |lat_locs,long_locs| 中,返回值也不正确。

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

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

快速修复是使用 .last(它只是 returns 数组的最后一个元素而不是删除它)而不是 .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