MySql使用Float数据类型存储地理坐标

时间:2013-04-08 18:21:03

标签: mysql google-maps geolocation

我有一个存储经度和纬度坐标的表格(google maps)我将列定义为 float 但是当我尝试插入值-61.45859899999999和10.28289时,它们将被舍入到 - 61.46和10.30。如何修改列以保持数据不变。

我正在使用 mysql toad 。 Under是表格的代码:

CREATE TABLE `tblGeoCodes` (
  `recNo` int(11) NOT NULL AUTO_INCREMENT,
  `longLocation` float(30,2) DEFAULT NULL,
  `latLocation` float(30,2) DEFAULT NULL 

4 个答案:

答案 0 :(得分:13)

您的实施存在两个问题。

将值四舍五入为2位精度的原因是您明确将比例定义为2。

此外,FLOAT是MySQL中不精确的数据类型。

要解决这两个问题,您应该使用具有适当精度和比例的DECIMAL数据类型。

例如,像这样:

CREATE TABLE `tblGeoCodes` (
  `recNo` int(11) NOT NULL AUTO_INCREMENT primary key,
  `longLocation` decimal(18,14) DEFAULT NULL,
  `latLocation` decimal(18,14) DEFAULT NULL
); 

示例:

mysql> CREATE TABLE `tblGeoCodes` (
    ->   `recNo` int(11) NOT NULL AUTO_INCREMENT primary key,
    ->   `longLocation` decimal(18,14) DEFAULT NULL,
    ->   `latLocation` decimal(18,14) DEFAULT NULL
    -> ); 
Query OK, 0 rows affected (0.02 sec)

mysql> 
mysql> insert into tblGeoCodes (longLocation,latLocation) values(-61.45859899999999 , 10.28289);
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> select * from tblGeoCodes;
+-------+--------------------+-------------------+
| recNo | longLocation       | latLocation       |
+-------+--------------------+-------------------+
|     1 | -61.45859899999999 | 10.28289000000000 |
+-------+--------------------+-------------------+
1 row in set (0.00 sec)

答案 1 :(得分:5)

,2中的float(30,2)代表2位小数。我使用float(10,6)因为这足以保持坐标

答案 2 :(得分:0)

我建议转换到MYISAM以利用GSI。它更适合于这个目的,应该表现得更好。

然而,正如已经建议的那样,提高浮点字段的精度可能是一个更简单的解决方案。由于您将问题标记为google-maps,我还建议您在Google的开发网站上使用this tutorial

答案 3 :(得分:0)

请记住,FLOAT(10,6)没有意义,这为整数部分保留4位数。

就个人而言,我更喜欢DOUBLE(9,6),但您可以使用FLOAT来保存4个额外字节。