# 12.17.13 空间便利函数

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

除非另有说明,本节中的函数按如下方式处理其几何参数:

  • 如果有任何论据空值,返回值为空值.

  • 如果任何几何参数不是语法上格式良好的几何,则ER_GIS_INVALID_DATA (opens new window)发生错误。

  • 如果任何几何参数是未定义的空间参考系统 (SRS) 中的语法结构良好的几何,则ER_SRS_NOT_FOUND (opens new window)发生错误。

  • 对于采用多个几何参数的函数,如果这些参数不在同一个 SRS 中,则ER_GIS_DIFFERENT_SRIDS (opens new window)发生错误。

  • 否则,返回值为非空值.

    这些便利功能可用:

  • ST_Distance_Sphere(*g1*, *g2* [, *半径*])

    返回之间的最小球面距离观点要么多点球体上的参数,以米为单位。(对于通用距离计算,请参阅ST_Distance()功能。)可选的*半径*参数应以米为单位。

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

    如果两个几何参数都有效观点要么多点在地理空间参考系统 (SRS) 中的值,返回值是具有提供半径的球体上两个几何图形之间的最短距离。如果省略,则默认半径等于平均半径,定义为 (2a+b)/3,其中 a 是 SRS 的长半轴,b 是短半轴。

    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空的值,例如空点.

    ST_IsValid()如本节介绍中所述处理其参数,但有以下例外:

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

    返回围绕两个点形成包络的矩形,作为观点,线串, 要么多边形.

    使用笛卡尔坐标系而不是在球体、椭球体或地球上进行计算。

    给出两点*pt1pt2*,ST_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_简化(*g*, *最大距离*)

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

    几何可以是任何几何类型,尽管 Douglas-Peucker 算法实际上可能不会处理所有类型。几何集合通过将其组件一一提供给简化算法进行处理,并将返回的几何作为结果放入几何集合中。

    这*最大距离*参数是顶点到要删除的其他段的距离(以输入坐标为单位)。简化线串此距离内的顶点将被移除。

    根据 Boost.Geometry,几何图形可能由于简化过程而变得无效,并且该过程可能会产生自相交。要检查结果的有效性,请将其传递给ST_IsValid().

    ST_Simplify()如本节介绍中所述处理其参数,但有以下例外:

    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),但在几何上是无效的。例如,这个多边形在几何上是无效的:多边形((0 0, 0 0, 0 0, 0 0, 0 0))

    ST_Validate()如果它在语法上格式正确并且在几何上有效,则返回几何,空值如果参数在语法上不是格式正确的或在几何上无效或不是空值.

    ST_Validate()可用于过滤掉无效的几何数据,尽管要付出代价。对于需要不受无效数据污染的更精确结果的应用程序,这种惩罚可能是值得的。

    如果几何参数有效,则按原样返回,除非输入多边形要么多多边形有顺时针环,这些环在检查有效性之前被反转。如果几何图形有效,则返回具有反转环的值。

    唯一有效的空几何以空几何集合值的形式表示。ST_Validate()在这种情况下,直接返回它而无需进一步检查。

    从 MySQL 8.0.13 开始,ST_Validate()如本节介绍中所述处理其参数,但有以下例外:

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