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 公式)

如何使用 Haversine 公式计算行驶距离(不是位移)?

MySQL 函数 ST_Distance_Sphere 没有使用 Haversine 公式?

计算两个latitude-longitude点之间的距离? (Haversine公式)

在带有变量的javascript中使用haversine公式

求解Haversine公式的分量时,sympy挂起[重复]