2009-08-22 45 views
5

Tôi cần phải phân tích cú pháp một số chuỗi do người dùng gửi có chứa vĩ độ và kinh độ, trong Ruby.Phân tích vĩ độ và kinh độ với Ruby

Kết quả sẽ được đưa ra trong một đôi

Ví dụ:

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

Kết quả:

8.080278 9.22 

Tôi đã nhìn vào cả hai Geokit và GeoRuby nhưng đã không tìm thấy một giải pháp . Bất kỳ gợi ý nào?

Trả lời

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: hoặc để có được kết quả như một mảng phao:

"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

Cảm ơn! Tôi sẽ chấp nhận câu trả lời thanh lịch này! Tuy nhiên, tôi đã mong đợi một số loại thư viện có thể phân tích các định dạng hoặc biến thể khác. Một chút tinh chỉnh trên regexp sẽ làm! Cám ơn bạn một lần nữa! – rubenfonseca

4

Làm thế nào về việc sử dụng một biểu thức chính quy? Ví dụ:

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 

Dưới đây là một phiên bản phức tạp hơn mà phản ứng với tọa độ tiêu cực:

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

giải pháp tốt quá. Cảm ơn bạn! – rubenfonseca

1

Dựa trên các hình thức câu hỏi của bạn, bạn đang mong đợi các giải pháp để xử lý các tọa độ tiêu cực một cách chính xác. Nếu bạn không, thì bạn sẽ mong đợi một N hoặc S theo vĩ độ và một E hoặc W theo kinh độ.

Xin lưu ý rằng giải pháp được chấp nhận sẽ không cung cấp kết quả chính xác với tọa độ phủ định. Chỉ các độ sẽ là âm, và phút và giây sẽ dương. Trong những trường hợp có độ âm, số phút và giây sẽ di chuyển tọa độ gần 0 ° hơn là xa hơn 0 °.

Giải pháp thứ hai của Harris là cách tốt hơn để thực hiện.

Chúc may mắn!

Các vấn đề liên quan