14.16.13 空间便利函数
本节中的函数提供了对几何值的便捷操作。
除非另有指定,以下函数在处理几何参数时遵循以下规则:
-
如果任何参数为
NULL
,则返回值为NULL
。 -
如果任何几何参数不是语法正确的几何,出现
ER_GIS_INVALID_DATA
错误。 -
如果任何几何参数是语法正确的几何,但在未定义的空间参考系统(SRS)中,出现
ER_SRS_NOT_FOUND
错误。 -
对于需要多个几何参数的函数,如果这些参数不在同一个SRS中,出现
ER_GIS_DIFFERENT_SRIDS
错误。 -
否则,返回值不是
NULL
。
这些便捷函数可用:
-
ST_Distance_Sphere(
g1
,g2
[,radius
])返回两个点或多点之间的最小球面距离,单位为米。 (对于一般距离计算,请见
ST_Distance()
函数。)可选的radius
参数应以米为单位。如果两个几何参数都是有效的笛卡尔点或多点值在SRID 0中,返回值是两个几何体之间的最短距离在球面上,以提供的半径。如果省略,缺省半径为6,370,986米,点X和Y坐标被解释为经度和纬度,分别以度为单位。
如果两个几何参数都是有效的点或多点值在地理空间参考系统(SRS)中,返回值是两个几何体之间的最短距离在球面上,以提供的半径。如果省略,缺省半径等于平均半径,定义为(2a+b)/3,其中a是半大轴,b是半小轴的SRS。
ST_Distance_Sphere()
根据本节的介绍处理其参数,以下例外:-
支持的几何学参数组合是
Point
和Point
,或Point
和MultiPoint
(在任意顺序中)。如果至少一个几何体不是Point
或MultiPoint
,且其 SRID 为 0,出现ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS
错误。如果至少一个几何体不是Point
或MultiPoint
,且其 SRID 指向地理 SRS,出现ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
错误。如果任何几何体指向投影 SRS,出现ER_NOT_IMPLEMENTED_FOR_PROJECTED_SRS
错误。 -
如果任何参数的经度或纬度超出范围,出现错误:
-
如果经度值不在(-180, 180]范围内,出现
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在[−90, 90]范围内,出现
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
错误。
显示的范围是以度为单位。如果 SRS 使用其他单位,范围使用相应的值。实际范围限值因浮点数计算而有所不同。
-
-
如果存在但不为正的
radius
参数,出现ER_NONPOSITIVE_RADIUS
错误。 -
如果距离超出双精度浮点数范围,出现
ER_STD_OVERFLOW_ERROR
错误。
mysql> SET @pt1 = ST_GeomFromText('POINT(0 0)'); mysql> SET @pt2 = ST_GeomFromText('POINT(180 0)'); mysql> SELECT ST_Distance_Sphere(@pt1, @pt2); +--------------------------------+ | ST_Distance_Sphere(@pt1, @pt2) | +--------------------------------+ | 20015042.813723423 | +--------------------------------+
-
-
返回 1,如果参数是几何学有效,0 如果参数不是几何学有效。几何学有效性根据 OGC 规范定义。
唯一有效的空几何学是以空几何学集合值表示。
ST_IsValid()
在这种情况下返回 1。MySQL 不支持 GISEMPTY
值,如POINT EMPTY
。ST_IsValid()
按照本节介绍中描述的方式处理其参数,以下例外:-
如果几何学具有地理 SRS,且经度或纬度超出范围,出现错误:
-
如果经度值不在(-180, 180]范围内,会出现
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在[-90, 90]范围内,会出现
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
错误。
显示的范围是以度为单位。如果SRS使用另一种单位,范围使用该单位的相应值。由于浮点数计算,实际范围略有不同。
-
mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,-0.00 0,0.0 0)'); mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 0, 1 1)'); mysql> SELECT ST_IsValid(@ls1); +------------------+ | ST_IsValid(@ls1) | +------------------+ | 0 | +------------------+ mysql> SELECT ST_IsValid(@ls2); +------------------+ | ST_IsValid(@ls2) | +------------------+ | 1 | +------------------+
-
-
返回两个点形成的 envelope 周围的矩形,作为一个
Point
,LineString
或Polygon
。计算使用的是笛卡尔坐标系,而不是球面、椭球面或地球面。
给定两个点
pt1
和pt2
,ST_MakeEnvelope()
在抽象平面上创建结果几何体。-
如果
pt1
和pt2
相等,结果是点pt1
。 -
否则,如果
(
是竖直或水平线段,结果是线段pt1
,pt2
)(
。pt1
,pt2
) -
否则,结果是一个使用
pt1
和pt2
作为对角点的多边形。
结果几何体的 SRID 是 0。
ST_MakeEnvelope()
按照本节介绍中描述的方式处理其参数,以下例外:-
如果参数不是
Point
值,会出现ER_WRONG_ARGUMENTS
错误。 -
如果任何坐标值为无穷大或 NaN,会出现
ER_GIS_INVALID_DATA
错误。 -
如果任何几何体的 SRID 值为地理坐标参考系统(SRS),会出现
ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
错误。
mysql> SET @pt1 = ST_GeomFromText('POINT(0 0)'); mysql> SET @pt2 = ST_GeomFromText('POINT(1 1)'); mysql> SELECT ST_AsText(ST_MakeEnvelope(@pt1, @pt2)); +----------------------------------------+ | ST_AsText(ST_MakeEnvelope(@pt1, @pt2)) | +----------------------------------------+ | POLYGON((0 0,1 0,1 1,0 1,0 0)) | +----------------------------------------+
-
-
使用 Douglas-Peucker 算法简化一个几何体,并返回一个同类型的简化值。
几何体可以是任何几何类型,但是 Douglas-Peucker 算法可能不会实际处理每种类型。几何体集合被处理为一个一个地将其组件传递给简化算法,然后将返回的几何体组合成一个几何体集合。
参数
max_distance
是输入坐标的单位距离,用于删除简化线段中的顶点。距离在这个距离以内的顶点将被删除。根据 Boost.Geometry,简化过程可能会使几何体无效,并且可能会创建自交点。为了检查结果的有效性,请将其传递给
ST_IsValid()
。ST_Simplify()
按照本节介绍的方式处理其参数,以下是例外:-
如果参数
max_distance
不是正数或是NaN
,将发生ER_WRONG_ARGUMENTS
错误。
mysql> SET @g = ST_GeomFromText('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)'); mysql> SELECT ST_AsText(ST_Simplify(@g, 0.5)); +---------------------------------+ | ST_AsText(ST_Simplify(@g, 0.5)) | +---------------------------------+ | LINESTRING(0 0,0 1,1 1,2 3,3 3) | +---------------------------------+ mysql> SELECT ST_AsText(ST_Simplify(@g, 1.0)); +---------------------------------+ | ST_AsText(ST_Simplify(@g, 1.0)) | +---------------------------------+ | LINESTRING(0 0,3 3) | +---------------------------------+
-
-
根据 OGC 规范验证一个几何体。一个几何体可以是语法上正确(WKB 值加 SRID),但几何上无效。例如,这个多边形是几何上无效:
POLYGON((0 0, 0 0, 0 0, 0 0, 0 0))
ST_Validate()
如果几何体是语法上正确且几何上有效,则返回几何体;否则,如果几何体不是语法上正确或不是几何上有效或是NULL
,则返回NULL
。ST_Validate()
可以用来过滤无效几何体数据,但是需要付出代价。对于需要更精确结果且不受无效数据影响的应用程序,这个代价可能是值得的。如果几何体是有效的,它将被返回,除非输入
Polygon
或MultiPolygon
的环形是顺时针的,那么这些环形将被反转,然后检查有效性。如果几何体是有效的,返回的值将是反转环形的值。唯一有效的空几何体是以空几何体集合值表示。
ST_Validate()
在这种情况下直接返回该值,而不进行进一步检查。ST_Validate()
按照本节介绍的方式处理其参数,以下是例外:-
如果几何体具有地理 SRS,且经度或纬度超出范围,错误将发生:
-
如果经度值不在范围(-180, 180]内,将发生
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在范围[-90, 90]内,将发生
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
错误。
显示的范围是以度为单位的。由于浮点数计算的精度限制,实际范围的上下限会有轻微的偏差。
-
mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0)'); mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 0, 1 1)'); mysql> SELECT ST_AsText(ST_Validate(@ls1)); +------------------------------+ | ST_AsText(ST_Validate(@ls1)) | +------------------------------+ | NULL | +------------------------------+ mysql> SELECT ST_AsText(ST_Validate(@ls2)); +------------------------------+ | ST_AsText(ST_Validate(@ls2)) | +------------------------------+ | LINESTRING(0 0,1 1) | +------------------------------+
-