루비와의 위도와 경도를 구문 분석합니다
-
19-09-2019 - |
문제
루비 아래에 위도와 종단이 포함 된 일부 사용자 제출 문자열을 구문 분석해야합니다.
결과는 두 배로 제공되어야합니다
예시:
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 °에 가깝게 이동합니다.
윌 해리스의 두 번째 솔루션은 더 나은 방법입니다.
행운을 빕니다!
제휴하지 않습니다 StackOverflow