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


8

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

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

2) One Column for Each Address:
GeoLocation POINT

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

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

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

那么,这里建议使用什么方法来存储数据以便更快地进行计算和检索。请指教。

Answers:


6

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

Google代码示例中,代码在地图上显示点,它们指出:

创建MySQL表时,您要特别注意lat和lng属性。使用Google Maps当前的缩放功能,小数点后只需要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如何使用浮点数据类型。

相关信息:


感谢@oNare提供详细的解释和参考。我确实在问题(stackoverflow.com/questions/12504208/…)中看到了gandaliter的建议。我还在这里看到了ypercube的建议(stackoverflow.com/questions/9560147/…)。
Prabhat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.