MySQL空间索引简单使用

简述

MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。国内的MySQL相关的书籍都比较老了,在这方面有详细描述的还没有见过。有一本比较新的PostgreSQL的数据介绍过空间搜索相关的内容,但是也不够详细。所以对于这方面的内容,不管是MySQL还是PostgreSQL,都建议直接去看官方文档,都有很详细的示例。

MySQL官方文档主页
MySQL5.7版本空间数据参考文档
MySQL支持的空间数据格式
空间索引和 ST_Geometry
ST_Geometry 的关系函数

MySQL在空间索引这方面遵循OpenGIS几何数据模型规则,详情可见

MySQL中 OpenGIS Geometry Model
OpenGIS Implementation Specification for Geographic information - Simple feature access - Part 2: SQL option

OpenGIS几何数据模型图示

下面记录一下简单的使用。

1、创建一个带有空间索引的表

我这里主要是用于检索遥感影像数据的,这里就只创建了两个字段,一个是影像路径path,一个是有效外包框box

CREATE TABLE `gim` (
  `path` varchar(512) NOT NULL,
  `box` geometry NOT NULL,
  PRIMARY KEY (`path`),
  SPATIAL KEY `box` (`box`)
) ;

这里创建好之后,就可以往里面插入数据了。

2、插入数据

数据的插入和普通的数据插入一样,只是geometry数据需要使用st_geomfromtext等函数来构造,相关的文档参考在这里gis-data-formats还有这个populating-spatial-columns

这里只展示一个简单数据插入,这里我使用的是单多边形,只有四个点(逆时针顺序),使用WKT描述几何数据

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))'));

我这里写了个程序,插入了上千条数据,方便后面的搜索。

3、查询数据

查询这里和普通的查询也一样,只是where字句后面使用空间过滤相关选项就是。
使用空间索引进行查询的相关文档在这里using-spatial-indexes

MySQL的文档中只提及了MBRContainsMBRWithin两种方式,经过测试,MBRIntersectsMBREqualMBROverlapsMBRTouchesMBRDisjoint都可以使用。
SpatiaLite`中有一幅关于空间检索的图,放在这里做个参考。
SpatiaLite有一篇详细介绍空间索引的文档,链接在这里http://www.gaia-gis.it/spatialite-2.1/SpatiaLite-manual.html
SpatiaLite

一个简单的查询示例:

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

693958-20180903173259428-1084887177.jpg
693958-20180925171002549-1899467906.jpg
693958-20180925171011661-346466845.jpg

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值