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