문제

루비 아래에 위도와 종단이 포함 된 일부 사용자 제출 문자열을 구문 분석해야합니다.

결과는 두 배로 제공되어야합니다

예시:

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 °에 가깝게 이동합니다.

윌 해리스의 두 번째 솔루션은 더 나은 방법입니다.

행운을 빕니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top