我知道postgres有一个用于存储地理坐标的数据类型。但我正在寻找一种RDBMS不可知解决方案。目前我在MySQL中使用Decimal(25,20)。我可能正在使用此数据来根据稍后给定位置的给定距离来查找这些位置。这是存储此类数据的最佳方法吗?
答案 0 :(得分:6)
另一个好方法是将值乘以常量并将它们存储为整数值。仅使用整数也可以帮助加速计算。
除非您非常需要精确度,否则您应该只需要在小数点后存储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英寸。
答案 1 :(得分:1)
标准是here。虽然它对于像你这样的简单用例来说太过分了,但它可能会给你一些想法,为什么它实际上最好去使用许多数据库现在的OGC兼容软件包,甚至是MySQL。
如果做错了,假设你将实现距离计算的算法,任何具有你需要的精度的浮点数都可以工作。
答案 2 :(得分:1)
AFAIK,MS SQL Server 2008支持将GeoLocations作为DataType。我知道你在使用MySQL,但我以为我会在这个问题上提到它。
答案 3 :(得分:1)
vfilby's answer可能是最好的,但是许多RDBMS比索引密集整数(或浮点)字段更好地支持索引字符字段。< / p>
仅凭这个原因,我可能会建议首先转换数据:如果你想要找到“接近”另一个值的值,你还需要一个保留它的函数 - 也许转换为base36和_
-padding到小数点,但如果你只需要一个完全匹配,几乎任何快速哈希函数都可以。
再说一遍:如果您没有大量数据,或者您没有使用这样的RDBMS,请执行vfilby suggested。
答案 4 :(得分:0)
关注@ vfilby's回答,为什么不将数字的两半存储为两个单独的int类型?
答案 5 :(得分:0)
我一直只使用4字节浮点列来节省纬度和经度,因为精度误差远小于我们使用的设备的精度。您的应用程序可能不是这种情况,但如果是这样,您就无法获得与浮点数无关的RDBMS。