Методы Ruby для расчета расстояния между координатами широты и долготы

Чтобы вычислить расстояние между двумя координатами широты и долготы в Ruby, вы можете использовать несколько методов. Вот несколько примеров:

Метод 1: формула гаверсинуса

def haversine_distance(lat1, lon1, lat2, lon2)
  earth_radius = 6371 # in kilometers
  dlat = (lat2 - lat1) * Math::PI / 180
  dlon = (lon2 - lon1) * Math::PI / 180
  a = Math.sin(dlat / 2) * Math.sin(dlat / 2) +
      Math.cos(lat1 * Math::PI / 180) * Math.cos(lat2 * Math::PI / 180) *
      Math.sin(dlon / 2) * Math.sin(dlon / 2)
  c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
  distance = earth_radius * c
  return distance
end
# Example usage
distance = haversine_distance(37.7749, -122.4194, 34.0522, -118.2437)
puts "Distance between the coordinates: #{distance} km"

Метод 2: формулы Винсенти (требуется драгоценный камень)
Чтобы использовать формулы Винсенти, вам понадобится драгоценный камень «геокодер», который обеспечивает реализацию этого алгоритма.

require 'geocoder'
def vincenty_distance(lat1, lon1, lat2, lon2)
  point1 = Geocoder::Calculations::Point.new(lat1, lon1)
  point2 = Geocoder::Calculations::Point.new(lat2, lon2)
  distance = Geocoder::Calculations.distance_between(point1, point2)
  return distance
end
# Example usage
distance = vincenty_distance(37.7749, -122.4194, 34.0522, -118.2437)
puts "Distance between the coordinates: #{distance} km"

Метод 3: сферический закон косинусов

def spherical_law_distance(lat1, lon1, lat2, lon2)
  earth_radius = 6371 # in kilometers
  dlon = (lon2 - lon1) * Math::PI / 180
  distance = Math.acos(Math.sin(lat1 * Math::PI / 180) * Math.sin(lat2 * Math::PI / 180) +
                       Math.cos(lat1 * Math::PI / 180) * Math.cos(lat2 * Math::PI / 180) *
                       Math.cos(dlon)) * earth_radius
  return distance
end
# Example usage
distance = spherical_law_distance(37.7749, -122.4194, 34.0522, -118.2437)
puts "Distance between the coordinates: #{distance} km"