Is there any way to get it somewhere ? don't want to re-re-code such
useful utility ?
I am using Geokit::Geoloc output lat / lng as decimal degrees , but
need to display the sexagesimal position
thanks for your suggestions
erwin
Is there any way to get it somewhere ? don't want to re-re-code such
useful utility ?
I am using Geokit::Geoloc output lat / lng as decimal degrees , but
need to display the sexagesimal position
thanks for your suggestions
erwin
In case other people run into this problem like I did today...here is
some ruby code to do the job when provided with decimal longitude and
latitude numbers.
For example, a latitude of 41.886256 and -87.644723 will spit out: 41˚
53' 10" N, 87˚ 38' 41" E
def self.sexagesimal_coordinates(latitude, longitude)
planes = ["latitude", "longitude"]
formatted_coordinates = planes.map do |plane|
if plane == "latitude"
coordinate = latitude.to_f
coordinate_direction = coordinate > 0 ? "N" : "S"
else
coordinate = longitude.to_f
coordinate_direction = coordinate > 0 ? "W" : "E"
end
coordinate = coordinate.abs
coordinate_whole = coordinate.to_i
coordinate_decimal = coordinate - coordinate_whole
minutes = coordinate_decimal * 60
minutes_whole = minutes.to_i
minutes_decimal = minutes - minutes_whole
seconds = (minutes_decimal * 60).to_i
coordinate_formatted = "#{coordinate_whole}\u{02DA}
#{minutes_whole}' #{seconds}\" #{coordinate_direction}"
end
return formatted_coordinates.join(", ")
end
--
Posted via http://www.ruby-forum.com/.
Ryan Francis wrote in post #1121060:
In case other people run into this problem like I did today...here is
some ruby code to do the job when provided with decimal longitude and
latitude numbers.For example, a latitude of 41.886256 and -87.644723 will spit out: 41˚
53' 10" N, 87˚ 38' 41" ECall method with: YourClass.sexagesimal_coordinates(41.886256,
-87.644723)
Ooh, another mental gymnastics puzzle! Here's a refactor of the same
code, using shorter variable names (and fewer of them). Also no more
strings-as-identifiers. Oh and I rounded the seconds instead of
truncating them, so I get 41° 53' 11" N.
def self.sexagesimal_coordinates(latitude, longitude)
planes = [[latitude,'N','S'], [longitude,'E','W']]
planes.map do |coord, dir_pos, dir_neg|
coord = coord.to_f
dir = coord > 0 ? dir_pos : dir_neg
deg, rem = coord.abs.divmod 1
min, rem = (rem * 60).divmod 1
sec = (rem * 60).round
"#{deg}\u{02DA} #{min}' #{sec}\" #{dir}"
end.join ', '
end
--
Posted via http://www.ruby-forum.com/\.
def to_degrees_min_sec d
time =
[ 3600, 60, 1 ].inject((d*3600).abs.to_i) { |n,u| time << n / u; n % u }
time
end
def direction n, pos, neg
n > 0 ? pos : neg
end
def sexagesimal_coordinates latitude, longitude
dNS = direction latitude, "N", "S"
dEW = direction longitude, "E", "W"
dN, mN, sN = to_degrees_min_sec latitude
dW, mW, sW = to_degrees_min_sec longitude
"#{dN}\u{02DA} #{mN}' #{sN}\" #{dNS}, #{dW}\u{02DA} #{mW}' #{sW}\" #{dEW}"
end
On Sep 9, 2013, at 19:25 , Matthew Kerwin <lists@ruby-forum.com> wrote:
Ryan Francis wrote in post #1121060:
In case other people run into this problem like I did today...here is
some ruby code to do the job when provided with decimal longitude and
latitude numbers.For example, a latitude of 41.886256 and -87.644723 will spit out: 41˚
53' 10" N, 87˚ 38' 41" ECall method with: YourClass.sexagesimal_coordinates(41.886256,
-87.644723)Ooh, another mental gymnastics puzzle! Here's a refactor of the same
code, using shorter variable names (and fewer of them). Also no more
strings-as-identifiers. Oh and I rounded the seconds instead of
truncating them, so I get 41° 53' 11" N.def self.sexagesimal_coordinates(latitude, longitude)
planes = [[latitude,'N','S'], [longitude,'E','W']]
planes.map do |coord, dir_pos, dir_neg|
coord = coord.to_f
dir = coord > 0 ? dir_pos : dir_neg
deg, rem = coord.abs.divmod 1
min, rem = (rem * 60).divmod 1
sec = (rem * 60).round
"#{deg}\u{02DA} #{min}' #{sec}\" #{dir}"
end.join ', '
end
Matthew Kerwin wrote in post #1121063:
Ryan Francis wrote in post #1121060:
In case other people run into this problem like I did today...here is
some ruby code to do the job when provided with decimal longitude and
latitude numbers.For example, a latitude of 41.886256 and -87.644723 will spit out: 41˚
53' 10" N, 87˚ 38' 41" ECall method with: YourClass.sexagesimal_coordinates(41.886256,
-87.644723)Ooh, another mental gymnastics puzzle! Here's a refactor of the same
code, using shorter variable names (and fewer of them). Also no more
strings-as-identifiers. Oh and I rounded the seconds instead of
truncating them, so I get 41° 53' 11" N.def self.sexagesimal_coordinates(latitude, longitude)
planes = [[latitude,'N','S'], [longitude,'E','W']]
planes.map do |coord, dir_pos, dir_neg|
coord = coord.to_f
dir = coord > 0 ? dir_pos : dir_neg
deg, rem = coord.abs.divmod 1
min, rem = (rem * 60).divmod 1
sec = (rem * 60).round
"#{deg}\u{02DA} #{min}' #{sec}\" #{dir}"
end.join ', '
end
Ah, brilliant! Thanks for the refactor and good find with rounding the
seconds instead of truncating. I've never used divmod before, but it
certainly is the method for the job. Thanks again, Matthew.
--
Posted via http://www.ruby-forum.com/\.