【发布时间】:2010-09-22 13:56:33
【问题描述】:
我知道 postgres 有一种用于存储地理坐标的数据类型。但我正在寻找与 RDBMS 无关的解决方案。目前我在 MySQL 中使用 Decimal(25,20) 。稍后我可能会使用这些数据根据与给定位置的给定距离来查找这些位置。存储此类数据的最佳方法是什么?
【问题讨论】:
标签: database geolocation geocoding
我知道 postgres 有一种用于存储地理坐标的数据类型。但我正在寻找与 RDBMS 无关的解决方案。目前我在 MySQL 中使用 Decimal(25,20) 。稍后我可能会使用这些数据根据与给定位置的给定距离来查找这些位置。存储此类数据的最佳方法是什么?
【问题讨论】:
标签: database geolocation geocoding
vfilby's answer 可能是最好的一个,但是许多 RDBMS 对索引 character 字段的支持比索引 dense 整数(或浮点)字段更好。
仅出于这个原因,我可能会建议首先转换数据:如果您想找到“接近”另一个值的值,您还需要一个保留此值的函数 - 也许通过转换为 base36 和 _-padding到小数点,但如果您只需要精确匹配,几乎任何快速散列函数都可以。
再次重申:如果您没有大量数据,或者您没有使用这样的 RDBMS,请执行 vfilby suggested 操作。
【讨论】:
我一直只是用4字节的浮点列来保存经纬度,因为精度上的误差远小于我们使用的设备的精度。您的应用程序可能不是这种情况,但如果是这种情况,您将无法获得比浮点数更多的 RDBMS 不可知论。
【讨论】:
AFAIK,MS SQL Server 2008 支持将 GeoLocations 作为数据类型。我知道您使用的是 MySQL,但只是想我会在这个问题上提及它。
【讨论】:
按照@vfilby's 的回答,为什么不将数字的两半存储为两个独立的 int 类型?
【讨论】:
另一个很好的技术是将这些值乘以一个常数并将它们存储为整数值。仅使用整数也有助于加快计算速度。
除非您非常需要精度,否则您实际上只需要在小数点后存储 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 英寸。
【讨论】: