تحليل خطوط الطول والعرض مع روبي
-
19-09-2019 - |
سؤال
أحتاج إلى تحليل بعض السلاسل المقدمة من المستخدم التي تحتوي على خطوط العرض والطول، تحت روبي.
يجب إعطاء النتيجة في ضعف
مثال:
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 درجة.
هل سيعمل الحل الهاريس الثاني هو أفضل طريقة للذهاب.
حظ سعيد!