在MySQL数据库中存储经度/纬度时,理想的数据类型是什么?

时间:2020-03-06 14:59:36  来源:igfitidea点击:

请记住,我将在经纬度对上执行计算,哪种数据类型最适合与MySQL数据库一起使用?

解决方案

在GIS中使用MySQL的空间扩展。

" FLOAT"应该为我们提供所需的所有精度,并且比起将每个坐标存储为字符串等,它对比较函数而言要更好。

如果MySQL版本低于5.0.3,则可能需要注意某些浮点比较错误。

Prior to MySQL 5.0.3, DECIMAL columns store values with exact precision because they are represented as strings, but calculations on DECIMAL values are done using floating-point operations. As of 5.0.3, MySQL performs DECIMAL operations with a precision of 64 decimal digits, which should solve most common inaccuracy problems when it comes to DECIMAL columns

Lat Long计算需要精度,因此请使用某种类型的十进制类型,并使精度至少比要存储的数字高2以便执行数学计算。我不知道我的sql数据类型,但是在SQL Server中,人们经常使用float或者real而不是小数,并且遇到麻烦,因为这些是估计数字,而不是实际数字。因此,只需确保使用的数据类型是真正的十进制类型,而不是浮点十进制类型,就可以了。

当我对使用ARINC424构建的导航数据库进行此操作时,我进行了大量测试并回顾了代码,我使用了DECIMAL(18,12)(实际上是NUMERIC(18,12),因为它是火鸟)。

浮点数和双精度数不够精确,可能会导致舍入错误,这可能是非常糟糕的事情。我不记得我是否发现任何有问题的真实数据,但是我相当确定不能正确地以浮点数或者双精度数存储数据会导致问题

关键是,使用度或者弧度时,我们知道值的范围,小数部分需要最多的数字。

MySQL Spatial Extensions是一个很好的选择,因为它们遵循OpenGIS Geometry Model。我之所以没有使用它们,是因为我需要保持数据库的可移植性。

MySQL的Spatial Extensions是最佳选择,因为我们可以使用完整的空间运算符和索引列表。空间索引使我们可以非常快速地执行基于距离的计算。请记住,从6.0开始,空间扩展仍不完整。我并没有放弃MySQL Spatial,只是让我们知道了陷阱,然后再进行深入的探讨。

如果我们仅在处理点并且仅处理DISTANCE函数,则可以。如果需要使用多边形,直线或者缓冲点进行任何计算,除非我们使用"关系"运算符,否则空间运算符不会提供确切的结果。请参阅21.5.6顶部的警告。包含,内部或者相交之类的关系使用的是MBR,而不是确切的几何形状(即,椭圆被视为矩形)。

另外,MySQL Spatial中的距离与第一个几何图形的单位相同。这意味着,如果我们使用的是小数度,则距离的测量单位为小数度。当我们从赤道上走远时,这将很难获得准确的结果。

我们将纬度/经度X 1,000,000作为数字存储在oracle数据库中,以避免出现双精度取整错误。

鉴于到小数点后第六位的经度/纬度为10厘米,这是我们所需要的。许多其他数据库还存储纬度/经度到小数点后第六位。

与MySQL空间函数相比,PostGIS中的空间函数具有更多的功能(即,不受限于BBOX操作)。签出:链接文本

根据应用程序,我建议使用FLOAT(9,6)

空间键将为我们提供更多功能,但按生产基准测试,浮标比空间键要快得多。 (AVG中的0,01 VS 0,001)