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
我在使用 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