mysql對GIS空間數據的支持,包括創建空間索引


CREATE TABLE tb_geo(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(128) NOT NULL,
pnt POINT NOT NULL,
SPATIAL INDEX `spatIdx` (`pnt`) <!-- 1、創建表時創建空間索引 -->
)ENGINE=MYISAM DEFAULT CHARSET=utf8; <!-- 數據庫表引擎設置為 MYISAM-->

<!-- 2、已經存在的表上創建索引 -->
<!-- ALTER TABLE tb_geo ADD SPATIAL INDEX spatIdx(pnt); -->

<!-- 3、使用CREATE INDEX語句創建索引,語法如下 -->
<!-- CREATE SPATIAL INDEX spatIdx ON t7(g) -->

<!-- 刪除索引 -->
<!-- ALTER TABLE book DROP INDEX UniqidIdx -->

<!-- 表描述信息-->
DESCRIBE tb_geo;

<!-- 插入數據 -->
INSERT INTO `tb_geo` VALUES(
NULL,
'a test string',
POINTFROMTEXT('POINT(15 20)'));


<!-- 查詢 -->
SELECT id,NAME,ASTEXT(pnt) FROM tb_geo;

SELECT id,NAME,X(pnt),Y(pnt) FROM tb_geo;


<!-- 空間查詢示例 -->
SELECT ASTEXT(pnt) FROM tb_geo WHERE MBRWITHIN(pnt,GEOMFROMTEXT('Polygon((0 0,0 30,30 30,30 0,0 0))'));

<!-- 刪除表 -->
DROP TABLE tb_geo;


<!-- 幾種空間對象比較方法 -->
SET @g1 = GEOMFROMTEXT('Polygon((0 0,0 3,3 3,3 0,0 0))');
SET @g2 = GEOMFROMTEXT('Point(1 1)');

<!-- 注意:比較的都是外包絡幾何類型對象 -->
<!-- 包含 -->
SELECT MBRCONTAINS(@g1,@g2), MBRCONTAINS(@g2,@g1), MBRCONTAINS(@g1,@g1);
<!-- 被包含 -->
SELECT MBRWITHIN(@g2,@g1),MBRWITHIN(@g1,@g2);
<!-- 不相交 -->
SELECT MBRDISJOINT(@g1,@g2);
<!-- 相等 -->
SELECT MBREQUAL(@g1,@g2);
<!-- 相交 -->
SELECT MBRINTERSECTS(@g1,@g2);
<!-- 重疊 -->
SELECT MBROVERLAPS(@g1,@g2);
<!-- 相切 -->
SELECT MBRTOUCHES(@g1,@g2);

注:

在最新發布的MySQL 5.7.4實驗室版本中,InnoDB存儲引擎新增了對於幾何數據空間索引的支持。 
在此之前,InnoDB將幾何數據存儲為BLOB(二進制大對象)數據,在空間數據上只能創建前綴索引,當涉及空間搜索時非常低效,尤其是在涉及復雜的幾何數據時。在大多數情況下,獲得結果的唯一方式是掃描表。
新版本MySQL中,InnoDB支持空間索引,通過R樹來實現,使得空間搜索變得高效。 
InnoDB空間索引也支持MyISAM引擎現有的空間索引的語法,此外,InnoDB空間索引支持完整的事務特性以及隔離級別。 
目前,InnoDB空間索引只支持兩個維度的數據,MySQL開發團隊表示有計划支持多維。此外,開發團隊正在做更多關於性能方面的工作,以使其更加高效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM