【问题标题】:Most efficient way for storing geolocations in a database在数据库中存储地理位置的最有效方法
【发布时间】:2010-09-22 13:56:33
【问题描述】:

我知道 postgres 有一种用于存储地理坐标的数据类型。但我正在寻找与 RDBMS 无关的解决方案。目前我在 MySQL 中使用 Decimal(25,20) 。稍后我可能会使用这些数据根据与给定位置的给定距离来查找这些位置。存储此类数据的最佳方法是什么?

【问题讨论】:

    标签: database geolocation geocoding


    【解决方案1】:

    vfilby's answer 可能是最好的一个,但是许多 RDBMS 对索引 character 字段的支持比索引 dense 整数(或浮点)字段更好。

    仅出于这个原因,我可能会建议首先转换数据:如果您想找到“接近”另一个值的值,您还需要一个保留此值的函数 - 也许通过转换为 base36 和 _-padding到小数点,但如果您只需要精确匹配,几乎任何快速散列函数都可以。

    再次重申:如果您没有大量数据,或者您没有使用这样的 RDBMS,请执行 vfilby suggested 操作。

    【讨论】:

      【解决方案2】:

      我一直只是用4字节的浮点列来保存经纬度,因为精度上的误差远小于我们使用的设备的精度。您的应用程序可能不是这种情况,但如果是这种情况,您将无法获得比浮点数更多的 RDBMS 不可知论。

      【讨论】:

        【解决方案3】:

        AFAIK,MS SQL Server 2008 支持将 GeoLocations 作为数据类型。我知道您使用的是 MySQL,但只是想我会在这个问题上提及它。

        【讨论】:

        • 数据类型是 GEOGRAPHY 和 GEOMETRY。他会想使用 GEOGRAPHY。
        【解决方案4】:

        按照@vfilby's 的回答,为什么不将数字的两半存储为两个独立的 int 类型?

        【讨论】:

          【解决方案5】:

          另一个很好的技术是将这些值乘以一个常数并将它们存储为整数值。仅使用整数也有助于加快计算速度。

          除非您非常需要精度,否则您实际上只需要在小数点后存储 5+ 个值。

          Latitude Longitude Data Storage Specification 给出了一个显示精度与小数位的图表。

          # decmal places, example, precision
          5    51.22135    ± 0.8 m
          6   50.895132   ± 0.08 m
          

          7 等于 8 毫米,或大约 0.314 英寸。

          【讨论】:

            【解决方案6】:

            标准是here。尽管对于像您这样的简单用例来说太多了,但它可能会让您了解为什么实际上最好去使用许多数据库现在拥有的一些符合 OGC 的包,甚至是 MySQL

            如果做不到这一点,并且假设您将实现距离计算的算法,那么任何具有您需要的精度的浮点数都可以工作。

            【讨论】:

              猜你喜欢
              • 2011-10-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-06
              • 1970-01-01
              • 1970-01-01
              • 2013-06-09
              相关资源
              最近更新 更多