MySQL在5.7以后的版本支持了空间索引,并且支持OpenGIS几何数据模型。国内的MySQL相关的书籍都比较老了,在这方面有详细描述的尚未见过。有一本比较新的PostgreSQL的数据介绍过空间搜索相关的内容,可是也不够详细。因此对于这方面的内容,无论是MySQL仍是PostgreSQL,都建议直接去看官方文档,都有很详细的示例。html
参考资料:mysql
MySQL在空间索引这方面遵循OpenGIS几何数据模型规则,详情可见sql
下面记录一下简单的使用。bash
我这里主要是用于检索遥感影像数据的,这里就只建立了两个字段,一个是影像路径path
,一个是有效外包框box
。函数
CREATE TABLE `gim` ( `path` varchar(512) NOT NULL, `box` geometry NOT NULL, PRIMARY KEY (`path`), SPATIAL KEY `box` (`box`) ) ;
这里建立好以后,就能够往里面插入数据了。测试
数据的插入和普通的数据插入同样,只是geometry
数据须要使用st_geomfromtext
等函数来构造,相关的文档参考在这里gis-data-formats还有这个populating-spatial-columns。spa
这里只展现一个简单数据插入,这里我使用的是单多边形,只有四个点(逆时针顺序),使用WKT描述几何数据。.net
insert into gim (path,box) values('%s',ST_GeomFromText( 'Polygon((116.18866 39.791107, 116.124115 39.791107, 116.18866 39.833679, 116.124115 39.833679, 116.18866 39.791107))'));
我这里写了个程序,插入了上千条数据,方便后面的搜索。code
查询这里和普通的查询也同样,只是where
字句后面使用空间过滤相关选项就是。
使用空间索引进行查询的相关文档在这里using-spatial-indexesorm
MySQL的文档中只说起了MBRContains
和MBRWithin
两种方式,通过测试,MBRIntersects
、MBREqual
、MBROverlaps
、MBRTouches
、MBRDisjoint
均可以使用。
SpatiaLite中有一幅关于空间检索的图,放在这里作个参考。
SpatiaLite有一篇详细介绍空间索引的文档,连接在这里http://www.gaia-gis.it/spatialite-2.1/SpatiaLite-manual.html
一个简单的查询示例:
select * from gim where MBRContains(st_geomfromtext('polygon((116.438599 39.832306, 116.374054 39.832306, 116.438599 39.876251, 116.374054 39.876251, 116.438599 39.832306))'),box);
返回结果以下:
+------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------+ | path | box | +------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------+ | file:///root1/北京/北京分区/æœé˜³åŒº/æœé˜³åŒº2016/J50G004039.tif | POLYGON((116.438599 39.832306, 116.374054 39.832306, 116.438599 39.876251, 116.374054 39.876251, 116.438599 39.832306)) | | file:///root1/北京/北京分区/æœé˜³åŒº/æœé˜³åŒº2005/J50G004039.tif | POLYGON((116.438599 39.832306, 116.374054 39.832306, 116.438599 39.876251, 116.374054 39.876251, 116.438599 39.832306)) | | file:///root1/北京/北京分区/æœé˜³åŒº/æœé˜³åŒº2003/J50G004039.tif | POLYGON((116.438599 39.832306, 116.374054 39.832306, 116.438599 39.876251, 116.374054 39.876251, 116.438599 39.832306)) | | file:///root1/北京/北京分幅/J50G004039.tif | POLYGON((116.438599 39.832306, 116.374054 39.832306, 116.438599 39.876251, 116.374054 39.876251, 116.438599 39.832306)) | +------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------+ 4 rows in set