我知道 postgres 有一种用于存储地理坐标的数据类型。但我正在寻找与 RDBMS 无关的解决方案。目前我在 MySQL 中使用 Decimal(25,20)。稍后我可能会使用这些数据根据与给定位置的给定距离来查找这些位置。哪种方法是存储此类数据的最佳方法?
6 回答
另一种好的技术是将这些值乘以一个常数并将它们存储为整数值。仅使用整数也有助于加快计算速度。
除非您非常需要精度,否则您实际上只需要在小数点后存储 5+ 个值。
此纬度经度数据存储规范提供了一个显示精度与小数位的图表。
# decmal places, example, precision
5 51.22135 ± 0.8 m
6 50.895132 ± 0.08 m
7 将计算为 8 毫米,或约 0.314 英寸。
AFAIK,MS SQL Server 2008 支持将 GeoLocations 作为数据类型。我知道您正在使用 MySQL,但只是想我会在这个问题上提到它。
vfilby 的答案可能是最好的答案,但是许多 RDBMS 对索引字符字段的支持比索引密集整数(或浮点)字段更好。
仅出于这个原因,我可能会建议首先转换数据:如果您想找到“接近”另一个值的值,您还需要一个保留此值的函数 - 也许通过转换为 base36 和 -_
填充到小数点,但是如果您只需要完全匹配,几乎任何快速散列函数都可以。
再说一遍:如果您没有大量数据,或者您没有使用这样的 RDBMS,请执行vfilby 建议的操作。
按照@vfilby 的回答,为什么不将数字的两半存储为两个单独的 int 类型?
我一直只是用 4 字节的浮点列来保存经纬度,因为精度上的误差远小于我们使用的设备的精度。您的应用程序可能不是这种情况,但如果是这种情况,您将无法获得比浮点数更多的 RDBMS 不可知论。