14.16.9.1 使用对象形状的空间关系函数
OpenGIS 规范定义了以下函数,用于使用精确的对象形状测试两个几何值 g1
和 g2
之间的关系。返回值 1 和 0 分别表示真和假,除了距离函数返回距离值。
本节中的函数检测笛卡尔或地理空间参考系统 (SRS) 中的参数,并返回适用于 SRS 的结果。
除非另有说明,本节中的函数将其几何参数作为如下方式处理:
-
如果任何参数为
NULL
或任何几何参数为空几何,则返回值为NULL
。 -
如果任何几何参数不是语法上正确的几何形状,则会发生
ER_GIS_INVALID_DATA
错误。 -
如果任何几何参数是未定义空间参考系统 (SRS) 中的语法正确的几何形状,则会发生
ER_SRS_NOT_FOUND
错误。 -
对于需要多个几何参数的函数,如果这些参数不在同一 SRS 中,则会发生
ER_GIS_DIFFERENT_SRIDS
错误。 -
如果任何几何参数在几何上无效,则结果为真或假(未定义),或者发生错误。
-
对于地理 SRS 几何参数,如果任何参数的经度或纬度超出范围,则会发生错误:
-
如果经度值不在范围 (−180, 180] 内,则会发生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在范围 [−90, 90] 内,则会发生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
错误。
所示范围为度。如果 SRS 使用另一个单位,则使用其单位中的相应值。由于浮点数运算,实际范围限制略有偏差。
-
-
否则,返回值不为
NULL
。
本节中的某些函数允许使用单位参数来指定返回值的长度单位。除非另有说明,函数将其单位参数处理如下:
-
如果在
INFORMATION_SCHEMA
ST_UNITS_OF_MEASURE
表中找到单位,则支持该单位。请参见第 28.3.37 节“INFORMATION_SCHEMA ST_UNITS_OF_MEASURE 表”。 -
如果指定了单位,但 MySQL 不支持,则会出现
ER_UNIT_NOT_FOUND
错误。 -
如果指定了受支持的线性单位且 SRID 为 0,则会出现
ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT
错误。 -
如果指定了受支持的线性单位且 SRID 不为 0,则结果将以该单位表示。
-
如果未指定单位,则结果将以几何图形的 SRS 单位表示,无论是笛卡尔坐标还是地理坐标。目前,所有 MySQL SRS 均以米为单位表示。
以下对象形状函数可用于测试几何关系:
-
返回 1 或 0 表示
g1
是否完全包含g2
。这测试了与ST_Within()
相反的关系。ST_Contains()
按照本部分介绍中的说明处理其参数。 -
如果两个几何图形具有以下属性,则它们的空间关系为“相交”:
-
除非
g1
和g2
均为一维:如果g2
的内部与g1
的内部有公共点,但g2
并未覆盖g1
的整个内部,则g1
相交于g2
。 -
如果
g1
和g2
均为一维:当它们以有限数量的点交叉(即,没有共同的线段,只有单个的公共点)时。
此函数返回 1 或 0 指示
g1
是否与g2
相交。ST_Crosses()
按本部分介绍中的说明处理其参数,但对于以下附加条件,返回值为NULL
:-
g1
为二维(Polygon
或MultiPolygon
)。 -
g2
为一维(Point
或MultiPoint
)。
-
-
返回 1 或 0,以指示
g1
是否与g2
在空间上不相交(不相交)。ST_Disjoint()
按本节介绍的方式处理其参数。 -
返回
g1
和g2
之间的距离,以几何参考系统 (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()
函数。 -
-
返回 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
])返回两个几何图形之间离散的 Frechet 距离,反映它们之间的相似程度。结果为双精度数字,以几何图形参数的空间参考系统 (SRS) 的长度单位为单位,或者以
unit
参数给定的单位为单位。此函数实现离散 Frechet 距离,即它仅限制在几何图形的点之间的距离。例如,对于两个
LineString
参数,仅考虑几何图形中明确提到的点。这些点之间线段上的点不被考虑。ST_FrechetDistance()
按照本节介绍的方式处理其几何图形参数,但有以下例外情况:-
这些几何图形可以具有笛卡尔或地理 SRS,但仅支持
LineString
值。如果参数位于相同的笛卡尔或地理 SRS 中,但其中任何一个都不是LineString
,则会出现ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS
或ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
错误,具体取决于 SRS 类型。
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
])返回两个几何图形的离散 Hausdorff 距离,反映它们之间的相似程度。结果为双精度数,以几何图形参数的空间参考系统 (SRS) 的长度单位为单位,或者以
unit
参数给定的单位为单位。此函数实现离散 Hausdorff 距离,这意味着它仅限于几何图形的点之间的距离。例如,对于两个
LineString
参数,仅考虑几何图形中明确提到的点。这些点之间线段上的点不被考虑。ST_HausdorffDistance()
按照本节介绍的方式处理其几何参数,但有以下例外:-
如果几何参数在同一笛卡尔或地理 SRS 中,但不处于支持的组合中,则会出现
ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS
或ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
错误,具体取决于 SRS 类型。支持以下组合:-
LineString
和LineString
-
Point
和MultiPoint
-
LineString
和MultiLineString
-
MultiPoint
和MultiPoint
-
MultiLineString
和MultiLineString
-
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 | +------------------------------------------+
-
-
返回 1 或 0,表示
g1
是否与g2
在空间上相交。ST_Intersects()
按照本节介绍的方式处理其参数。 -
如果两个几何体相交并且它们的交集结果为相同维度的几何体但不等于给定的任一几何体,则认为这两个几何体在空间上 重叠。
此函数返回 1 或 0,表示
g1
是否与g2
在空间上相交。ST_Overlaps()
按照本节介绍的方式处理其参数,除了对于两个几何体的维度不相等的附加条件,返回值为NULL
。 -
如果两个几何体的内部不相交,但一个几何体的边界与另一个几何体的边界或内部相交,则认为这两个几何体在空间上 接触。
该函数返回 1 或 0 以指示
g1
是否在空间上与g2
接触。ST_Touches()
处理其参数的方式与本节介绍中的方式相同,但返回值为NULL
,除了以下附加条件之外:如果两个几何图形的维度均为 0(Point
或MultiPoint
)。 -
返回 1 或 0 以指示
g1
在空间上是否是否在g2
内。这测试与ST_Contains()
相反的关系。ST_Within()
处理其参数的方式与本节介绍中的方式相同。