【问题标题】:Correct datatype for latitude and longitude? (in activerecord)纬度和经度的正确数据类型? (在活动记录中)
【发布时间】:2010-11-14 20:01:35
【问题描述】:

我应该将纬度和经度存储为字符串还是浮点数(或其他东西)?

(如果这很重要,我正在使用 activerecord / ruby​​ on rails)。

更新:

开发中的 Mysql 和生产中的 postgresql(为什么重要?)

【问题讨论】:

标签: ruby-on-rails activerecord types


【解决方案1】:

我建议使用浮点数,尽管它并没有真正产生太大的影响。如果您将来需要浮点数,则更容易计算。

【讨论】:

    【解决方案2】:

    如果你需要做更复杂的地理计算,你可以研究PostGIS for Postgresql 或MySQL Spatial Extensions for MySQL。否则,浮点数(双精度可能是个好主意)应该可以工作。

    编辑:看起来GeoRuby 库包含一个Rails 扩展,用于处理上述两个数据库的空间/GIS 扩展。

    【讨论】:

    • 您可以尝试另一个更受欢迎的库。 geocoder 或结帐github
    【解决方案3】:

    通常您希望 Lat/Long 存储在您拥有的最大浮点类型中。在某些纬度(例如:赤道附近),经度的微小变化可能等同于地表距离的巨大差异。

    我想如果它是一个你永远不想做任何数学运算的字段,你可以使用一个字符串。不过我会避免这种情况。

    【讨论】:

      【解决方案4】:

      如果您没有使用启用空间功能的数据库,Google Maps recommends 使用大小为 (10,6) 的浮点数。这会给你小数点后 6 位数字 - 如果你想要更精确,你可以相应地调整。

      【讨论】:

        【解决方案5】:

        这是我用的:

        add_column :table_name, :lat, :decimal, {:precision=>10, :scale=>6}
        add_column :table_name, :lng, :decimal, {:precision=>10, :scale=>6}
        

        【讨论】:

        • 值应该在区间(-180, 180)之内吧?为什么你的比例不是 7?
        • 来自 Google Maps 文档:“为了将表所需的存储空间保持在最低限度,您可以指定 lat 和 lng 属性是大小为 (10,6) 的浮点数”
        【解决方案6】:

        由于它们是固定精度,您应该转换并存储为整数以显着提高性能。

        (见http://www.postgresql.org/docs/9.1/static/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL

        【讨论】:

          猜你喜欢
          • 2010-09-27
          • 1970-01-01
          • 2021-06-08
          • 2021-04-30
          • 2011-12-30
          • 2012-12-01
          • 2012-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多