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?

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top