2009-08-22 7 views
5

Rubyの下で、緯度と経度を含むユーザーの提出された文字列を解析する必要があります。私はGeokitとGeoRubyの両方に見てきましたが、解決策を見つけていないRubyでの緯度と経度の解析

8.080278 9.22 

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

結果:

結果は、二重

例に与えられるべきです。何かヒント?

答えて

11
"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] 
+0

ありがとうございます!私はこのエレガントな答えを受け入れます!しかし、私は他のフォーマットやバリエーションを解析できるライブラリを期待していました。正規表現のちょっとした調整ができます!ありがとうございました! – rubenfonseca

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 
+0

良い解決策もあります。ありがとうございました! – rubenfonseca

1

は、あなたの質問の形式に基づいて、あなたは正確に負の座標を処理するためのソリューションを期待しています。あなたがそうでなかったら、緯度に続いてNまたはS、経度に続いてEまたはWを期待しています。

は、負の座標での正しい結果が得られませんのでご注意ください。度だけが負になり、分と秒は正の値になります。度数が負の場合、分と秒は、0度から離れているのではなく、0度に近い座標に移動します。

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

幸運を祈る!