Parsing latitude et longitude avec Ruby
-
19-09-2019 - |
Question
Je dois analyser des chaînes soumises par l'utilisateur contenant les latitudes et longitudes, sous Ruby.
Le résultat doit être donné dans un double
Exemple:
08º 04' 49'' 09º 13' 12''
Résultat:
8.080278 9.22
Je l'ai regardé à la fois Geokit et GeoRuby mais ne l'ai pas trouvé une solution. Tout indice?
La solution
"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: ou pour obtenir le résultat comme un tableau de flotteurs:
"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]
Autres conseils
Comment l'utilisation d'une expression régulière? Par exemple:
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
Voici une version plus complexe qui fait face à des coordonnées négatives:
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
D'après la forme de votre question, vous attendez la solution pour gérer correctement les coordonnées négatives. Si vous n'étiez pas, vous seriez attendez un N ou S suivant la latitude et E ou W suivant la longitude.
S'il vous plaît noter que la solution retenue sera pas des résultats corrects avec une coordonnée négative. Seuls les degrés seront négatifs, et les minutes et les secondes seront positifs. Dans les cas où les degrés sont négatifs, les minutes et les secondes se déplaceront les coordonnées plus proche de 0 ° plutôt que plus loin de 0 °.
seconde solution de Will Harris est la meilleure façon de procéder.
Bonne chance!