纬度/经度8位小数应使用哪种MySQL数据types?

我正在处理地图数据, Latitude/Longitude延伸到小数点后8位。 例如:

 Latitude 40.71727401 Longitude -74.00898606 

我在Google文档中看到了哪些使用:

 lat FLOAT( 10, 6 ) NOT NULL, lng FLOAT( 10, 6 ) NOT NULL 

但是,他们的小数位只有6。
我应该使用FLOAT(10, 8)还是有另一种方法来考虑存储这些数据,因此它是精确的。 它将用于地图计算。 谢谢!

DECIMAL是用于精确算术的MySQL数据types。 与FLOAT不同的是,它的精度是固定的任何数量的大小,所以通过使用它而不是FLOAT你可能会避免精确度的错误,当做一些计算。 如果您只是在没有计算的情况下存储和检索数字,那么在实践中FLOAT将是安全的,尽pipe使用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如何使用浮点数据types。

另外,你会看到四舍五入的值。

 //例如:给定值41.0473112,29.0077011

浮动(11,7)| 十进制(11,7)
 ---------------------------
 41.0473099 |  41.0473112
 29.0077019 |  29.0077011

您可以将您的数据types设置为有符号整数。 将坐标存储到SQL时,可以将其设置为lat * 10000000和long * 10000000。 而当你select距离/半径时,你将把存储坐标分为10000000.我用300K行进行testing,查询响应时间很好。 (2 x 2.67GHz CPU,2 GB RAM,MySQL 5.5.49)

在rails上使用ruby迁移

 class CreateNeighborhoods < ActiveRecord::Migration[5.0] def change create_table :neighborhoods do |t| t.string :name t.decimal :latitude, precision: 15, scale: 13 t.decimal :longitude, precision: 15, scale: 13 t.references :country, foreign_key: true t.references :state, foreign_key: true t.references :city, foreign_key: true t.timestamps end end end