我正在处理地图数据,纬度/经度扩展到小数点后8位。例如:
Latitude 40.71727401
Longitude -74.00898606
我在谷歌文档中看到的 它使用:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
但是,它们的小数点后只到6。 我应该使用FLOAT(10,8)还是有其他方法来存储这些数据,以便它是精确的。它将用于地图计算。谢谢!
我正在处理地图数据,纬度/经度扩展到小数点后8位。例如:
Latitude 40.71727401
Longitude -74.00898606
我在谷歌文档中看到的 它使用:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
但是,它们的小数点后只到6。 我应该使用FLOAT(10,8)还是有其他方法来存储这些数据,以便它是精确的。它将用于地图计算。谢谢!
当前回答
我相信在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));
其他回答
你应该简单地使用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
此外,您将看到浮点值是四舍五入的。
// e.g: given values 41.0473112,29.0077011 float(11,7) | decimal(11,7) --------------------------- 41.0473099 | 41.0473112 29.0077019 | 29.0077011
CREATE TABLE your_table_name (
lattitude REAL,
longitude REAL
)
也可以考虑在你的lat, long声明中添加进一步的验证:
CREATE TABLE your_table_name (
lattitude REAL CHECK(lattitude IS NULL OR (lattitude >= -90 AND lattitude <= 90)),
longitude REAL CHECK(longitude IS NULL OR (longitude >= -180 AND longitude <= 180))
)
解释: https://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html
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));