Чтобы вычислить расстояние между двумя координатами широты и долготы в 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"