MySQL空間索引簡單使用

簡述

MySQL在5.7以後的版本支持了空間索引,並且支持OpenGIS幾何數據模型。國內的MySQL相關的書籍都比較老了,在這方面有詳細描述的尚未見過。有一本比較新的PostgreSQL的數據介紹過空間搜索相關的內容,可是也不夠詳細。因此對於這方面的內容,無論是MySQL仍是PostgreSQL,都建議直接去看官方文檔,都有很詳細的示例。html

參考資料:mysql

MySQL在空間索引這方面遵循OpenGIS幾何數據模型規則,詳情可見sql

OpenGIS幾何數據模型圖示

下面記錄一下簡單的使用。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-columnsspa

這裏只展現一個簡單數據插入,這裏我使用的是單多邊形,只有四個點(逆時針順序),使用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的文檔中只說起了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



相關文章
相關標籤/搜索