How to calculate the distance between two GPS coordinates without using Google Maps API?

前端 未结 7 1105
小鲜肉
小鲜肉 2020-12-08 02:56

I\'m wondering if there\'s a way to calculate the distance of two GPS coordinates without relying on Google Maps API.

My app may receive the coordinates in float or

相关标签:
7条回答
  • 2020-12-08 03:04

    Distance between two coordinates on earth is usually calculated using Haversine formula. This formula takes into consideration earth shape and radius. This is the code I use to calculate distance in meters.

    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
    
    0 讨论(0)
  • 2020-12-08 03:04

    Look at gem Geocoder(railscast)

    If you store your coordinates in db, it calculate distance using database. But works good in other cases too.

    0 讨论(0)
  • 2020-12-08 03:05

    Converted the accepted answer to Swift 3.1 (works on Xcode 8.3), in case anyone needs it:

    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
    }
    
    0 讨论(0)
  • 2020-12-08 03:17

    You can use the loc gem like this :

    require 'loc'
    
    loc1 = Loc::Location[49.1, 2]
    loc2 = Loc::Location[50, 3]
    
    loc1.distance_to(loc2)
    => 123364.76538823603 # km
    
    0 讨论(0)
  • 2020-12-08 03:18

    Just a little shorter & separated parameter version of @Lunivore's answer

    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
    
    0 讨论(0)
  • 2020-12-08 03:26

    You can use the geokit ruby gem. It does these calculations internally, but also supports resolving addresses via google and other services if you need it to.

    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
    

    You can also find out the bearing_to (direction expressed as a float in degrees between 0-360) and midpoint_to (returns an object you can run .latitude and .longitude methods on).

    0 讨论(0)
提交回复
热议问题