使用对象形状的空间关系函数
OpenGIS规范定义了以下功能,以使用精确的对象形状来测试两个几何值g1
和之间的关系g2
。返回值1和0分别表示true和false,除了之外ST_Distance()
,返回距离值。
本节中的函数检测笛卡尔或地理空间参考系统(SRS)中的自变量,并返回适合于SRS的结果。
除非另有说明,否则本节中的函数将按以下方式处理其参数:
- 如果任何自变量为
NULL
或任何几何自变量为空几何,则返回值为NULL
。 - 如果任何几何参数都不是语法上格式正确的几何,
ER_GIS_INVALID_DATA
则会发生错误。 - 如果任何几何参数都引用了未定义的空间参考系统(SRS),
ER_SRS_NOT_FOUND
则会发生错误。 - 对于带有多个几何参数的函数,如果这些参数不具有相同的SRID,
ER_GIS_DIFFERENT_SRIDS
则会发生错误。 - 如果任何几何参数在几何上均无效,则结果为true或false(不确定哪个),否则将发生错误。
对于地理SRS几何参数,如果任何参数的经度或纬度超出范围,则会发生错误:
- 如果经度值不在(-180,180]范围内,
ER_LONGITUDE_OUT_OF_RANGE
则会发生错误。 - 如果纬度值不在[-90,90]范围内,
ER_LATITUDE_OUT_OF_RANGE
则会发生错误。
显示的范围以度为单位。如果SRS使用其他单位,则范围使用其单位中的相应值。精确的范围限制由于浮点运算而略有不同。
- 如果经度值不在(-180,180]范围内,
- 否则,返回值为non-
NULL
。
这些对象形状函数可用于测试几何关系:
ST_Contains(g1,g2)
返回1或0以指示是否
g1
完全包含g2
。这将测试相反的关系为ST_Within()
。ST_Contains()
按照本节简介中所述处理其参数。ST_Crosses(g1,g2)
如果两个几何的空间关系具有以下属性,则它们在空间上交叉:
- 除非
g1
和g2
均为维度1:如果的内部与的内部具有共同点,但不覆盖的整个内部,则g1
交叉。g2
g2
g1
g2
g1
- 如果两者
g1
和g2
的尺寸均为1:如果线在有限数量的点上彼此交叉(即,没有公共线段,则只有一个公共点)。
此函数返回1或0以指示是否在
g1
空间上交叉g2
。ST_Crosses()
按照本节简介中的描述处理其参数,但返回值适用NULL
于以下附加条件:g1
的尺寸为2(Polygon
或MultiPolygon
)。g2
的尺寸为1(Point
或MultiPoint
)。
- 除非
ST_Disjoint(g1,g2)
返回1或0以指示是否
g1
在空间上不相交(不相交)g2
。ST_Disjoint()
按照本节简介中所述处理其参数。ST_Distance(g1,g2[,unit])
回报之间的距离
g1
和g2
在空间参照系的长度单位的几何形状参数(SRS),或在可选的单元测量unit
参数如果指定。此函数通过返回两个几何参数的分量的所有组合中的最短距离来处理几何图形集合。
ST_Distance()
如本节简介中所述处理其几何参数,但以下情况除外:ST_Distance()
在地理(椭圆形)空间参考系统中检测自变量,并返回椭圆形上的大地测量距离。从MySQL 8.0.18开始,ST_Distance()
支持所有几何类型的地理SRS自变量的距离计算。在MySQL 8.0.18之前,唯一允许的地理参数类型是Point
和Point
,或Point
和MultiPoint
(以任何参数顺序)。如果在地理SRS中与其他几何类型参数组合一起调用,ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
则会发生错误。- 如果任何参数在几何上都是无效的,则结果是未定义的距离(即,可以是任意数字),或者发生错误。
- 如果产生中间或最终结果
NaN
或负数,ER_GIS_INVALID_DATA
则会发生错误。
从MySQL 8.0.14开始,
ST_Distance()
允许使用可选unit
参数,该参数指定返回距离值的线性单位。这些规则适用:- 如果指定了单位但MySQL不支持该单位,
ER_UNIT_NOT_FOUND
则会发生错误。 - 如果指定了支持的线性单位且SRID为0,
ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT
则会发生错误。 - 如果指定了受支持的线性单位且SRID不为0,则结果以该单位为单位。
- 如果未指定单位,则结果以几何的SRS单位(无论是笛卡尔坐标还是地理坐标)为单位。当前,所有MySQL SRS均以米表示。
如果在
INFORMATION_SCHEMA
ST_UNITS_OF_MEASURE
表中找到了单位,则该单位受支持。请参见“ INFORMATION_SCHEMA ST_UNITS_OF_MEASURE表”。mysql>
SET @g1 = Point(1,1); mysql>SET @g2 = 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_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()
按照本节简介中的描述处理其参数,除了返回值是NULL
针对两个几何都为维0(Point
或MultiPoint
)的附加条件。ST_Within(g1,g2)
返回1或0以指示是否
g1
在内g2
。这将测试相反的关系为ST_Contains()
。ST_Within()
按照本节简介中所述处理其参数。