用于在 MySQL 中存储地理位置数据的十进制或点数据类型

Pra*_*hat 11 mysql spatial mysql-5.6

我想在我的 MySQL(Innodb)“tblAddress”表中存储每个地址的地理位置,我想我有两个选项:

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT
Run Code Online (Sandbox Code Playgroud)

我的程序需要从当前位置(移动客户端)找到所有落在 1 公里半径范围内的地址。

下面的命令也对我不起作用,不确定我需要什么。

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);
Run Code Online (Sandbox Code Playgroud)

那么在这里存储数据以加快计算和检索的建议方法是什么。请指教。

oNa*_*are 10

您可以将 MySQL 的空间扩展与 GIS 结合使用。

谷歌在地图上显示点的代码示例中,它们声明:

创建 MySQL 表时,要特别注意 lat 和 lng 属性。使用 Google 地图当前的缩放功能,您应该只需要小数点后 6 位的精度。

为了将我们的表所需的存储空间保持在最低限度,您可以指定 lat 和 lng 属性是大小为 (10,6) 的浮点数。这将使字段存储小数点后 6 位数字,加上小数点前最多 4 位数字,例如 -123.456789 度我不会担心数字类型之间的性能差异。体面的指数将产生更大的影响。

您也可以DECIMAL按照@gandaliter 的建议尝试。

DECIMAL是用于精确算术的 MySQL 数据类型。与FLOAT它的精度对于任何大小的数字都是固定的不同,因此通过使用它代替FLOAT您可以在进行某些计算时避免精度错误。如果您只是在没有计算的情况下存储和检索数字,那么实际上FLOAT 是安全的,尽管使用DECIMAL. 用计算FLOAT还是可以的,但要绝对确定 8d.p。您应该使用的精度DECIMAL

纬度范围从 -90 到 +90(度),因此DECIMAL(10,8)可以,但经度范围从 -180 到 +180(度),因此您需要 DECIMAL(11,8). 第一个数字是存储的总位数,第二个数字是小数点后的数字。简而言之:lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL 解释了 MySQL 如何处理浮点数据类型。

相关信息: