Pregunta

Necesito analizar algunas cadenas enviados por el usuario que contienen las latitudes y longitudes, en virtud de Ruby.

El resultado se debe dar en un doble

Ejemplo:

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

Resultados:

8.080278 9.22

He mirado a ambos Geokit y GeoRuby pero no han encontrado una solución. Cualquier indicio?

¿Fue útil?

Solución

"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: o para obtener el resultado como una matriz de flotadores:

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

Otros consejos

¿Cómo sobre el uso de una expresión regular? Por ejemplo:

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

Aquí hay una versión más compleja que hace frente a las coordenadas negativas:

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

En base a la forma de su pregunta, usted está esperando la solución para manejar correctamente las coordenadas negativas. Si no fuera así, entonces usted estaría esperando una N o S después de latitud y E o W siguiendo la longitud.

Tenga en cuenta que la solución será aceptado no proporciona resultados correctos con una coordenada negativa. Sólo los grados serán negativos, y los minutos y los segundos serán positivos. En aquellos casos en que los grados son negativos, el minuto y segundo se moverán la coordenada más cerca de 0 ° en lugar de más lejos de 0 °.

segunda solución Will Harris es el mejor camino a seguir.

Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top