MYSQL 地理空间索引
地理空间索引是mysql的一种新型索引,用于在几何值列上创建R-tree索引,以提高空间查询的效率。
限制条件
- 表必须是InnoDB存储引擎。
- 列必须是geometry类型,并且有NOT NULL约束。
- 列必须有一个确定的SRID(空间参考标识符)。
SRID(空间参考标识符)
SRID是空间参考标识符的缩写,它表示一个几何值所定义的坐标空间。在mysql中,SRID是一个整数,与几何值相关联。不同的SRID代表不同的坐标系统,如WGS 84(世界地理坐标系),EPSG 3857(Web墨卡托投影)等。
- WGS 84(世界地理坐标系): 一种用于制图、大地测量和卫星导航(包括 GPS)的标准。它由一个参考椭球体、一个标准坐标系、高程数据和一个大地水准面组成。它使用地球的质心作为坐标原点。
- EPSG 3857(Web墨卡托投影): 一种用于网上地图和可视化的投影坐标系。它使用球形的椭球坐标,相对于 WGS 84 / World Mercator (CRS code 3395) 有 0.7% 的比例尺误差和最多 43km 的纬度差异。它被 Google、OpenStreetMap 和 Leaflet 等网上服务广泛采用。
要获取一个几何值的SRID,可以使用ST_SRID()函数,例如:
sql
-- get SRID of a point
SELECT ST_SRID(ST_PointFromText('POINT(5 5)', 4326));
-- returns 4326
要创建一个新的空间参考系统,并指定其SRID和其他属性,可以使用CREATE SPATIAL REFERENCE SYSTEM语句,例如:
sql
-- create a new spatial reference system with SRID 1000
CREATE SPATIAL REFERENCE SYSTEM `my_srs`
IDENTIFIED BY 1000
ORGANIZATION 'EPSG' IDENTIFIED BY 3857;
地理空间索引创建示例
sql
-- create a table with geometry column
CREATE TABLE geom (
id INT PRIMARY KEY,
g GEOMETRY NOT NULL SRID 4326
) ENGINE=InnoDB;
-- add a spatial index on geometry column
ALTER TABLE geom ADD SPATIAL INDEX (g);
如何使用地理空间索引进行查询
使用MATCH()和AGAINST()函数,以及一些空间函数,如ST_Contains(), ST_Intersects(), ST_Distance()等
sql
-- 查询多边形内的点
SELECT * FROM geom
WHERE MATCH(g) AGAINST(ST_PolygonFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))') IN BOOLEAN MODE);
-- 查询距另一点一定距离内的点
SELECT * FROM geom
WHERE MATCH(g) AGAINST(ST_Buffer(ST_PointFromText('POINT(5 5)'), 3) IN BOOLEAN MODE);