terrestres studio puntos medir latitudes google entre distancias distancia coordenadas calcular ruby google-maps

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.


Mira la gema railscast ( railscast )

Si almacena sus coordenadas en db, calcula la distancia usando la base de datos. Pero funciona bien en otros casos también.



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