使用Ruby解析纬度和经度

6

我需要在Ruby中解析一些包含纬度和经度的用户提交字符串。

结果应该以double类型给出。

例如:

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

结果:

8.080278 9.22

我查看了Geokit和GeoRuby,但都没有找到解决方案。有什么提示吗?

2个回答

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

谢谢!我将接受这个优美的答案!但是,我在期望能够解析其他格式或变体的某种库。对正则表达式进行一点调整就可以了!再次感谢你! - rubenfonseca
根据您的问题形式,您希望解决方案正确处理负坐标。如果不是这样,那么您会期望纬度后面跟着N或S,经度后面跟着E或W。请注意,接受的解决方案将无法正确处理负坐标。只有度数为负,而分和秒为正。在度数为负的情况下,分和秒将使坐标更靠近0°而不是远离0°。威尔·哈里斯的第二个解决方案是更好的选择。 - metaclass

4
使用正则表达式怎么样?例如:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接