OpenGIS 规范定义了以下函数,以测试两个几何值 g1
和 g2
之间的关系,使用精确的对象形状。返回值 1 和 0 分别表示 true 和 false,除非距离函数返回距离值。
本节中的函数可以检测 Cartesian 或地理空间参考系统(SRS)中的参数,并返回适合 SRS 的结果。
除非另有说明,本节中的函数将其几何参数处理如下:
-
如果任何参数为
NULL
或任何几何参数为空几何,则返回值为NULL
。 -
如果任何几何参数不是语法正确的几何体,将发生
ER_GIS_INVALID_DATA
错误。 -
如果任何几何参数是未定义的空间参考系统(SRS)中的语法正确的几何体,将发生
ER_SRS_NOT_FOUND
错误。 -
对于多个几何参数的函数,如果这些参数不在同一个 SRS 中,将发生
ER_GIS_DIFFERENT_SRIDS
错误。 -
如果任何几何参数是几何无效的,结果将是 true 或 false(它是未定义的),或者发生错误。
-
对于地理 SRS 几何参数,如果任何参数的经度或纬度超出范围,将发生错误:
-
如果经度值不在范围 (−180, 180] 内,将发生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在范围 [−90, 90] 内,将发生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
错误。
显示的范围以度为单位。如果 SRS 使用其他单位,范围将使用该单位对应的值。由于浮点算术,exact 范围限制略有偏差。
-
-
否则,返回值不是
NULL
。
本节中的某些函数允许指定单位参数,以指定返回值的长度单位。除非另有说明,函数处理其单位参数如下:
-
如果单位在
INFORMATION_SCHEMA
ST_UNITS_OF_MEASURE
表中找到,则支持该单位。见 Section 28.3.37, “The INFORMATION_SCHEMA ST_UNITS_OF_MEASURE Table”。 -
如果指定了单位但 MySQL 不支持,将发生
ER_UNIT_NOT_FOUND
错误。 -
如果指定了支持的线性单位且 SRID 为 0,将发生
ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT
错误。 -
如果指定了支持的线性单位且 SRID 不为 0,结果将以该单位表示。
-
如果未指定单位,结果将以 SRS 的单位表示,无论是 Cartesian 还是地理的。目前,所有 MySQL SRS 都以米为单位。
这些对象形状函数可用于测试几何关系:
-
返回 1 或 0,以指示
g1
是否完全包含g2
。这测试了与ST_Within()
相反的关系。ST_Contains()
按照本节介绍处理其参数。 -
两个几何体 空间交叉 如果它们的空间关系具有以下属性:
-
除非
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
)。
-
-
返回 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
参数指定返回距离值的线性单位,如本节介绍中所述。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
])返回两个几何体之间的离散 Fréchet 距离,反映了几何体的相似度。结果是一个双精度数字,以空间参考系统(SRS)的长度单位测量,或者如果给出了
unit
参数,则以该参数的长度单位测量。该函数实现了离散 Fréchet 距离,这意味着它仅限于几何体点之间的距离。例如,给定两个
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()
按照本节引言中所述处理其参数。