地理空间数据的表结构

时间:2014-08-10 19:39:39

标签: mysql sql geospatial

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

database

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

phpmyadmintable

在屏幕截图中查找为地理空间数据创建表格的建议。

编辑:我正在开发运行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数据库。

2 个答案:

答案 0 :(得分:13)

将其存储为geometry data type。 MySQL支持Geometry(通用),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获取纬度和经度值,这样您就不会因将数据存储为点而丢失任何内容。

如果您已将数据放在两个单独的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中引入(它没有很好的文档记录,所以我不确定确切版本),在此之前你必须使用concat GeomFromText函数,请参阅Moving lat/lon text columns into a 'point' type column以获取更多相关信息,但请注意Quassnoi的答案有lon和lat错误的方式 - 它是Point(lon,lat)而不是其他方式,尽管这是是一个非常常见的错误。

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

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

答案 1 :(得分:0)