文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  使用对象形状的空间关系函数

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

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

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

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

  • 如果任何实参为 NULL,或任何几何实参为空几何,则返回值为 NULL

  • 如果任何几何实参不是语法上格式良好的几何,则会发生 ER_GIS_INVALID_DATA 错误。

  • 如果任何几何实参是在未定义的空间参考系统 (SRS) 中语法上格式良好的几何,则会发生 ER_SRS_NOT_FOUND 错误。

  • 对于接受多个几何实参的函数,如果这些实参不在同一个 SRS 中,则会发生 ER_GIS_DIFFERENT_SRIDS 错误。

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

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

    显示的范围以度为单位。如果 SRS 使用其他单位,则范围使用其单位中的相应值。由于浮点运算,确切的范围限制略有不同。

  • 否则,返回值为非 NULL

本节中的一些函数允许使用一个单位实参,该实参指定返回值的长度单位。除非另有说明,函数处理其单位实参的方式如下

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

  • ST_Contains(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() 处理其实参的方式如本节开头所述,但返回值在以下附加条件下为 NULL

    • g1 是 2 维的 (PolygonMultiPolygon)。

    • g2 是 1 维的 (PointMultiPoint)。

  • ST_Disjoint(g1, g2)

    返回 1 或 0 以指示 g1 是否与 g2 空间分离(不交叉)。

    ST_Disjoint() 处理其实参的方式如本节开头所述。

  • ST_Distance(g1, g2 [, unit])

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

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

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

    • ST_Distance() 检测地理(椭球体)空间参考系统中的参数,并返回椭球体上的大地测量距离。 ST_Distance() 支持对所有几何类型的地理 SRS 参数进行距离计算。

    • 如果任何参数在几何上无效,则结果是未定义的距离(即它可以是任何数字),或者发生错误。

    • 如果中间结果或最终结果产生NaN或负数,则会发生ER_GIS_INVALID_DATA错误。

    ST_Distance() 允许使用可选的unit参数来指定返回距离值的线性单位,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_Equals(g1, g2)

    返回 1 或 0 以指示g1在空间上是否等于g2

    ST_Equals() 处理其参数的方式如本节介绍中所述,但它不会为空几何参数返回NULL

    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 [, unit])

    返回两个几何体之间的离散弗雷歇距离,反映了两个几何体的相似程度。结果是一个双精度数字,以几何参数的空间参考系统 (SRS) 的长度单位测量,或者如果给出了unit参数,则以该参数的长度单位测量。

    此函数实现了离散弗雷歇距离,这意味着它仅限于几何体点之间的距离。例如,给定两个LineString参数,只考虑几何体中明确提到的点。不会考虑这些点之间线段上的点。

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

    ST_FrechetDistance() 处理其可选的unit参数的方式如本节介绍中所述。

    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 |
    +----------------------------------------+
  • ST_HausdorffDistance(g1, g2 [, unit])

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

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

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

    • 如果几何参数在相同的笛卡尔或地理 SRS 中,但不在支持的组合中,则会发生ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRSER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误,具体取决于 SRS 类型。支持以下组合:

      • LineStringLineString

      • PointMultiPoint

      • LineStringMultiLineString

      • MultiPointMultiPoint

      • MultiLineStringMultiLineString

    ST_HausdorffDistance() 处理其可选的unit参数的方式如本节介绍中所述。

    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 |
    +------------------------------------------+
  • ST_Intersects(g1, g2)

    返回 1 或 0 以指示g1是否在空间上与g2相交。

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

  • ST_Overlaps(g1, g2)

    如果两个几何体相交,并且它们的交集结果是一个与给定几何体中任何一个几何体维度相同但不同于任何一个几何体的几何体,则称这两个几何体在空间上重叠

    此函数返回 1 或 0 以指示g1是否在空间上与g2重叠。

    ST_Overlaps() 处理其参数的方式如本节介绍中所述,但对于两个几何体维度不相同的附加条件,其返回值为NULL

  • ST_Touches(g1, g2)

    如果两个几何体的内部不相交,但其中一个几何体的边界与另一个几何体的边界或内部相交,则称这两个几何体在空间上接触

    此函数返回 1 或 0 以指示g1是否在空间上与g2接触。

    ST_Touches() 处理其参数的方式如本节介绍中所述,但对于两个几何体都是 0 维(PointMultiPoint)的附加条件,其返回值为NULL

  • ST_Within(g1, g2)

    返回 1 或 0 以指示g1是否在空间上位于g2内。这测试了与ST_Contains()相反的关系。

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