Skip to content
On this page

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);

Released under the MIT License.