【问题标题】:MySql using Float Data Type To Store Geographic CoordinatesMySql 使用浮点数据类型来存储地理坐标
【发布时间】:2013-03-30 22:50:14
【问题描述】:

我有一个存储经度和纬度坐标(谷歌地图)的表,我将列定义为 float 但是当我尝试插入值 -61.45859899999999 和 10.28289 时,它们被四舍五入为 - 61.46 和 10.30。如何修改列以按原样保存数据。

我正在使用 mysql 蟾蜍。下面是表格的代码:

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

【问题讨论】:

标签: mysql google-maps geolocation


【解决方案1】:

您的实现存在两个问题。

值都被四舍五入为 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)

【讨论】:

  • 我试过这个,当我插入 -61.45859899999999 时我得到 -61.45860000000000 我怎样才能防止这种情况发生?
【解决方案2】:

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

【讨论】:

  • 嗯,六个小数点在赤道(或任何经线)处大约是 2 英寸,所以如果这足够准确,那么 6 个小数位是可以的。这取决于您使用纬度和经度的目的。
  • 由于 OP 在 Google 地图中使用坐标,并且大多数 GPS 系统精确到大约 10 米,因此 6 位小数就足够了
  • 我会建议,矫枉过正,而不是足够。四个小数点是 18.3 英尺 (5.6 m),因此如果存储 4 而不是 6,可以节省一些空间和一些计算时间。
  • 10 - 6 = 4,符号不算数(来自(未)签名的规范。
【解决方案3】:

我建议转换为 MISAM 以利用 GSI。它更适合该目的,并且性能应该更好。

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

【讨论】:

  • 我是否可以在不四舍五入的情况下插入浮点数?
  • 也许我没有给出最实际的答案。我已经编辑为更有用(我希望)。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2023-03-19
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2018-01-15
    • 2018-08-05
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多