2009-08-22 12 views
5

Ich muss einige Benutzer übergeben Strings mit Breiten- und Längengraden, unter Ruby.Parsing Breite und Länge mit Ruby

Das Ergebnis sollte in einem Doppel

Beispiel gegeben werden:

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

Ergebnis:

8.080278 9.22 

Ich habe sahen beide zu Geokit und GeoRuby aber gefunden haben, keine Lösung . Irgendein Hinweis?

Antwort

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" 

Edit: oder das Ergebnis als ein Array von Schwimmern zu bekommen:

"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

Danke! Ich werde diese elegante Antwort akzeptieren! Ich erwartete jedoch eine Art von Bibliothek, die andere Formate oder Variationen parsen konnte. Ein kleiner Tweak auf dem Regexp wird ausreichen! Danke nochmal! – rubenfonseca

4

Wie über einen regulären Ausdruck? ZB:

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 

Hier ist eine komplexere Version, die mit negativen Koordinaten meistert:

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

gute Lösung auch. Vielen Dank! – rubenfonseca

1

Basierend auf der Form Ihrer Frage, werden Sie die Lösung erwarten richtig negative Koordinaten zu handhaben. Wenn Sie nicht wären, dann würden Sie ein N oder S nach dem Breitengrad und ein E oder W nach dem Längengrad erwarten.

Bitte beachten Sie, dass die akzeptierte Lösung keine korrekten Ergebnisse mit einer negativen Koordinate liefert. Nur die Grade sind negativ und die Minuten und Sekunden sind positiv. In den Fällen, in denen die Grade negativ sind, verschieben die Minuten und Sekunden die Koordinate näher an 0 ° anstatt weiter von 0 ° weg.

Will Harris zweite Lösung ist der bessere Weg zu gehen.

Viel Glück!