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

Latitude 40.71727401
Longitude -74.00898606

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

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

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


当前回答

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

其他回答

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

$table->decimal('latitude', 10, 8);
$table->decimal('longitude', 11, 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)

我相信在MySQL中存储Lat/Lng的最好方法是有一个POINT列(2D数据类型)和一个SPATIAL索引。

CREATE TABLE `cities` (
  `zip` varchar(8) NOT NULL,
  `country` varchar (2) GENERATED ALWAYS AS (SUBSTRING(`zip`, 1, 2)) STORED,
  `city` varchar(30) NOT NULL,
  `centre` point NOT NULL,
  PRIMARY KEY (`zip`),
  KEY `country` (`country`),
  KEY `city` (`city`),
  SPATIAL KEY `centre` (`centre`)
) ENGINE=InnoDB;


INSERT INTO `cities` (`zip`, `city`, `centre`) VALUES
('CZ-10000', 'Prague', POINT(50.0755381, 14.4378005));

您可以将数据类型设置为有符号整数。当你存储坐标到SQL时,你可以设置为lat*10000000和long*10000000。当你选择距离/半径时,你会把存储坐标划分为10000000。我用300K行进行了测试,查询响应时间很好。(2 * 2.67GHz CPU, 2gb RAM, MySQL 5.5.49)