MySQL Spatial
简介
遵循 OGC 规范,MySQL 将空间扩展作为SQL with Geometry Types环境的一个子集来实现。MySQL 空间扩展支持地理特征的生成、存储和分析:表示空间值的数据类型、操作空间值的函数、用于改进对空间列的访问时间的空间索引。
一、基础知识
1. 空间数据类型
MySQL 具有对应于 OpenGIS 类的空间数据类型。
一些空间数据类型包含单个几何值:
- GEOMETRY
- POINT
- LINESTRING
- POLYGON
GEOMETRY可以存储任何类型的几何值。其他单值类型(POINT、 LINESTRING和POLYGON)将它们的值限制为特定的几何类型。
其他空间数据类型包含值的集合:
- MULTIPOINT
- MULTILINESTRING
- MULTIPOLYGON
- GEOMETRYCOLLECTION
GEOMETRYCOLLECTION可以存储任何类型的对象的集合。其他集合类型(MULTIPOINT、 MULTILINESTRING和 MULTIPOLYGON)将集合成员限制为具有特定几何类型的成员。
如:
sql
CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326);如果您计划索引该列,请使用
NOT NULL和SRID属性声明。
2. 支持的空间数据格式
两种标准空间数据格式用于表示查询中的几何对象:
- 文本 (WKT) 格式:几何值的
Well-Known Text (WKT)表示旨在以 ASCII 形式交换几何数据。OpenGIS 规范提供了一个 Backus-Naur 语法,它指定了写入 WKT 值的正式生产规则,常见的WKT的表示如下。
text
# 点
POINT(15 20)
MULTIPOINT(0 0, 20 20, 60 60)
# 线
LINESTRING(0 0, 10 10, 20 25, 50 60)
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
# 面
POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
# 几何集合
GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))- 二进制 (WKB) 格式:几何值的
Well-Known Binary (WKB)表示用于将几何数据交换为由BLOB包含几何 WKB 信息的值表示的二进制流。
3. 创建空间索引
MySQL 可以使用类似于创建常规索引的语法创建空间索引,但使用 SPATIAL关键字。必须声明空间索引中的列NOT NULL。
sql
-- 与CREATE TABLE
CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326, SPATIAL INDEX(g));
-- 与ALTER TABLE
CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326);
ALTER TABLE geom ADD SPATIAL INDEX(g);
-- 与CREATE SPATIAL INDEX
CREATE TABLE geom (g GEOMETRY NOT NULL SRID 4326);
CREATE SPATIAL INDEX g ON geom (g);SPATIAL INDEX创建 R 树索引。对于支持空间列的非空间索引的存储引擎,引擎会创建 B 树索引。空间值的 B 树索引对精确值查找很有用,但对范围扫描没有用。
二、空间函数
MySQL 提供了丰富的用于处理空间数据的几何函数。
1. 几何实体构造
Point():从坐标构造点MultiPoint():从Point值构造MultiPointLineString():从Point值构造LineStringMultiLineString():从LineString值构造MultiLineStringPolygon():从LineString参数构造多边形MultiPolygon():从Polygon值构造MultiPolygonGeomCollection():从几何构造几何集合ST_PointFromGeoHash(): 将geohash值转换为POINT值ST_LineFromWKB():ST_LineStringFromWKB()`: 从WKB构造LineStringST_MLineFromWKB():ST_MultiLineStringFromWKB()`: 从WKB构造MultiLineStringST_MPointFromWKB():ST_MultiPointFromWKB()`: 从WKB构造MultiPointST_MPolyFromWKB():ST_MultiPolygonFromWKB()`: 从WKB构造MultiPolygonST_PointFromWKB(): 从WKB构造点ST_PolyFromWKB():ST_PolygonFromWKB()`: 从WKB构造多边形ST_GeomFromText():ST_GeometryFromText()`: 从WKT返回几何ST_GeomCollFromText(),ST_GeometryCollectionFromText(),ST_GeomCollFromTxt(): 从WKT返回几何集合ST_PointFromText(): 从WKT构建点ST_LineFromText(),ST_LineStringFromText(): 从WKT构造LineStringST_MLineFromText(),ST_MultiLineStringFromText(): 从WKT构造MultiLineStringST_MPointFromText(),ST_MultiPointFromText(): 从WKT构造MultiPointST_MPolyFromText(),ST_MultiPolygonFromText(): 从WKT构造MultiPolygonST_PolyFromText(),ST_PolygonFromText(): 从WKT构造多边形
2. 几何实体操作
ST_StartPoint(): LineString的起始点ST_EndPoint(): LineString的终点ST_PointN(): 从LineString返回第N个点ST_GeometryN(): 从几何集合中返回第N个几何ST_Distance(): 一个几何与另一个几何的距离ST_Length(): 返回LineString的长度ST_NumPoints(): 返回LineString中的点数ST_X(): 返回Point的X坐标ST_Y(): 返回Point的Y坐标ST_Longitude(): 返回Point的经度ST_Latitude(): 返回Point的纬度ST_InteriorRingN(): 返回Polygon的第N个内环ST_ExteriorRing(): 返回Polygon的外环ST_Area(): 返回Polygon或MultiPolygon面积ST_NumInteriorRing():ST_NumInteriorRings()`: 返回多边形内圈的数量ST_Envelope(): 返回几何的四至ST_SRID(): 返回几何的空间参考系统IDST_NumGeometries(): 返回几何集合中的几何数量ST_GeometryType(): 返回几何类型的名称ST_Centroid(): 返回质心作为一个点ST_Dimension(): 几何尺寸ST_SwapXY(): 交换X / Y坐标的返回参数ST_MakeEnvelope(): 两点左右的矩形ST_LatNorth(), ST_LatSouth(), ST_LongEast(), ST_LongWest(): 返回矩形的对角点ST_XMax(), ST_XMin(), ST_YMax(), ST_YMin(), ST_ZMax(), ST_ZMin(): 返回极值
3. 格式转换
ST_GeoHash(): 产生geohash值ST_LongFromGeoHash(): 从geohash值返回经度ST_LatFromGeoHash(): 从geohash值返回纬度ST_GeomFromGeoJSON(): 从GeoJSON对象生成几何ST_GeomFromWKB():ST_GeometryFromWKB()`: 从WKB返回几何ST_GeomCollFromWKB():ST_GeometryCollectionFromWKB()`: 从WKB返回几何集合ST_AsGeoJSON(): 从几何体生成GeoJSON对象ST_AsBinary():ST_AsWKB()`: 从内部几何格式转换为WKBST_AsText():ST_AsWKT()`: 从内部几何格式转换为WKTST_AsGML(), ST_AsKML(), ST_AsSVG(): 从内部几何格式转换为GML,KML,SVG- `
4. 空间判断
ST_Validate(): 返回验证的几何体ST_IsClosed(): 几何是否封闭且简单ST_IsSimple(): 几何是否简单ST_IsValid(): 几何是否有效ST_Contains(): 一个几何是否包含另一个ST_Touches(): 一个几何是否接触另一个ST_Disjoint(): 一个几何是否与另一个几何脱节ST_Equals(): 一个几何是否与另一个几何相等ST_Crosses(): 一个几何是否与另一个几何相交ST_Intersects(): 一个几何是否与另一个相交ST_Overlaps(): 一个几何是否与另一个重叠ST_Within(): 一个几何是否在另一个之内ST_IsEmpty(): 是否为空
5. 空间计算
ST_Union(): 返回点集两个几何的并集ST_SymDifference(): 返回点设置两个几何的对称差异ST_Intersection(): 返回点设置两个几何的交集ST_ConvexHull(): 返回几何体的凸包ST_Simplify(): 返回简化几何ST_Buffer(): 返回距离几何体的给定距离内的点的几何
