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 Convenience Functions

14.16.13 空间便利函数

本节中的函数提供了对几何值的便捷操作。

除非另有指定,以下函数在处理几何参数时遵循以下规则:

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

  • 如果任何几何参数不是语法正确的几何,出现ER_GIS_INVALID_DATA错误。

  • 如果任何几何参数是语法正确的几何,但在未定义的空间参考系统(SRS)中,出现ER_SRS_NOT_FOUND错误。

  • 对于需要多个几何参数的函数,如果这些参数不在同一个SRS中,出现ER_GIS_DIFFERENT_SRIDS错误。

  • 否则,返回值不是NULL

这些便捷函数可用:

  • ST_Distance_Sphere(g1, g2 [, radius])

    返回两个点或多点之间的最小球面距离,单位为米。 (对于一般距离计算,请见ST_Distance()函数。)可选的radius参数应以米为单位。

    如果两个几何参数都是有效的笛卡尔点或多点值在SRID 0中,返回值是两个几何体之间的最短距离在球面上,以提供的半径。如果省略,缺省半径为6,370,986米,点X和Y坐标被解释为经度和纬度,分别以度为单位。

    如果两个几何参数都是有效的点或多点值在地理空间参考系统(SRS)中,返回值是两个几何体之间的最短距离在球面上,以提供的半径。如果省略,缺省半径等于平均半径,定义为(2a+b)/3,其中a是半大轴,b是半小轴的SRS。

    ST_Distance_Sphere()根据本节的介绍处理其参数,以下例外:

    mysql> SET @pt1 = ST_GeomFromText('POINT(0 0)');
    mysql> SET @pt2 = ST_GeomFromText('POINT(180 0)');
    mysql> SELECT ST_Distance_Sphere(@pt1, @pt2);
    +--------------------------------+
    | ST_Distance_Sphere(@pt1, @pt2) |
    +--------------------------------+
    |             20015042.813723423 |
    +--------------------------------+
  • ST_IsValid(g)

    返回 1,如果参数是几何学有效,0 如果参数不是几何学有效。几何学有效性根据 OGC 规范定义。

    唯一有效的空几何学是以空几何学集合值表示。ST_IsValid() 在这种情况下返回 1。MySQL 不支持 GIS EMPTY 值,如 POINT EMPTY

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

    • 如果几何学具有地理 SRS,且经度或纬度超出范围,出现错误:

      显示的范围是以度为单位。如果SRS使用另一种单位,范围使用该单位的相应值。由于浮点数计算,实际范围略有不同。

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,-0.00 0,0.0 0)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 0, 1 1)');
    mysql> SELECT ST_IsValid(@ls1);
    +------------------+
    | ST_IsValid(@ls1) |
    +------------------+
    |                0 |
    +------------------+
    mysql> SELECT ST_IsValid(@ls2);
    +------------------+
    | ST_IsValid(@ls2) |
    +------------------+
    |                1 |
    +------------------+
  • ST_MakeEnvelope(pt1, pt2)

    返回两个点形成的 envelope 周围的矩形,作为一个 PointLineStringPolygon

    计算使用的是笛卡尔坐标系,而不是球面、椭球面或地球面。

    给定两个点 pt1pt2ST_MakeEnvelope() 在抽象平面上创建结果几何体。

    • 如果 pt1pt2 相等,结果是点 pt1

    • 否则,如果 (pt1, pt2) 是竖直或水平线段,结果是线段 (pt1, pt2)

    • 否则,结果是一个使用 pt1pt2 作为对角点的多边形。

    结果几何体的 SRID 是 0。

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

    mysql> SET @pt1 = ST_GeomFromText('POINT(0 0)');
    mysql> SET @pt2 = ST_GeomFromText('POINT(1 1)');
    mysql> SELECT ST_AsText(ST_MakeEnvelope(@pt1, @pt2));
    +----------------------------------------+
    | ST_AsText(ST_MakeEnvelope(@pt1, @pt2)) |
    +----------------------------------------+
    | POLYGON((0 0,1 0,1 1,0 1,0 0))         |
    +----------------------------------------+
  • ST_Simplify(g, max_distance)

    使用 Douglas-Peucker 算法简化一个几何体,并返回一个同类型的简化值。

    几何体可以是任何几何类型,但是 Douglas-Peucker 算法可能不会实际处理每种类型。几何体集合被处理为一个一个地将其组件传递给简化算法,然后将返回的几何体组合成一个几何体集合。

    参数 max_distance 是输入坐标的单位距离,用于删除简化线段中的顶点。距离在这个距离以内的顶点将被删除。

    根据 Boost.Geometry,简化过程可能会使几何体无效,并且可能会创建自交点。为了检查结果的有效性,请将其传递给ST_IsValid()

    ST_Simplify() 按照本节介绍的方式处理其参数,以下是例外:

    • 如果参数 max_distance 不是正数或是 NaN,将发生ER_WRONG_ARGUMENTS 错误。

    mysql> SET @g = ST_GeomFromText('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)');
    mysql> SELECT ST_AsText(ST_Simplify(@g, 0.5));
    +---------------------------------+
    | ST_AsText(ST_Simplify(@g, 0.5)) |
    +---------------------------------+
    | LINESTRING(0 0,0 1,1 1,2 3,3 3) |
    +---------------------------------+
    mysql> SELECT ST_AsText(ST_Simplify(@g, 1.0));
    +---------------------------------+
    | ST_AsText(ST_Simplify(@g, 1.0)) |
    +---------------------------------+
    | LINESTRING(0 0,3 3)             |
    +---------------------------------+
  • ST_Validate(g)

    根据 OGC 规范验证一个几何体。一个几何体可以是语法上正确(WKB 值加 SRID),但几何上无效。例如,这个多边形是几何上无效:POLYGON((0 0, 0 0, 0 0, 0 0, 0 0))

    ST_Validate() 如果几何体是语法上正确且几何上有效,则返回几何体;否则,如果几何体不是语法上正确或不是几何上有效或是 NULL,则返回 NULL

    ST_Validate() 可以用来过滤无效几何体数据,但是需要付出代价。对于需要更精确结果且不受无效数据影响的应用程序,这个代价可能是值得的。

    如果几何体是有效的,它将被返回,除非输入 PolygonMultiPolygon 的环形是顺时针的,那么这些环形将被反转,然后检查有效性。如果几何体是有效的,返回的值将是反转环形的值。

    唯一有效的空几何体是以空几何体集合值表示。ST_Validate() 在这种情况下直接返回该值,而不进行进一步检查。

    ST_Validate() 按照本节介绍的方式处理其参数,以下是例外:

    • 如果几何体具有地理 SRS,且经度或纬度超出范围,错误将发生:

      显示的范围是以度为单位的。由于浮点数计算的精度限制,实际范围的上下限会有轻微的偏差。

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 0, 1 1)');
    mysql> SELECT ST_AsText(ST_Validate(@ls1));
    +------------------------------+
    | ST_AsText(ST_Validate(@ls1)) |
    +------------------------------+
    | NULL                         |
    +------------------------------+
    mysql> SELECT ST_AsText(ST_Validate(@ls2));
    +------------------------------+
    | ST_AsText(ST_Validate(@ls2)) |
    +------------------------------+
    | LINESTRING(0 0,1 1)          |
    +------------------------------+