我正在处理地图数据,纬度/经度扩展到小数点后8位。例如:

Latitude 40.71727401
Longitude -74.00898606

我在谷歌文档中看到的 它使用:

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

但是,它们的小数点后只到6。 我应该使用FLOAT(10,8)还是有其他方法来存储这些数据,以便它是精确的。它将用于地图计算。谢谢!


当前回答

在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

其他回答

你应该简单地使用varchar (20)

在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

小数点后6位的精度约为16cm,这意味着两个物体之间的距离小于16cm时,它们具有相同的纬度和lng。

同样,在mariadb/mysql中,如果我们有大量的数据用于索引,使用float/double是不理想的,而Point数据类型是数据大小的开销。最好使用十进制或将latlong转换为INT。

使用小数点后6位的小数是一个很好的选择,因为我们可以忽略转换,我们只有16cm的误差,经度在-180到180之间,因此需要比纬度多1位,它在-90到90度之间:

Lat DECIMAL(8,6)
Lng DECIMAL(9,6) 

我们可以延伸到小数点后8位:

Lat DECIMAL(10,8)
Lng DECIMAL(11,8) 

MySQL参考

Mariadb参考

MySQL支持空间数据类型,Point是可以使用的单值类型。例子:

CREATE TABLE `buildings` (
  `coordinate` POINT NOT NULL,
  /* Even from v5.7.5 you can define an index for it */
  SPATIAL INDEX `SPATIAL` (`coordinate`)
) ENGINE=InnoDB;

/* then for insertion you can */
INSERT INTO `buildings` 
(`coordinate`) 
VALUES
(POINT(40.71727401 -74.00898606));

在laravel中使用十进制列类型进行迁移

$table->decimal('latitude', 10, 8);
$table->decimal('longitude', 11, 8);

有关更多信息,请参阅可用的列类型