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

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

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

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

  • 如果有任何论据空值或任何几何参数是空几何,返回值为空值.

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

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

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

  • 如果任何几何参数在几何上无效,则结果为真或假(未定义哪个),或者发生错误。

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

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

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

  • 如果在INFORMATION_SCHEMA ST_UNITS_OF_MEASURE桌子。看第 26.3.37 节,“信息_架构 ST_单位_的_测量表”.

  • 如果指定了一个单位但 MySQL 不支持,则ER_UNIT_NOT_FOUND (opens new window)发生错误。

  • 如果指定了支持的线性单位并且 SRID 为 0,则ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT (opens new window)发生错误。

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

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

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

  • ST_包含(*g1*, *g2*)

    返回 1 或 0 表示是否*g1完全包含g2*.这测试了相反的关系ST_Within().

    ST_Contains()如本节介绍中所述处理其参数。

  • ST_Crosses(*g1*, *g2*)

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

    • 除非*g1g2都是维度 1:g1十字架g2如果内部g2与内部有共同点g1, 但g2没有覆盖整个内部g1*.

    • 如果两者*g1g2*维数为 1:如果线在有限数量的点中相互交叉(即没有公共线段,只有单个公共点)。

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

    ST_Crosses()如本节介绍中所述处理其参数,但返回值是空值对于这些附加条件:

    • *g1*是维度 2 (多边形要么多多边形)。

    • *g2*是维度 1 (观点要么多点)。

  • ST_不相交(*g1*, *g2*)

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

    ST_Disjoint()如本节介绍中所述处理其参数。

  • ST_距离(*g1*, *g2* [, *单元*])

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

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

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

    • ST_Distance()检测地理(椭球)空间参考系统中的参数并返回椭球上的大地距离。从 MySQL 8.0.18 开始,ST_Distance()支持所有几何类型的地理 SRS 参数的距离计算。在 MySQL 8.0.18 之前,唯一允许的地理参数类型是观点观点, 要么观点多点(以任何参数顺序)。如果在地理 SRS 中与其他几何类型参数组合一起调用,则ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS (opens new window)发生错误。

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

    • 如果中间或最终结果产生或一个负数,一个ER_GIS_INVALID_DATA (opens new window)发生错误。

      从 MySQL 8.0.14 开始,ST_Distance()允许一个可选的*单元参数,指定返回的距离值的线性单位。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()功能。

  • ST_等于(*g1*, *g2*)

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

    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* [, *单元*])

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

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

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

    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* [, *单元*])

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

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

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

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

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

    ST_Intersects()如本节介绍中所述处理其参数。

  • ST_重叠(*g1*, *g2*)

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

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

    ST_Overlaps()如本节介绍中所述处理其参数,但返回值是空值对于两个几何形状的尺寸不相等的附加条件。

  • ST_Touches(*g1*, *g2*)

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

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

    ST_Touches()如本节介绍中所述处理其参数,但返回值是空值对于两个几何尺寸均为 0 的附加条件(观点要么多点)。

  • ST_Within(*g1*, *g2*)

    返回 1 或 0 表示是否*g1在空间上g2*.这测试了相反的关系ST_Contains().

    ST_Within()如本节介绍中所述处理其参数。