سؤال

أحتاج إلى تحليل بعض السلاسل المقدمة من المستخدم التي تحتوي على خطوط العرض والطول، تحت روبي.

يجب إعطاء النتيجة في ضعف

مثال:

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

نتيجة:

8.080278 9.22

لقد نظرت إلى كل من Geokit وجوربي ولكن لم أجد حلا. أي تلميح؟

هل كانت مفيدة؟

المحلول

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

تحرير: أو للحصول على النتيجة كصفيف من العوامات:

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

نصائح أخرى

ماذا عن استخدام تعبير منتظم؟ على سبيل المثال:

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

بناء على شكل سؤالك، كنت تتوقع حل التعامل مع الإحداثيات السلبية بشكل صحيح. إذا لم تكن كذلك، فأنت تتوقع N أو تتبع خط العرض الإلكتروني و E أو W يتبع خط الطول.

يرجى ملاحظة أن الحل المقبول سوف لا تقدم النتائج الصحيحة مع تنسيق سلبي. فقط الدرجات ستكون سلبية، والدقائق والثواني ستكون إيجابية. في تلك الحالات التي تكون فيها هذه الدرجات سلبية، ستتحرك الدقائق والثواني الإحداثي أقرب إلى 0 درجة بدلا من الابتعاد عن 0 درجة.

هل سيعمل الحل الهاريس الثاني هو أفضل طريقة للذهاب.

حظ سعيد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top