Rails 3浮点数或十进制表示GPS坐标

时间:2012-06-14 21:47:14

标签: ruby-on-rails floating-point decimal-point

我需要将GPS坐标存储在数据库中。我听说漂浮物不如小数精确。真的吗?如果是这样,有什么理由可以使用花车?

4 个答案:

答案 0 :(得分:26)

由于地球赤道周长 40000 km 且经度跨度 360度,因此接近赤道 1度相当于<强>大约110公里。

因此:

  • 0位精度:±110 km
  • 1位精度:±11 km
  • 2位精度:±1.1 km
  • 3位精度:±110 m
  • 4位精度:±11 m
  • 5位精度:±1.1 m
  • 6位精度:±11 cm
  • 7位精度:±1.1 cm

但是,移动到波兰人越近,平行线的长度就越小。 例如,在 Paris 附近,纬度为48度,1度相当于cos(48) * 110 = 74 km

因此:

  • 0位精度:±74 km
  • 1位精度:±7.4 km
  • 2位精度:±0.74 km
  • 3位精度:±74 m
  • 4位精度:±7.4 m
  • 5位精度:±0.74 m
  • 6位精度:±7.4 cm
  • 7位精度:±0.74 cm

因此,类型DECIMAL(10,7)的字段足以让您满意。

答案 1 :(得分:13)

如果你想要更准确的GPS坐标,那么是小数点是要走的路。您可以使用以下迁移创建它们:

create_table "models" do |t|
  t.decimal  "latitude", :precision => 15, :scale => 10, :default => 0.0
  t.decimal  "longitude", :precision => 15, :scale => 10, :default => 0.0
end

人们使用花车的原因是它们通常对于大多数用例来说足够精确,并且占用的空间较少。

答案 2 :(得分:1)

如果你想要小数的100%准确度,那么乘以10 ** n(其中n是你想要的精度),并存储为整数。

Float对象使用本机架构的双精度浮点表示来表示不精确的实数。

请参阅:

http://www.ruby-doc.org/core-1.9.3/Float.html

答案 3 :(得分:1)

正如你在保罗的回答中所看到的,这取决于你的用例 浮点数提供大约6位十进制数字的精度 例如,一个地址,±11厘米是完全可以接受的。如果你正在显示地址,那么你不太可能进行任何会导致舍入错误的算术运算。