Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Spatial Operator Functions

14.16.8 空间操作符函数

OpenGIS 提议了一些可以生成几何体的函数。它们旨在实现空间操作符。这些函数支持所有参数类型组合,除了根据 Open Geospatial Consortium 规范不可行的那些。

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 中。

    如果 geometry 参数为空,ST_Buffer() 返回一个空几何体。

    如果距离为 0,ST_Buffer() 返回 geometry 参数不变:

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

    如果 geometry 参数在笛卡尔 SRS 中:

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

    • 如果结果减少到消失,结果是一个空几何体。

    • 对于 ST_Buffer(),如果距离为负数,会出现 ER_WRONG_ARGUMENTS 错误对于 PointMultiPointLineStringMultiLineString 值,以及不包含任何 PolygonMultiPolygon 值的几何集合。

    Point 几何体在地理 SRS 中是允许的,subject to the following conditions:

    • 如果距离不是负数且没有指定策略,函数返回 Point 在其 SRS 中的地理缓冲区。距离参数必须是 SRS 距离单位(当前总是米)。

    • 如果距离是负数或指定了任何策略(除了 NULL),将出现 ER_WRONG_ARGUMENTS 错误。

    对于非 Point 几何体,将出现 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误。

    ST_Buffer() 允许最多三个可选的策略参数,跟随距离参数。策略影响缓冲计算。这些参数是字节字符串值,由 ST_Buffer_Strategy() 函数生成,以用于点、连接和结束策略:

    最多可以指定一个每种类型的策略,可以以任何顺序给出。

    如果缓冲策略无效,将出现 ER_WRONG_ARGUMENTS 错误。策略无效的情况包括:

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

    • 传递了不是策略的值(例如任意二进制字符串或数字)作为策略。

    • 传递了点策略,但几何体不包含 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() 允许参数在 Cartesian 或 geographic 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() 允许参数在 Cartesian 或 geographic 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] 范围内)并返回该 LineString 上的点,该点位于给定分数距离处。可以用来回答诸如哪个点位于道路几何体的中点的问题。

    该函数适用于所有空间参考系统中的 LineString 几何体,包括 Cartesian 和 geographic SRS。

    如果 fractional_distance 参数为 1.0,则结果可能不是 LineString 参数的最后一点,而是一个接近它的点,因为近似值计算中的数值不准确。

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

    ST_LineInterpolatePoint() 按照本节的介绍处理其参数,以下是例外情况:

    ST_LineInterpolatePoint() 是 MySQL 对 OpenGIS 的扩展。

  • ST_LineInterpolatePoints(ls, fractional_distance)

    该函数采用 LineString 几何体和分数距离参数 [0.0, 1.0],并返回 MultiPoint,其中包含 LineString 的起点,以及沿着 LineString 从其起点到终点的每个距离分数的 Point 值。它可以回答诸如沿着道路几何体每 10% 的点值的问题。

    该函数适用于所有空间参考系统中的 LineString 几何体,包括笛卡尔和地理坐标系。

    如果 fractional_distance 参数可以被 1.0 整除,结果可能不包含 LineString 参数的最后一点,而是一个接近它的点,因为近似值计算中的数值不准确。

    相关函数 ST_LineInterpolatePoint() 采用类似的参数,但返回沿着 LineString 的点值,在给定的距离分数从其起点到终点。

    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)],以空间参考系统(SRS)的单位测量,并返回沿着 LineString 的点值,从其起点到给定的距离。它可以回答诸如沿着道路几何体 400 米处的点值的问题。

    该函数适用于所有空间参考系统中的 LineString 几何体,包括笛卡尔和地理坐标系。

    ST_PointAtDistance() 按照本节引言中描述的方式处理其参数,以下是例外情况:

    ST_PointAtDistance() 是 OpenGIS 的 MySQL 扩展。

  • 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() 允许在 Cartesian 或 geographic 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,除了以下这些:

    • 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)) |
    +--------------------------------------+