mysql – 地理空间数据的表结构

在包含Geo Spatial数据的MYSQL数据库中构造表的建议方法是什么.作为POC,我正在努力将数据插入数据库表中,如下图所示.

 

以下是Phpmyadmin表创建表创建的快照

寻找建立地理空间数据表的建议,如截图所示.

编辑:我正在使用运行MYSQL版本5.6.16的XAMPP V1.8.3 Windows8.
使用下面的sql创建表格geomduplicate和列以及插入数据

CREATE TABLE geomduplicate1(
zip INTEGER(3) NOT NULL PRIMARY KEY, 
latitude NUMERIC(9,6), 
longitude NUMERIC(10,6),
city VARCHAR(10),
state VARCHAR(2),
county VARCHAR(9)
);
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(501,40.922326,-72.637078,'Holtsville','NY','Suffolk');
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(544,40.922326,-72.637078,'Holtsville','NY','Suffolk');
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(601,18.165273,-66.722583,'Adjuntas','PR','Adjuntas');
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(602,18.393103,-67.180953,'Aguada','PR','Aguada');
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(603,18.455913,-67.14578,'Aguadilla','PR','Aguadilla');
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(604,18.49352,-67.135883,'Aguadilla','PR','Aguadilla');
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(605,18.465162,-67.141486,'Aguadilla','PR','Aguadilla');
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(606,18.172947,-66.944111,'Maricao','PR','Maricao');
REPLACE INTO geomduplicate1(zip,latitude,longitude,city,state,county) VALUES
(610,18.288685,-67.139696,'Anasco','PR','Anasco');

并且数据已成功插入mysql数据库中.

解决方法:

将其存储为geometry data type.MySQL支持几何(通用),以及Point,Linestring和Polygon数据类型,请参阅creating spatial data types.单个经度或纬度值本身不能是几何体,因为您在屏幕中拥有它射击.

如果你使用几何类型的路线,它比你有单独的纬度和经度字段有两个优点:你可以添加一个spatial index,你可以使用一些MySQL’s spatial operator functions,如ST_Buffer,ST_Intersects,ST_Distance进行进一步的分析.空间索引基于R树,并且在非空间列,纬度和经度上的性能远远优于两个B树索引 – 并且这种性能差异将随着表大小的增长而增长.

您仍然可以使用X and Y point functions获取纬度和经度值,这样您就不会因为将数据存储为Point而丢失任何内容.

如果已将数据放在两个单独的lat / lon列中,并且想要使用geometry / point数据类型路由,则可以使用Point函数创建Point数据类型:

alter table mytable add column pt POINT;
update mytable set pt=Point(longitude, latitude);
alter table mytable modify pt POINT NOT NULL;
create spatial index ix_spatial_mytable_pt ON mytable(pt);

请注意,Point函数仅在MySQL 5.1.x中引入(它没有太多文档记录,所以我不确定确切版本),在此之前你必须使用带有GeomFromText函数的concat,参见Moving lat/lon text columns into a ‘point’ type column关于这一点的更多信息,虽然注意到Quassnoi的回答有lon和lat错误的方式 – 它是Point(lon,lat)而不是其他方式,尽管这是一个非常常见的错误.

注意:直到最近,如果使用MyISAM引擎,您只能索引空间列.

编辑:在即将发布的MySQL 5.7.5版本中,InnoDB最终将支持空间数据类型的索引(而不仅仅是存储没有索引的空间类型,这种方式相当不太有用).这意味着您可以在一个引擎中拥有外键,ACID保证,空间索引,这已经很长时间了.

上一篇:mysql – 选择空间点的SQL


下一篇:javascript – 正则表达式从字符串中删除lat / long