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 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)中的有效点或多点值,则返回值是球面上两个几何体之间的最短距离。如果省略,默认半径等于 SRS 的平均半径,定义为 (2a+b)/3,其中 a 是 SRS 的半长轴,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)

    返回围绕两个点的矩形封闭体,以 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

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