本节中的函数提供了对几何值的便利操作。
除非另有说明,本节中的函数处理其几何参数如下:
如果任何参数为
NULL
,则返回值为NULL
。如果任何几何参数不是语法上格式良好的几何,则会发生
ER_GIS_INVALID_DATA
错误。如果任何几何参数是未定义空间参考系统 (SRS) 中语法上格式良好的几何,则会发生
ER_SRS_NOT_FOUND
错误。对于接受多个几何参数的函数,如果这些参数不在同一个 SRS 中,则会发生
ER_GIS_DIFFERENT_SRIDS
错误。否则,返回值为非
NULL
。
这些便利函数可用
ST_Distance_Sphere(
g1
,g2
[,radius
])返回
Point
或MultiPoint
参数在球体上的最小球面距离,以米为单位。(对于通用距离计算,请参见ST_Distance()
函数。)可选的radius
参数应以米为单位给出。如果两个几何参数都是 SRID 为 0 的有效笛卡尔
Point
或MultiPoint
值,则返回值是在具有提供半径的球体上这两个几何之间的最短距离。如果省略,默认半径为 6,370,986 米,点 X 和 Y 坐标分别解释为经度和纬度,单位为度。如果两个几何参数都是地理空间参考系统 (SRS) 中的有效
Point
或MultiPoint
值,则返回值是在具有提供半径的球体上这两个几何之间的最短距离。如果省略,默认半径等于平均半径,定义为 (2a+b)/3,其中 a 是 SRS 的长半轴,b 是短半轴。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 | +------------------+
返回围绕两个点形成的矩形,作为一个
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) | +------------------------------+