पृथ्वी पर दो निर्देशांक के बीच की दूरी आमतौर पर Haversine formula का उपयोग करके गणना की जाती है। यह सूत्र पृथ्वी के आकार और त्रिज्या को ध्यान में रखता है। यह वह कोड है जिसका उपयोग मैं मीटर में दूरी की गणना करने के लिए करता हूं।
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
स्रोत
2012-10-19 07:43:53
हावर्सिन फॉर्मूला का उपयोग [जियोकोडर] (http://rubygems.org/gems/geocoder) में भी किया जाता है, फ़ाइल [गणना.आरबी] (https: //github.com/alexreisner/geocoder/blob/master/lib/geocoder/calculations.rb#L72)। –
यह विधि 'ए' और' बी' के मानों को संशोधित करती है जो अप्रत्याशित है। मुझे लगता है कि '.map' के बजाय' .map! 'का उपयोग करने या फिर' ए 'का पुन: उपयोग करने की आवश्यकता नहीं है। – joscas
संपादित किया गया है कि अब नहीं होता है। – Lunivore