#### 12.17.9.1 使用对象形状的空间关系函数

OpenGIS 规范定义了以下函数来测试两个几何值之间的关系*`g1`*和*`g2`*，使用精确的对象形状。返回值 1 和 0 分别表示真和假，除了距离函数返回距离值。

本节中的函数检测笛卡尔或地理空间参考系统 (SRS) 中的参数，并返回适合 SRS 的结果。

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

-   如果有任何论据`空值`或任何几何参数是空几何，返回值为`空值`.

-   如果任何几何参数不是语法上格式良好的几何，则[`ER_GIS_INVALID_DATA`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_gis_invalid_data)发生错误。

-   如果任何几何参数是未定义的空间参考系统 (SRS) 中的语法结构良好的几何，则[`ER_SRS_NOT_FOUND`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_srs_not_found)发生错误。

-   对于采用多个几何参数的函数，如果这些参数不在同一个 SRS 中，则[`ER_GIS_DIFFERENT_SRIDS`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_gis_different_srids)发生错误。

-   如果任何几何参数在几何上无效，则结果为真或假（未定义哪个），或者发生错误。

-   对于地理 SRS 几何参数，如果任何参数的经度或纬度超出范围，则会发生错误：

    -   如果经度值不在 (−180, 180] 范围内，则[`ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_geometry_param_longitude_out_of_range)发生错误（[`ER_LONGITUDE_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_longitude_out_of_range)在 MySQL 8.0.12 之前）。

    -   如果纬度值不在范围内[−90, 90]， 一个[`ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_geometry_param_latitude_out_of_range)发生错误（[`ER_LATITUDE_OUT_OF_RANGE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_latitude_out_of_range)在 MySQL 8.0.12 之前）。

        显示的范围以度为单位。如果 SRS 使用另一个单位，则范围使用其单位中的相应值。由于浮点运算，确切的范围限制略有偏差。

-   否则，返回值为非`空值`.

    本节中的某些函数允许使用单位参数来指定返回值的长度单位。除非另有说明，否则函数按如下方式处理其单位参数：

-   如果在`INFORMATION_SCHEMA` [`ST_UNITS_OF_MEASURE`](information-schema-st-units-of-measure-table.html)桌子。看[第 26.3.37 节，“信息\_架构 ST\_单位\_的\_测量表”](information-schema-st-units-of-measure-table.html).

-   如果指定了一个单位但 MySQL 不支持，则[`ER_UNIT_NOT_FOUND`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_unit_not_found)发生错误。

-   如果指定了支持的线性单位并且 SRID 为 0，则[`ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_geometry_in_unknown_length_unit)发生错误。

-   如果指定了支持的线性单位并且 SRID 不为 0，则结​​果采用该单位。

-   如果未指定单位，则结果采用几何的 SRS 单位，无论是笛卡尔还是地理。目前，所有 MySQL SRS 都以米表示。

    这些对象形状函数可用于测试几何关系：

-   [](<>)

    [`ST_包含（*`g1`*, *`g2`*)`](spatial-relation-functions-object-shapes.html#function_st-contains)

    [](<>)

    返回 1 或 0 表示是否*`g1`*完全包含*`g2`*.这测试了相反的关系[`ST_Within()`](spatial-relation-functions-object-shapes.html#function_st-within).

    [`ST_Contains()`](spatial-relation-functions-object-shapes.html#function_st-contains)如本节介绍中所述处理其参数。

-   [](<>)

    [`ST_Crosses(*`g1`*, *`g2`*)`](spatial-relation-functions-object-shapes.html#function_st-crosses)

    [](<>)

    两种几何形状*空间交叉*如果它们的空间关系具有以下性质：

    -   除非*`g1`*和*`g2`*都是维度 1：*`g1`*十字架*`g2`*如果内部*`g2`*与内部有共同点*`g1`*， 但*`g2`*没有覆盖整个内部*`g1`*.

    -   如果两者*`g1`*和*`g2`*维数为 1：如果线在有限数量的点中相互交叉（即没有公共线段，只有单个公共点）。

        该函数返回 1 或 0 来指示是否*`g1`*空间交叉*`g2`*.

    [`ST_Crosses()`](spatial-relation-functions-object-shapes.html#function_st-crosses)如本节介绍中所述处理其参数，但返回值是`空值`对于这些附加条件：

    -   *`g1`*是维度 2 (`多边形`要么`多多边形`）。

    -   *`g2`*是维度 1 (`观点`要么`多点`）。

-   [](<>)

    [`ST_不相交（*`g1`*, *`g2`*)`](spatial-relation-functions-object-shapes.html#function_st-disjoint)

    [](<>)

    返回 1 或 0 表示是否*`g1`*在空间上不相交（不相交）*`g2`*.

    [`ST_Disjoint()`](spatial-relation-functions-object-shapes.html#function_st-disjoint)如本节介绍中所述处理其参数。

-   [](<>)

    [`ST_距离（*`g1`*, *`g2`* [, *`单元`*])`](spatial-relation-functions-object-shapes.html#function_st-distance)

    [](<>)

    返回之间的距离*`g1`*和*`g2`*, 以几何参数的空间参考系统 (SRS) 的长度单位测量，或以可选的单位测量*`单元`*如果指定了参数。

    此函数通过返回两个几何参数的组件的所有组合之间的最短距离来处理几何集合。

    [`ST_Distance()`](spatial-relation-functions-object-shapes.html#function_st-distance)如本节介绍中所述处理其几何参数，但有以下例外：

    -   [`ST_Distance()`](spatial-relation-functions-object-shapes.html#function_st-distance)检测地理（椭球）空间参考系统中的参数并返回椭球上的大地距离。从 MySQL 8.0.18 开始，[`ST_Distance()`](spatial-relation-functions-object-shapes.html#function_st-distance)支持所有几何类型的地理 SRS 参数的距离计算。在 MySQL 8.0.18 之前，唯一允许的地理参数类型是`观点`和`观点`， 要么`观点`和`多点`（以任何参数顺序）。如果在地理 SRS 中与其他几何类型参数组合一起调用，则[`ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_not_implemented_for_geographic_srs)发生错误。

    -   如果任何参数在几何上无效，则结果要么是未定义的距离（也就是说，它可以是任何数字），要么会发生错误。

    -   如果中间或最终结果产生`钠`或一个负数，一个[`ER_GIS_INVALID_DATA`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_gis_invalid_data)发生错误。

        从 MySQL 8.0.14 开始，[`ST_Distance()`](spatial-relation-functions-object-shapes.html#function_st-distance)允许一个可选的*`单元`*参数，指定返回的距离值的线性单位。[`ST_Distance()`](spatial-relation-functions-object-shapes.html#function_st-distance)处理其*`单元`*参数，如本节介绍中所述。

    ```
    mysql> SET @g1 = ST_GeomFromText('POINT(1 1)');
    mysql> SET @g2 = ST_GeomFromText('POINT(2 2)');
    mysql> SELECT ST_Distance(@g1, @g2);
    +-----------------------+
    | ST_Distance(@g1, @g2) |
    +-----------------------+
    |    1.4142135623730951 |
    +-----------------------+

    mysql> SET @g1 = ST_GeomFromText('POINT(1 1)', 4326);
    mysql> SET @g2 = ST_GeomFromText('POINT(2 2)', 4326);
    mysql> SELECT ST_Distance(@g1, @g2);
    +-----------------------+
    | ST_Distance(@g1, @g2) |
    +-----------------------+
    |     156874.3859490455 |
    +-----------------------+
    mysql> SELECT ST_Distance(@g1, @g2, 'metre');
    +--------------------------------+
    | ST_Distance(@g1, @g2, 'metre') |
    +--------------------------------+
    |              156874.3859490455 |
    +--------------------------------+
    mysql> SELECT ST_Distance(@g1, @g2, 'foot');
    +-------------------------------+
    | ST_Distance(@g1, @g2, 'foot') |
    +-------------------------------+
    |             514679.7439273146 |
    +-------------------------------+
    ```

    有关球体上距离计算的特殊情况，请参见[`ST_Distance_Sphere()`](spatial-convenience-functions.html#function_st-distance-sphere)功能。

-   [](<>)

    [`ST_等于（*`g1`*, *`g2`*)`](spatial-relation-functions-object-shapes.html#function_st-equals)

    [](<>)

    返回 1 或 0 表示是否*`g1`*在空间上等于*`g2`*.

    [`ST_Equals()`](spatial-relation-functions-object-shapes.html#function_st-equals)如本节介绍中所述处理其参数，除了它不返回`空值`对于空几何参数。

    ```
    mysql> SET @g1 = Point(1,1), @g2 = Point(2,2);
    mysql> SELECT ST_Equals(@g1, @g1), ST_Equals(@g1, @g2);
    +---------------------+---------------------+
    | ST_Equals(@g1, @g1) | ST_Equals(@g1, @g2) |
    +---------------------+---------------------+
    |                   1 |                   0 |
    +---------------------+---------------------+
    ```

-   [](<>)

    [`ST_FrechetDistance(*`g1`*, *`g2`* [, *`单元`*])`](spatial-relation-functions-object-shapes.html#function_st-frechetdistance)

    [](<>)

    返回两个几何之间的离散 Fréchet 距离，反映几何的相似程度。结果是以几何参数的空间参考系统 (SRS) 的长度单位或几何参数的长度单位测量的双精度数。*`单元`*如果给出该论点，则论据。

    此函数实现离散的 Fréchet 距离，这意味着它仅限于几何点之间的距离。例如，给定两个`线串`论点，只考虑几何中明确提到的点。不考虑这些点之间的线段上的点。

    [`ST_FrechetDistance()`](spatial-relation-functions-object-shapes.html#function_st-frechetdistance)如本节介绍中所述处理其几何参数，但有以下例外：

    -   几何可能有笛卡尔或地理 SRS，但只有`线串`支持值。如果参数在相同的笛卡尔或地理 SRS 中，但不是`线串`， 一个[`ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_not_implemented_for_cartesian_srs)要么[`ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_not_implemented_for_geographic_srs)发生错误，具体取决于 SRS 类型。

    [`ST_FrechetDistance()`](spatial-relation-functions-object-shapes.html#function_st-frechetdistance)处理它的可选*`单元`*参数，如本节介绍中所述。

    ```
    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)');
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2);
    +--------------------------------+
    | ST_FrechetDistance(@ls1, @ls2) |
    +--------------------------------+
    |             2.8284271247461903 |
    +--------------------------------+

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)', 4326);
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)', 4326);
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2);
    +--------------------------------+
    | ST_FrechetDistance(@ls1, @ls2) |
    +--------------------------------+
    |              313421.1999416798 |
    +--------------------------------+
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2, 'foot');
    +----------------------------------------+
    | ST_FrechetDistance(@ls1, @ls2, 'foot') |
    +----------------------------------------+
    |                     1028284.7767115477 |
    +----------------------------------------+
    ```

    此功能是在 MySQL 8.0.23 中添加的。

-   [](<>)

    [`ST_HausdorffDistance(*`g1`*, *`g2`* [, *`单元`*])`](spatial-relation-functions-object-shapes.html#function_st-hausdorffdistance)

    [](<>)

    返回两个几何之间的离散豪斯多夫距离，反映几何的相似程度。结果是以几何参数的空间参考系统 (SRS) 的长度单位或几何参数的长度单位测量的双精度数。*`单元`*如果给出该论点，则论据。

    此函数实现离散豪斯多夫距离，这意味着它仅限于几何点之间的距离。例如，给定两个`线串`论点，只考虑几何中明确提到的点。不考虑这些点之间的线段上的点。

    [`ST_HausdorffDistance()`](spatial-relation-functions-object-shapes.html#function_st-hausdorffdistance)如本节介绍中所述处理其几何参数，但有以下例外：

    -   如果几何参数在相同的笛卡尔或地理 SRS 中，但不在支持的组合中，则[`ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_not_implemented_for_cartesian_srs)要么[`ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_not_implemented_for_geographic_srs)发生错误，具体取决于 SRS 类型。支持这些组合：

        -   `线串`和`线串`

        -   `观点`和`多点`

        -   `线串`和`多行字符串`

        -   `多点`和`多点`

        -   `多行字符串`和`多行字符串`

    [`ST_HausdorffDistance()`](spatial-relation-functions-object-shapes.html#function_st-hausdorffdistance)处理它的可选*`单元`*参数，如本节介绍中所述。

    ```
    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)');
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2);
    +----------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2) |
    +----------------------------------+
    |                                1 |
    +----------------------------------+

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)', 4326);
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)', 4326);
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2);
    +----------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2) |
    +----------------------------------+
    |               111319.49079326246 |
    +----------------------------------+
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2, 'foot');
    +------------------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2, 'foot') |
    +------------------------------------------+
    |                        365221.4264870815 |
    +------------------------------------------+
    ```

    此功能是在 MySQL 8.0.23 中添加的。

-   [](<>)

    [`ST_Intersects(*`g1`*, *`g2`*)`](spatial-relation-functions-object-shapes.html#function_st-intersects)

    [](<>)

    返回 1 或 0 表示是否*`g1`*空间相交*`g2`*.

    [`ST_Intersects()`](spatial-relation-functions-object-shapes.html#function_st-intersects)如本节介绍中所述处理其参数。

-   [](<>)

    [`ST_重叠（*`g1`*, *`g2`*)`](spatial-relation-functions-object-shapes.html#function_st-overlaps)

    [](<>)

    两种几何形状*空间重叠*如果它们相交并且它们的相交会导致几何尺寸相同但不等于给定几何形状中的任何一个。

    该函数返回 1 或 0 来指示是否*`g1`*空间重叠*`g2`*.

    [`ST_Overlaps()`](spatial-relation-functions-object-shapes.html#function_st-overlaps)如本节介绍中所述处理其参数，但返回值是`空值`对于两个几何形状的尺寸不相等的附加条件。

-   [](<>)

    [`ST_Touches(*`g1`*, *`g2`*)`](spatial-relation-functions-object-shapes.html#function_st-touches)

    [](<>)

    两种几何形状*空间接触*如果它们的内部不相交，但其中一个几何图形的边界与另一个几何图形的边界或内部相交。

    该函数返回 1 或 0 来指示是否*`g1`*空间接触*`g2`*.

    [`ST_Touches()`](spatial-relation-functions-object-shapes.html#function_st-touches)如本节介绍中所述处理其参数，但返回值是`空值`对于两个几何尺寸均为 0 的附加条件（`观点`要么`多点`）。

-   [](<>)

    [`ST_Within(*`g1`*, *`g2`*)`](spatial-relation-functions-object-shapes.html#function_st-within)

    [](<>)

    返回 1 或 0 表示是否*`g1`*在空间上*`g2`*.这测试了相反的关系[`ST_Contains()`](spatial-relation-functions-object-shapes.html#function_st-contains).

    [`ST_Within()`](spatial-relation-functions-object-shapes.html#function_st-within)如本节介绍中所述处理其参数。
