我无法使用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|
块,则返回的值也不正确。
非常感谢您对此的任何意见。
答案 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