Odległość między dwoma współrzędnymi na Ziemi jest zwykle obliczana za pomocą Haversine formula. Ta formuła uwzględnia kształt i promień ziemi. Jest to kod, którego używam do obliczania odległości w metrach.
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
Formuła Haversine jest również używana w [Geocoder] (http://rubygems.org/gems/geocoder), patrz plik [calculations.rb] (https: //github.com/alexreisner/geocoder/blob/master/lib/geocoder/calculations.rb#L72). –
Ta metoda modyfikuje wartości 'a' i' b', co jest nieoczekiwane. Domyślam się, że nie trzeba używać '.map!' Zamiast '.map' lub ponownie używać' a'. – joscas
Edytowane tak, aby już nie było. – Lunivore