5

Rubyで、緯度と経度を含むユーザーが送信した文字列を解析する必要があります。

結果はダブルで与える必要があります

例:

08º 04' 49'' 09º 13' 12''

結果:

8.080278 9.22

GeokitとGeoRubyの両方を調べましたが、解決策が見つかりませんでした。ヒントはありますか?

4

3 に答える 3

12
"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"

編集:またはfloatの配列として結果を取得するには:

"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]
于 2009-08-22T22:33:52.383 に答える
4

正規表現を使ってみませんか?例えば:

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
于 2009-08-22T22:38:41.157 に答える
1

質問の形式に基づいて、ソリューションが負の座標を正しく処理することを期待しています。そうでない場合は、緯度に続いてNまたはS、経度に続いてEまたはWを期待することになります。

受け入れられたソリューションは、負の座標では正しい結果を提供しないことに注意してください。度のみが負になり、分と秒は正になります。度が負の場合、分と秒は座標を0°から遠ざけるのではなく、0°に近づけます。

ハリスの2番目の解決策は、より良い方法です。

幸運を!

于 2009-08-25T14:52:01.543 に答える