Crystal implementation of the Haversine formula to calculate distances between two points given their latitudes and longitudes.
-
Add the dependency to your
shard.yml
:dependencies: haversine: github: geocrystal/haversine
-
Run
shards install
require "haversine"
Calling Haversine.distance
with four latitude/longitude coordinates returns a Haversine::Distance
object which can provide output in kilometers, meters, miles, feet, or nautical miles.
Each "coordinates" member must be a pair of coordinates - latitude
and longitude
.
Haversine.distance
accepts of either:
Haversine.distance(lat1, lon1, lat2, lon2)
Haversine.distance({lat1, lon1}, {lat2, lon2})
Haversine.distance([lat1, lon1], [lat2, lon2])
# Tokyo -> Paris
distance = Haversine.distance(35.61488, 139.5813, 48.85341, 2.3488)
distance.to_kilometers # => 9715.470491159029
distance.to_meters # => 9715470.491159027
distance.to_miles # => 6032.710918698025
distance.to_feet # => 31852713.65072557
distance.to_nautical_miles # => 5242.2799481204265
If you have latitude/longitude pairs stored in an array or tuple, you can alternately provide two arrays/tuples when calling Haversine.distance
:
london = [51.500153, -0.126236]
new_york = [40.714268, -74.005974]
distance = Haversine.distance(new_york, london)
distance.to_kilometers # => 5570.482153929098
london = {51.500153, -0.126236}
new_york = {40.714268, -74.005974}
distance = Haversine.distance(new_york, london)
distance.to_kilometers # => 5570.482153929098
https://www.movable-type.co.uk/scripts/latlong.html
Also you can compare Haversine::Distance
objects:
london = [51.500153, -0.126236]
new_york = [40.714268, -74.005974]
shanghai = [31.222220, 121.458060]
distance1 = Haversine.distance(london, new_york)
distance2 = Haversine.distance(london, shanghai)
distance1 < distance2 # => true
Takes the starting point by latitude
, longitude
and calculates the location of a destination point
given a distance
factor in degrees, radians, miles, or kilometers; and bearing
in degrees.
Haversine.destination(39, -75, 5000, 90, :kilometers)
# => {26.440010707631124, -22.885355549364313}
- Fork it (https://github.com/geocrystal/haversine/fork)
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request
- Anton Maminov - creator and maintainer