2009-08-22 12 views
5

Potrzebuję przeanalizować niektóre przesłane przez użytkownika ciągi zawierające szerokości i długości pod Ruby.Parsowanie szerokości i długości geograficznej z Ruby

Wynik powinien być podany w podwójnej

Przykład:

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

Wynik:

8.080278 9.22 

Szukałem zarówno Geokit i GeoRuby ale nie znalazłem rozwiązania . Jakaś wskazówka?

Odpowiedz

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: albo aby uzyskać wynik w postaci tablicy pływaków:

"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

Dzięki! Przyjmuję tę elegancką odpowiedź! Spodziewałem się jednak pewnego rodzaju biblioteki, która potrafi analizować inne formaty lub odmiany. Drobne poprawki w regexp zrobi! Jeszcze raz dziękuję! – rubenfonseca

4

Jak o użyciu wyrażenia regularnego? Np:

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 

Oto bardziej skomplikowana wersja, która radzi sobie z negatywnymi współrzędnymi:

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

dobre rozwiązanie. Dziękuję Ci! – rubenfonseca

1

podstawie postaci pytania, spodziewasz rozwiązanie do obsługi ujemne współrzędne poprawnie. Jeśli nie byłbyś, to spodziewalibyście się N lub S po szerokości geograficznej i E lub W po długości geograficznej.

Należy pamiętać, że przyjęte rozwiązanie spowoduje, że nie będzie zawierało prawidłowych wyników o współrzędnych ujemnych o wartości. Tylko stopnie będą ujemne, a minuty i sekundy będą dodatnie. W przypadkach, gdy stopnie są ujemne, minuty i sekundy przesuwają współrzędną bliżej 0 ° zamiast dalej od 0 °.

Czy drugie rozwiązanie Harrisa jest lepszym rozwiązaniem.

Powodzenia!

Powiązane problemy