Search code examples
ruby-on-railsgeocode

How to calculate distance in km between two points using Geocoder


I'm trying to figure out a way to show calculated distance between two point on a map using Geocoder. I have start_address and destination_address in my table which I ask for in my view, my model looks like this:

class Ride < ActiveRecord::Base
    geocoded_by :start_address
    geocoded_by :destination_address
    reverse_geocoded_by :latitude, :longitude
    after_validation :geocode

end

How can I get calculated distance between the two points and show in view. No need for longitude and latitude.

Edit: The default unit is 'miles'. To change default unit set it in your ActiveRecord model:

Venue.near([40.71, -100.23], 20, :units => :km)

or change it in:

# config/initializers/geocoder.rb
# set default units to kilometers:
:units => :km,

Edit: I've managed to resolve this like so:

ride = Ride.new(params)
start_address_coordinates = Geocoder.coordinates(params[:start_address])
destination_coordinates = Geocoder.coordinates(params[:destination])
ride.distance = Geocoder::Calculations.distance_between(start_address_coordinates, destination_coordinates)

Solution

  • In Geocoder::Calculations module, there is a method called distance_between(lat1, lon1, lat2, lon2, options = {})

    you pass the longitude and latitude of two points and it gives you back the distance between these two points.

    For further info please check this link out

    quoted from theGem's docs:

    look up coordinates of some location (like searching Google Maps)

    Geocoder.coordinates("25 Main St, Cooperstown, NY")
    => [42.700149, -74.922767]
    

    So you can use this above method to get the coordinates of a specific location entered by the user, then you can calculate the difference in distance between two points by the below method.

    distance between Eiffel Tower and Empire State Building

    Geocoder::Calculations.distance_between([47.858205,2.294359], [40.748433,-73.985655])
    => 3619.77359999382 # in configured units (default miles)