ruby - studio - medir distancias google maps android
¿Cómo calcular la distancia entre dos coordenadas de GPS sin utilizar Google Maps API? (7)
La distancia entre dos coordenadas en la tierra generalmente se calcula usando la fórmula de Haversine . Esta fórmula toma en consideración la forma y el radio de la tierra. Este es el código que uso para calcular la distancia en metros.
def distance loc1, loc2
rad_per_deg = Math::PI/180 # PI / 180
rkm = 6371 # Earth radius in kilometers
rm = rkm * 1000 # Radius in meters
dlat_rad = (loc2[0]-loc1[0]) * rad_per_deg # Delta, converted to rad
dlon_rad = (loc2[1]-loc1[1]) * rad_per_deg
lat1_rad, lon1_rad = loc1.map {|i| i * rad_per_deg }
lat2_rad, lon2_rad = loc2.map {|i| i * rad_per_deg }
a = Math.sin(dlat_rad/2)**2 + Math.cos(lat1_rad) * Math.cos(lat2_rad) * Math.sin(dlon_rad/2)**2
c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a))
rm * c # Delta in meters
end
puts distance [46.3625, 15.114444],[46.055556, 14.508333]
# => 57794.35510874037
Me pregunto si hay una manera de calcular la distancia de dos coordenadas de GPS sin depender de la API de Google Maps.
Mi aplicación puede recibir las coordenadas en float o tendría que hacer un reverse GEO en las direcciones.
No estoy seguro de ninguna solución preempaquetada, pero parece un cálculo bastante sencillo: http://www.movable-type.co.uk/scripts/latlong.html
Puedes usar geokit ruby gem . Hace estos cálculos internamente, pero también admite la resolución de direcciones a través de google y otros servicios si lo necesita.
require ''geokit''
current_location = Geokit::LatLng.new(37.79363,-122.396116)
destination = "37.786217,-122.41619"
current_location.distance_to(destination)
# Returns distance in miles: 1.211200074136264
También puede averiguar la dirección bearing_to
(expresada como un flotador en grados entre 0-360) y midpoint_to
(devuelve un objeto en el que puede ejecutar los métodos .latitude y .longitude).
Puedes usar la gema loc así:
require ''loc''
loc1 = Loc::Location[49.1, 2]
loc2 = Loc::Location[50, 3]
loc1.distance_to(loc2)
=> 123364.76538823603 # km
Se convirtió la respuesta aceptada a Swift 3.1 (funciona en Xcode 8.3), en caso de que alguien lo necesite:
public static func calculateDistanceMeters(departure: CLLocationCoordinate2D, arrival: CLLocationCoordinate2D) -> Double {
let rad_per_deg = Double.pi / 180.0 // PI / 180
let rkm = 6371.0 // Earth radius in kilometers
let rm = rkm * 1000.0 // Radius in meters
let dlat_rad = (arrival.latitude - departure.latitude) * rad_per_deg // Delta, converted to rad
let dlon_rad = (arrival.longitude - departure.longitude) * rad_per_deg
let lat1_rad = departure.latitude * rad_per_deg
let lat2_rad = arrival.latitude * rad_per_deg
let sinDlat = sin(dlat_rad/2)
let sinDlon = sin(dlon_rad/2)
let a = sinDlat * sinDlat + cos(lat1_rad) * cos(lat2_rad) * sinDlon * sinDlon
let c = 2.0 * atan2(sqrt(a), sqrt(1-a))
return rm * c
}
Una versión de parámetro más corta y separada de la respuesta de @ Lunivore
RAD_PER_DEG = Math::PI / 180
RM = 6371000 # Earth radius in meters
def distance_between(lat1, lon1, lat2, lon2)
lat1_rad, lat2_rad = lat1 * RAD_PER_DEG, lat2 * RAD_PER_DEG
lon1_rad, lon2_rad = lon1 * RAD_PER_DEG, lon2 * RAD_PER_DEG
a = Math.sin((lat2_rad - lat1_rad) / 2) ** 2 + Math.cos(lat1_rad) * Math.cos(lat2_rad) * Math.sin((lon2_rad - lon1_rad) / 2) ** 2
c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1 - a))
RM * c # Delta in meters
end