Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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错误发生。

  • 如果任何几何体参数的SRID值是一个地理SRS,并且函数不支持地理几何体,一个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)                   |
    +------------------------------+

    如果几何形状参数在笛卡尔坐标系中:

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

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

    • 将出现ER_WRONG_ARGUMENTS错误,对ST_Buffer()使用负距离的PointMultiPointLineStringMultiLineString值,以及不包含任何PolygonMultiPolygon值的几何形状集合。

    Point几何形状在地理坐标系SRS中允许,但需要满足以下条件:

    • 如果距离不为负且没有指定策略,函数返回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() 允许在笛卡尔或地理坐标系中传递参数,并按照本节介绍中描述处理参数。

    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组成。结果的坐标系与几何参数相同。

    ST_Intersection() 允许在笛卡尔或地理坐标系中传递参数,并按照本节介绍中描述处理参数。

    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]范围内的分数距离作为输入,并返回该距离点在几何体的起点到终点之间的Point。它可以用来回答类似于在几何体中哪个Point点位于中点的问题。

    该函数对所有笛卡尔和地理坐标系中的LineString几何体进行实现。

    如果fractional_distance参数为1.0,结果可能不一定是几何体的最后一个点,但是一点靠近它由于近似值计算的数值不准确性。

    与之相关的函数ST_LineInterpolatePoints(),它也接受类似的参数,但返回一个MultiPoint几何体,其中包含在几何体中每个距离点的Point值。例如,见ST_LineInterpolatePoints()的描述。

    ST_LineInterpolatePoint() 按照本节介绍中描述处理参数,但以下例外:

    ST_LineInterpolatePoint() 是 MySQL 对 OpenGIS 的扩展。

  • ST_LineInterpolatePoints(<<ls>, <<fractional_distance>>)

    该函数将一个LineString几何体和一个在范围(0.0, 1.0]中的分数距离作为输入,并返回一个MultiPoint几何体,该几何体包括LineString的起点,plusPoint值沿着LineString的每个分数距离从其起点到其终点。它可以用来回答问题,如每隔10%的距离沿着道路描述的几何体中哪些Point值。

    该函数对所有空间参考系统(包括笛卡尔和地理坐标系)中的LineString几何体进行实现。

    如果<fractional_distance>可以整除1.0且余数为0,结果可能不包含LineString的最后一个点,但是一点靠近它,因为在近似值计算中存在数值不准确性。

    与该函数相关的函数是ST_LineInterpolatePoint(),它也接受类似的参数,但返回Point值沿着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>)]中的距离作为输入,并返回该距离从LineString的起点的Point值。它可以用来回答问题,如400米从道路描述的几何体的起点的Point值。

    该函数对所有空间参考系统(包括笛卡尔和地理坐标系)中的LineString几何体进行实现。

    ST_PointAtDistance() 按照本节介绍中描述的方式处理其参数,以下例外:

    ST_PointAtDistance() 是 MySQL 对 OpenGIS 的扩展。

  • ST_SymDifference(g1, g2)

    返回一个表示几何形状集对称差的几何形状,该几何形状是由几何值 g1g2 组成的对称差,该对称差定义为:

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

    或,以函数调用notation表示:

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

    结果的坐标系与几何形状参数相同。

    ST_SymDifference() 允许在笛卡尔坐标系或地理坐标系中传递参数,并按照本节介绍中描述的方式处理参数。

    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()允许在Cartesian或地理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)) |
    +--------------------------------------+