Анализ широты и долготы с помощью Ruby
-
19-09-2019 - |
Вопрос
Мне нужно проанализировать некоторые отправленные пользователем строки, содержащие широты и долготы, в Ruby.
Результат должен быть приведен в двойном
Пример:
08º 04' 49'' 09º 13' 12''
Результат:
8.080278 9.22
Я обращался как к Geokit, так и к GeoRuby, но не нашел решения.Есть какой-нибудь намек?
Решение
"08° 04' 49'' 09° 13' 12''".gsub(/(\d+)° (\d+)' (\d+)''/) do
$1.to_f + $2.to_f/60 + $3.to_f/3600
end
#=> "8.08027777777778 9.22"
Редактировать:или получить результат в виде массива чисел с плавающей точкой:
"08° 04' 49'' 09° 13' 12''".scan(/(\d+)° (\d+)' (\d+)''/).map do |d,m,s|
d.to_f + m.to_f/60 + s.to_f/3600
end
#=> [8.08027777777778, 9.22]
Другие советы
Как насчет использования регулярного выражения?Например:
def latlong(dms_pair)
match = dms_pair.match(/(\d\d)º (\d\d)' (\d\d)'' (\d\d)º (\d\d)' (\d\d)''/)
latitude = match[1].to_f + match[2].to_f / 60 + match[3].to_f / 3600
longitude = match[4].to_f + match[5].to_f / 60 + match[6].to_f / 3600
{:latitude=>latitude, :longitude=>longitude}
end
Вот более сложная версия, которая справляется с отрицательными координатами:
def dms_to_degrees(d, m, s)
degrees = d
fractional = m / 60 + s / 3600
if d > 0
degrees + fractional
else
degrees - fractional
end
end
def latlong(dms_pair)
match = dms_pair.match(/(-?\d+)º (\d+)' (\d+)'' (-?\d+)º (\d+)' (\d+)''/)
latitude = dms_to_degrees(*match[1..3].map {|x| x.to_f})
longitude = dms_to_degrees(*match[4..6].map {|x| x.to_f})
{:latitude=>latitude, :longitude=>longitude}
end
Исходя из формы вашего вопроса, вы ожидаете, что решение правильно обработает отрицательные координаты.Если бы это было не так, то вы бы ожидали N или S после широты и E или W после долготы.
Пожалуйста, обратите внимание, что принятое решение будет не обеспечивает правильных результатов с отрицательной координатой.Только градусы будут отрицательными, а минуты и секунды - положительными.В тех случаях, когда градусы отрицательны, минуты и секунды будут перемещать координату ближе к 0 °, а не дальше от 0 °.
Второе решение Уилла Харриса - лучший путь.
Удачи вам!