Skip to content

MySQL Spatial

2023-04-06
Author:lzugis

简介

遵循 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 NULLSRID属性声明。

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值构造MultiPoint
  • LineString():从Point值构造LineString
  • MultiLineString():从LineString值构造MultiLineString
  • Polygon():从LineString参数构造多边形
  • MultiPolygon():从Polygon值构造MultiPolygon
  • GeomCollection():从几何构造几何集合
  • ST_PointFromGeoHash(): 将geohash值转换为POINT值
  • ST_LineFromWKB():ST_LineStringFromWKB()`: 从WKB构造LineString
  • ST_MLineFromWKB():ST_MultiLineStringFromWKB()`: 从WKB构造MultiLineString
  • ST_MPointFromWKB():ST_MultiPointFromWKB()`: 从WKB构造MultiPoint
  • ST_MPolyFromWKB():ST_MultiPolygonFromWKB()`: 从WKB构造MultiPolygon
  • ST_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构造LineString
  • ST_MLineFromText(),ST_MultiLineStringFromText(): 从WKT构造MultiLineString
  • ST_MPointFromText(),ST_MultiPointFromText(): 从WKT构造MultiPoint
  • ST_MPolyFromText(),ST_MultiPolygonFromText(): 从WKT构造MultiPolygon
  • ST_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(): 返回几何的空间参考系统ID
  • ST_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()`: 从内部几何格式转换为WKB
  • ST_AsText():ST_AsWKT()`: 从内部几何格式转换为WKT
  • ST_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(): 返回距离几何体的给定距离内的点的几何