# kristianmandrup/haversine

nice improvements by @ryangreenberg

kristianmandrup committed Jun 5, 2011
2 parents 00bd23b + b464f1b commit 3dcfe843c2f600e29bf6399087682e3fd4aa8217
Showing with 143 additions and 166 deletions.
1. +33 −15 README.textile
2. +1 −1 Rakefile
3. +22 −113 lib/haversine.rb
4. +0 −19 lib/haversine/core_ext.rb
5. +40 −0 lib/haversine/distance.rb
6. +19 −0 spec/distance_spec.rb
7. +28 −18 spec/haversine_spec.rb
 @@ -1,33 +1,52 @@ -h1. Haversine - geo distance calculations +h1. Haversine Distance -Calculates the haversine distance between two locations using longitude and latitude. -This is done using Math formulas without resorting to Active Record or SQL DB functionality +This gem calculates the Haversine distance between two points given their longitude and latitude. This is done using trigonometry without ActiveRecord or SQL. See http://en.wikipedia.org/wiki/Haversine_formula for details on the Haversine formula. -This is meant to ba a replacement for all those geocode and geolocation utils out there that use built in SQL DB functionality for their calculations! +This is a replacement for all geo libraries that use built-in SQL DB functionality for their calculations. h2. Install & Usage -
require 'haversine'
+Install this gem with @gem install haversine@. Calling @Haversine.distance@ with four lat/lon coordinates returns a @Haversine::Distance@ object which can provide output in kilometers, meters, miles, or feet.

-it "should work" do
-  lon1 = -104.88544
-  lat1 = 39.06546
+
+require 'haversine'

-  lon2 = -104.80
-  lat2 = lat1
+distance = Haversine.distance(35.61488, 139.5813, 48.85341, 2.3488)

-  dist = Haversine.distance( lat1, lon1, lat2, lon2 )
+distance.class => Haversine::Distance
+distance.to_miles => 6032.71091869803
+distance.to_kilometers => 9715.47049115903
+distance.to_meters => 9715470.49115903
+distance.to_feet => 31852713.6507256
+
+ +Convenience aliases for the measurements exist: +
+distance.to_kilometers == distance.to_km
+distance.to_meters == distance.to_m
+distance.to_miles == distance.to_mi
+distance.to_feet == distance.to_ft
+
- puts "the distance from #{lat1}, #{lon1} to #{lat2}, #{lon2} is: #{dist[:meters].number} meters" +Note that @to_m@ is the distance in meters, not miles. puts "#{dist[:feet]}" puts "#{dist.meters}" puts "#{dist[:km]}" puts "#{dist[:miles]}" + puts "#{dist.to_mi}" puts "#{dist.to_miles_}" dist[:km].to_s.should match(/7\.376*/) - dist.to_kms.to_s.should match(/7\.376*/) + dist.to_km.to_s.should match(/7\.376*/) end + +If you have lat/lon pairs stored in an array, you can alternately provide two arrays when calling @Haversine.distance@: + +
+require 'haversine'
+new_york_city = [40.71427, -74.00597]
+santiago_chile = [-33.42628, -70.56656]
+Haversine.distance(new_york_city, santiago_chile).to_miles => 5123.73
Note: Haversine is used in the "geo_magic":https://github.com/kristianmandrup/geo_magic gem @@ -45,5 +64,4 @@ h2. Contributing to haversine h2. Copyright Copyright (c) 2011 Kristian Mandrup. See LICENSE.txt for -further details. - +further details.
 @@ -19,7 +19,7 @@ Jeweler::Tasks.new do |gem| gem.description = %Q{Calculates the haversine distance between two locations using longitude and latitude. This is done using Math formulas without resorting to Active Record or SQL DB functionality} gem.email = "kmandrup@gmail.com" - gem.authors = ["Kristian Mandrup"] + gem.authors = ["Kristian Mandrup", "Ryan Greenberg"] # Include your dependencies below. Runtime dependencies are required when using your gem, # and development dependencies are only needed for development (ie running rake tasks, tests, etc) # gem.add_runtime_dependency 'jabber4r', '> 0.1'