简述

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

参考资料:

MySQL在空间索引这方面遵循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

一个简单的查询示例:

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





最新文章

  1. ceph与openstack对接
  2. golang的cgo支持调用C++的方法
  3. system_call的处理过程
  4. linux 安装firefox
  5. 全球AI界最值得关注的十位科学家
  6. php laravel mysql无法连接处理方案(linux服务器配置)
  7. Heroku使用
  8. bzoj1864 [Zjoi2006]三色二叉树
  9. 实现一个Memcpy函数:将源指针所指的区域从起始地址开始的n个字节复制到目的指针所指区域
  10. contextmenu
  11. 文件存储B+树
  12. hdu_3068 最长回文(Manacher算法)
  13. BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
  14. 实验一《Java开发环境的熟悉》实验报告
  15. 3分钟看完Java 8——史上最强Java 8新特性总结之第一篇 函数式编程基础
  16. Linux - rm 修复误删文件
  17. ptrace线程
  18. node.js中module模块的理解
  19. 20155206 2016-2017-2 《Java程序设计》第8周学习总结
  20. shell 数组,双层循环打印变量

热门文章

  1. Collections.sort 给集合排序
  2. webpack 使用环境变量
  3. Python urllib Request 用法
  4. Pig和Hive的对比
  5. 【Java】 剑指offer(56-1) 数组中只出现一次的两个数字
  6. android和java以太坊开发区块链应用使用web3j类库
  7. chrome浏览器调试工具你会使用吗?
  8. 多线程出现 java.lang.NumberFormatException: multiple points
  9. 从源码看Spring Boot 2.0.1
  10. 修复VSAN无法看到主机磁盘