文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  空间运算符函数

14.16.8 空间运算符函数

OpenGIS 提出了许多可以生成几何图形的函数。它们旨在实现空间运算符。这些函数支持所有参数类型组合,除了根据 开放地理空间联盟 规范不适用的组合。

MySQL 还实现了一些函数,这些函数是 OpenGIS 的扩展,如函数描述中所述。此外,第 14.16.7 节,“几何属性函数”,讨论了几个从现有几何图形构造新几何图形的函数。有关这些函数的描述,请参阅该部分

除非另有说明,否则本节中的函数会按如下方式处理它们的几何图形参数

  • 如果任何参数为 NULL,则返回值为 NULL

  • 如果任何几何图形参数不是语法上格式良好的几何图形,则会发生 ER_GIS_INVALID_DATA 错误。

  • 如果任何几何图形参数是未定义空间参考系 (SRS) 中的语法上格式良好的几何图形,则会发生 ER_SRS_NOT_FOUND 错误。

  • 对于采用多个几何图形参数的函数,如果这些参数不在同一个 SRS 中,则会发生 ER_GIS_DIFFERENT_SRIDS 错误。

  • 如果任何几何图形参数具有地理 SRS 的 SRID 值,并且该函数不处理地理几何图形,则会发生 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误。

  • 对于地理 SRS 几何图形参数,如果任何参数的经度或纬度超出范围,则会发生错误

    显示的范围以度为单位。如果 SRS 使用其他单位,则范围使用其单位中的对应值。由于浮点运算,确切的范围限制略有偏差。

  • 否则,返回值为非 NULL

这些空间运算符函数可用

  • ST_Buffer(g, d [, strategy1 [, strategy2 [, strategy3]]])

    返回一个几何图形,该几何图形表示所有与几何图形值 g 的距离小于或等于 d 的距离的所有点。结果与几何图形参数位于同一个 SRS 中。

    如果几何图形参数为空,则 ST_Buffer() 返回一个空的几何图形。

    如果距离为 0,则 ST_Buffer() 返回未更改的几何图形参数

    mysql> SET @pt = ST_GeomFromText('POINT(0 0)');
    mysql> SELECT ST_AsText(ST_Buffer(@pt, 0));
    +------------------------------+
    | ST_AsText(ST_Buffer(@pt, 0)) |
    +------------------------------+
    | POINT(0 0)                   |
    +------------------------------+

    如果几何图形参数位于笛卡尔 SRS 中

    • ST_Buffer() 支持 PolygonMultiPolygon 值的负距离,以及包含 PolygonMultiPolygon 值的几何图形集合。

    • 如果结果减少到消失,则结果为空几何图形。

    • 对于带负距离的 ST_Buffer()PointMultiPointLineStringMultiLineString 值以及不包含任何 PolygonMultiPolygon 值的几何图形集合,会发生 ER_WRONG_ARGUMENTS 错误。

    Point 几何图形在地理 SRS 中是允许的,但必须满足以下条件

    • 如果距离不为负,并且未指定任何策略,则该函数返回其 SRS 中 Point 的地理缓冲区。距离参数必须以 SRS 距离单位(目前始终为米)表示。

    • 如果距离为负,或者指定了任何策略(除了 NULL),则会发生 ER_WRONG_ARGUMENTS 错误。

    对于非 Point 几何图形,会发生 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误。

    ST_Buffer() 允许在距离参数后面最多使用三个可选策略参数。策略会影响缓冲区计算。这些参数是 ST_Buffer_Strategy() 函数生成的字节字符串值,用于点、连接和端策略

    最多可以指定每种类型的策略,并且可以按任何顺序指定。

    如果缓冲区策略无效,则会发生 ER_WRONG_ARGUMENTS 错误。在以下任何情况下,策略均无效

    • 指定了给定类型(点、连接或结束)的多个策略。

    • 将非策略值(例如任意二进制字符串或数字)作为策略传递。

    • 传递了 Point 策略,但几何图形不包含 PointMultiPoint 值。

    • 传递了结束或连接策略,但几何图形不包含 LineStringPolygonMultiLinestringMultiPolygon 值。

    mysql> SET @pt = ST_GeomFromText('POINT(0 0)');
    mysql> SET @pt_strategy = ST_Buffer_Strategy('point_square');
    mysql> SELECT ST_AsText(ST_Buffer(@pt, 2, @pt_strategy));
    +--------------------------------------------+
    | ST_AsText(ST_Buffer(@pt, 2, @pt_strategy)) |
    +--------------------------------------------+
    | POLYGON((-2 -2,2 -2,2 2,-2 2,-2 -2))       |
    +--------------------------------------------+
    mysql> SET @ls = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SET @end_strategy = ST_Buffer_Strategy('end_flat');
    mysql> SET @join_strategy = ST_Buffer_Strategy('join_round', 10);
    mysql> SELECT ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy))
    +---------------------------------------------------------------+
    | ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy))   |
    +---------------------------------------------------------------+
    | POLYGON((5 5,5 10,0 10,-3.5355339059327373 8.535533905932738, |
    | -5 5,-5 0,0 0,5 0,5 5))                                       |
    +---------------------------------------------------------------+
  • ST_Buffer_Strategy(strategy [, points_per_circle])

    此函数返回一个策略字节字符串,供 ST_Buffer() 使用以影响缓冲区计算。

    有关策略的信息,请访问 Boost.org

    第一个参数必须是指示策略选项的字符串

    • 对于点策略,允许的值为 'point_circle''point_square'

    • 对于连接策略,允许的值为 'join_round''join_miter'

    • 对于结束策略,允许的值为 'end_round''end_flat'

    如果第一个参数为 'point_circle''join_round''join_miter''end_round',则必须提供 points_per_circle 参数作为正数值。最大 points_per_circle 值为 max_points_in_geometry 系统变量的值。

    有关示例,请参阅 ST_Buffer() 的描述。

    ST_Buffer_Strategy() 处理其参数的方式如本节简介中所述,但有以下例外

    • 如果任何参数无效,则会发生 ER_WRONG_ARGUMENTS 错误。

    • 如果第一个参数为 'point_square''end_flat',则不得提供 points_per_circle 参数,否则会发生 ER_WRONG_ARGUMENTS 错误。

  • ST_ConvexHull(g)

    返回一个表示几何图形值 g 的凸包的几何图形。

    此函数通过首先检查其顶点是否共线来计算几何图形的凸包。如果共线,则函数返回线性包;否则返回多边形包。此函数通过提取集合的所有分量的所有顶点,从它们创建 MultiPoint 值,并计算其凸包来处理几何图形集合。

    ST_ConvexHull() 处理其参数的方式如本节简介中所述,但有以下例外

    • 如果参数是空几何图形集合,则返回值为 NULL

    mysql> SET @g = 'MULTIPOINT(5 0,25 0,15 10,15 25)';
    mysql> SELECT ST_AsText(ST_ConvexHull(ST_GeomFromText(@g)));
    +-----------------------------------------------+
    | ST_AsText(ST_ConvexHull(ST_GeomFromText(@g))) |
    +-----------------------------------------------+
    | POLYGON((5 0,25 0,15 25,5 0))                 |
    +-----------------------------------------------+
  • ST_Difference(g1, g2)

    返回一个表示几何图形值 g1g2 的点集差的几何图形。结果与几何图形参数的 SRS 相同。

    ST_Difference() 允许参数在笛卡尔或地理 SRS 中,并按本节简介中所述处理其参数。

    mysql> SET @g1 = Point(1,1), @g2 = Point(2,2);
    mysql> SELECT ST_AsText(ST_Difference(@g1, @g2));
    +------------------------------------+
    | ST_AsText(ST_Difference(@g1, @g2)) |
    +------------------------------------+
    | POINT(1 1)                         |
    +------------------------------------+
  • ST_Intersection(g1, g2)

    返回一个表示几何图形值 g1g2 的点集交的几何图形。结果与几何图形参数的 SRS 相同。

    ST_Intersection() 允许参数在笛卡尔或地理 SRS 中,并按本节简介中所述处理其参数。

    mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
    mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
    mysql> SELECT ST_AsText(ST_Intersection(@g1, @g2));
    +--------------------------------------+
    | ST_AsText(ST_Intersection(@g1, @g2)) |
    +--------------------------------------+
    | POINT(2 2)                           |
    +--------------------------------------+
  • ST_LineInterpolatePoint(ls, fractional_distance)

    此函数采用 LineString 几何图形和 [0.0, 1.0] 范围内的分数距离,并返回沿 LineStringPoint,该点位于从其起点到其终点的距离的给定分数处。它可以用来回答诸如哪个 Point 位于由几何图形参数描述的道路的一半位置等问题。

    此函数针对所有空间参考系统(笛卡尔和地理)中的 LineString 几何图形实现。

    如果 fractional_distance 参数为 1.0,则结果可能不完全是 LineString 参数的最后一个点,而是一个接近该点的点,这是由于近似值计算中的数值误差造成的。

    一个相关的函数,ST_LineInterpolatePoints(),采用类似的参数,但返回一个 MultiPoint,该点包含沿 LineStringPoint 值,这些值位于从其起点到其终点的距离的每个分数处。有关这两个函数的示例,请参阅 ST_LineInterpolatePoints() 描述。

    ST_LineInterpolatePoint() 处理其参数的方式如本节简介中所述,但有以下例外

    ST_LineInterpolatePoint() 是 MySQL 对 OpenGIS 的扩展。

  • ST_LineInterpolatePoints(ls, fractional_distance)

    此函数采用 LineString 几何图形和 (0.0, 1.0] 范围内的分数距离,并返回一个 MultiPoint,该点包含 LineString 起点,加上沿 LineStringPoint 值,这些值位于从其起点到其终点的距离的每个分数处。它可以用来回答诸如哪个 Point 值位于由几何图形参数描述的道路的每 10% 位置等问题。

    此函数针对所有空间参考系统(笛卡尔和地理)中的 LineString 几何图形实现。

    如果 fractional_distance 参数将 1.0 除以余数为零,则结果可能不包含 LineString 参数的最后一个点,而是一个接近该点的点,这是由于近似值计算中的数值误差造成的。

    一个相关的函数,ST_LineInterpolatePoint(),采用类似的参数,但返回沿 LineStringPoint,该点位于从其起点到其终点的距离的给定分数处。

    ST_LineInterpolatePoints() 处理其参数的方式如本节简介中所述,但有以下例外

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .5));
    +----------------------------------------------+
    | ST_AsText(ST_LineInterpolatePoint(@ls1, .5)) |
    +----------------------------------------------+
    | POINT(0 5)                                   |
    +----------------------------------------------+
    mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .75));
    +-----------------------------------------------+
    | ST_AsText(ST_LineInterpolatePoint(@ls1, .75)) |
    +-----------------------------------------------+
    | POINT(2.5 5)                                  |
    +-----------------------------------------------+
    mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, 1));
    +---------------------------------------------+
    | ST_AsText(ST_LineInterpolatePoint(@ls1, 1)) |
    +---------------------------------------------+
    | POINT(5 5)                                  |
    +---------------------------------------------+
    mysql> SELECT ST_AsText(ST_LineInterpolatePoints(@ls1, .25));
    +------------------------------------------------+
    | ST_AsText(ST_LineInterpolatePoints(@ls1, .25)) |
    +------------------------------------------------+
    | MULTIPOINT((0 2.5),(0 5),(2.5 5),(5 5))        |
    +------------------------------------------------+

    ST_LineInterpolatePoints() 是 MySQL 对 OpenGIS 的扩展。

  • ST_PointAtDistance(ls, distance)

    此函数采用 LineString 几何图形和 [0.0, ST_Length(ls)] 范围内的距离(以 LineString 的空间参考系统 (SRS) 的单位测量),并返回沿 LineStringPoint,该点位于从其起点到该点的距离处。它可以用来回答诸如哪个 Point 值距离由几何图形参数描述的道路起点 400 米等问题。

    此函数针对所有空间参考系统(笛卡尔和地理)中的 LineString 几何图形实现。

    ST_PointAtDistance() 处理其参数的方式如本节简介中所述,但有以下例外

    ST_PointAtDistance() 是 MySQL 对 OpenGIS 的扩展。

  • ST_SymDifference(g1, g2)

    返回一个表示几何图形值 g1g2 的点集对称差的几何图形,其定义为

    g1 symdifference g2 := (g1 union g2) difference (g1 intersection g2)

    或者,在函数调用表示法中

    ST_SymDifference(g1, g2) = ST_Difference(ST_Union(g1, g2), ST_Intersection(g1, g2))

    结果与几何图形参数的 SRS 相同。

    ST_SymDifference() 允许参数在笛卡尔或地理 SRS 中,并按本节简介中所述处理其参数。

    mysql> SET @g1 = ST_GeomFromText('MULTIPOINT(5 0,15 10,15 25)');
    mysql> SET @g2 = ST_GeomFromText('MULTIPOINT(1 1,15 10,15 25)');
    mysql> SELECT ST_AsText(ST_SymDifference(@g1, @g2));
    +---------------------------------------+
    | ST_AsText(ST_SymDifference(@g1, @g2)) |
    +---------------------------------------+
    | MULTIPOINT((1 1),(5 0))               |
    +---------------------------------------+
  • ST_Transform(g, target_srid)

    将几何图形从一个空间参考系统 (SRS) 转换为另一个。返回值是一个与输入几何图形类型相同的几何图形,其中所有坐标都已转换为目标 SRID,target_srid。MySQL 支持 EPSG 定义的所有 SRS,但以下列出的 SRS 除外

    • EPSG 1042 Krovak Modified

    • EPSG 1043 Krovak Modified (North Orientated)

    • EPSG 9816 Tunisia Mining Grid

    • EPSG 9826 Lambert Conic Conformal (West Orientated)

    ST_Transform() 处理其参数的方式如本节简介中所述,但有以下例外

    ST_SRID(g, target_srid)ST_Transform(g, target_srid) 的区别如下

    • ST_SRID() 会更改几何体的 SRID 值,但不会变换其坐标。

    • ST_Transform() 除了更改几何体的 SRID 值之外,还会变换其坐标。

    mysql> SET @p = ST_GeomFromText('POINT(52.381389 13.064444)', 4326);
    mysql> SELECT ST_AsText(@p);
    +----------------------------+
    | ST_AsText(@p)              |
    +----------------------------+
    | POINT(52.381389 13.064444) |
    +----------------------------+
    mysql> SET @p = ST_Transform(@p, 4230);
    mysql> SELECT ST_AsText(@p);
    +---------------------------------------------+
    | ST_AsText(@p)                               |
    +---------------------------------------------+
    | POINT(52.38208611407426 13.065520672345304) |
    +---------------------------------------------+
  • ST_Union(g1, g2)

    返回一个几何体,表示几何体值 g1g2 的点集并集。结果与几何体参数的 SRS 相同。

    ST_Union() 允许参数以笛卡尔或地理 SRS 形式存在,并根据本节介绍对其参数进行处理。

    mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
    mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
    mysql> SELECT ST_AsText(ST_Union(@g1, @g2));
    +--------------------------------------+
    | ST_AsText(ST_Union(@g1, @g2))        |
    +--------------------------------------+
    | MULTILINESTRING((1 1,3 3),(1 3,3 1)) |
    +--------------------------------------+