红宝石中的Haversine公式

Posted

技术标签:

【中文标题】红宝石中的Haversine公式【英文标题】:Haversine formula in ruby 【发布时间】:2016-05-18 10:17:19 【问题描述】:

我需要用lats and longs inside distance方法计算从json得到的经纬度之间的距离

我收到错误 distance': undefined method-' for "12.986375":String (NoMethodError)

    require 'json'
class Numeric
    def to_rad
      self * Math::PI / 180
    end
  end

  def distance( lat2,  lon2)
     lat1=12.9611159
     lon1=77.6362214
     dLat = (lat2-lat1).to_rad;
     dLon = (lon2-lon1).to_rad;
     a = Math.sin(dLat/2) * Math.sin(dLat/2) +
         Math.cos(lat1.to_rad) * Math.cos(lat2.to_rad) *
         Math.sin(dLon/2) * Math.sin(dLon/2);
     c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
     d = 6371 * c; 
     puts d
  end

file= File.read('customers.json')
data_hash= JSON.parse(  file)

data_hash["customers"].each do |user|
  latitude=user["latitude"]
  longitude=user["longitude"]
  distance(latitude,longitude)
end 

下面是我的 json 文件,从中获取 lats 和 longs。

"customers" :[

            "latitude": "12.986375", "user_id": "12", "name": "Chris", "longitude": "77.043701",
            "latitude": "11.92893", "user_id": "1", "name": "Alice", "longitude": "78.27699",
            ]

【问题讨论】:

【参考方案1】:

错误是不言自明的——您的 json 将纬度/经度保存为字符串。在调用距离方法之前将它们解析为浮动

latitude=user["latitude"].to_f
longitude=user["longitude"].to_f
distance(latitude,longitude)

【讨论】:

以上是关于红宝石中的Haversine公式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ColdFusion 中锻炼 Haversine 公式

CakePHP 2.2.4 无法使用 HAVING 子句和计算字段对结果进行分页 - Haversine 公式

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

Haversine 公式 - 结果太高

Haversine 公式和 Python 3 - 数学域错误

Haversine 公式无法正常工作