Ruby Haversine 公式:遍历两个数组
Posted
技术标签:
【中文标题】Ruby Haversine 公式:遍历两个数组【英文标题】:Ruby Haversine Formula: Iterating Through Two Arrays 【发布时间】:2016-06-15 19:25:07 【问题描述】:我在使用 hasrsine Ruby gem 遍历两个数组时遇到问题。
我将在此处发布完整的要点,但让您了解我想要完成的工作。
https://gist.github.com/ornerymoose/c4a45540304706e78191894dfe6b2539
我们有一个光纤网络。把它想象成地图上的线条。我有构成这个网络的所有纬度/经度对,大约 24,000 行。
我们在光纤网络领域拥有潜在客户。我们想知道在我们网络 1,000 英尺范围内有哪些客户。对于我们的潜在客户,我们大约有 3,000 行。
Haversine 公式采用四个参数:lat1、long1、lat2、long2。前两个代表客户,后两个代表光纤网络。
对于硬编码的客户位置,我可以这样做,它会返回以英尺为单位的正确值。通过谷歌地球验证。
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
现在,我将如何为客户的纬度/经度数据实施相同类型的 .zip
设置?
如果我将 lat.zip(long).each do |lat_locs,long_locs|
包装在客户 .zip
中,它会返回值但不正确(就像,真的不正确)。如果我将客户zip
块包装在lat.zip(long).each do |lat_locs,long_locs|
中,则返回的值也不正确。
非常感谢您对此的任何意见。
【问题讨论】:
【参考方案1】:我怀疑您的问题是您将坐标从单元素数组中弹出。这会永久修改每个数组。当您在循环中执行此操作时,第二次循环中的数组将为空。
快速解决方法是使用.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
【讨论】:
pop
和无用的数组的好点,没有想到这一点。效果很好,谢谢。以上是关于Ruby Haversine 公式:遍历两个数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Haversine 公式计算行驶距离(不是位移)?
MySQL 函数 ST_Distance_Sphere 没有使用 Haversine 公式?
计算两个latitude-longitude点之间的距离? (Haversine公式)