空间便利功能
本节中的功能提供了对几何值的便捷操作。
除非另有说明,否则本节中的函数将按以下方式处理其参数:
- 如果有任何参数
NULL
,则返回值为NULL
。 - 如果任何几何参数都不是语法上格式正确的几何,
ER_GIS_INVALID_DATA
则会发生错误。 - 如果任何几何参数的SRID值都引用未定义的空间参考系统(SRS),
ER_SRS_NOT_FOUND
则会发生错误。 - 对于带有多个几何参数的函数,如果这些参数不具有相同的SRID,
ER_GIS_DIFFERENT_SRIDS
则会发生错误。 - 否则,返回值为non-
NULL
。
这些便利功能可用:
ST_Distance_Sphere(g1,g2[,radius])
返回球体之间
Point
或MultiPoint
参数上的最小球面距离,以米为单位。(有关通用距离的计算,请参见ST_Distance()
函数。)可选radius
参数应以米为单位。如果两个几何参数都是有效的直角坐标
Point
或MultiPoint
SRID 0中的值,则返回值是具有所提供半径的球体上两个几何之间的最短距离。如果省略,则默认半径为6,370,986米,点X和Y坐标分别解释为经度和纬度(以度为单位)。如果两个几何参数均有效,
Point
或者MultiPoint
是地理空间参考系统(SRS)中的值,则返回值是具有所提供半径的球体上两个几何之间的最短距离。如果省略,则默认半径等于平均半径,定义为(2a + b)/ 3,其中a是SRS的半长轴,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_LONGITUDE_OUT_OF_RANGE
则会发生错误。 - 如果任何纬度参数不在[-90,90]范围内,
ER_LATITUDE_OUT_OF_RANGE
则会发生错误。
显示的范围以度为单位。如果SRS使用其他单位,则范围使用其单位中的相应值。精确的范围限制由于浮点运算而略有不同。
- 如果任何经度参数不在范围内(-180,180],
- 如果
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 | +-------------------------------- +- 支持的几何参数组合为
ST_IsValid(g)
如果参数在几何上有效,则返回1;如果参数在几何上无效,则返回0。几何有效性由OGC规范定义。
唯一有效的空几何以空几何集合值的形式表示。
ST_IsValid()
在这种情况下返回1。MySQL不支持GISEMPTY
值,例如POINT EMPTY
。ST_IsValid()
如本节简介中所述处理其参数,但有以下例外:如果几何图形的经度或纬度超出范围,则将发生错误:
- 如果任何经度参数不在范围内(-180,180],
ER_LONGITUDE_OUT_OF_RANGE
则会发生错误。 - 如果任何纬度参数不在[-90,90]范围内,
ER_LATITUDE_OUT_OF_RANGE
则会发生错误。
显示的范围以度为单位。如果SRS使用其他单位,则范围使用其单位中的相应值。精确的范围限制由于浮点运算而略有不同。
- 如果任何经度参数不在范围内(-180,180],
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 | +------------------ +ST_MakeEnvelope(pt1,pt2)
返回形成围绕两点信封,作为一个矩形
Point
,LineString
或Polygon
。使用笛卡尔坐标系而不是在球体,椭球体或地球上进行计算。
给定两个点
pt1
和pt2
,ST_MakeEnvelope()
在抽象平面上创建结果几何体,如下所示:- 如果
pt1
和pt2
相等,则结果为pointpt1
。 - 否则,如果是垂直或水平线段,则结果为线段。
(pt1,pt2)
(pt1,pt2)
- 否则,结果是使用
pt1
和pt2
作为对角点的多边形。
结果几何的SRID为0。
ST_MakeEnvelope()
如本节简介中所述处理其参数,但以下情况除外:- 如果参数不是
Point
值,ER_WRONG_ARGUMENTS
则会发生错误。 - 一个
ER_GIS_INVALID_DATA
用于附加条件的两个点的任何坐标值为无穷大或发生错误NaN
。 - 如果任何几何都具有地理空间参考系统(SRS)的SRID值,
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)) | +---------------------------------------- +- 如果
ST_Simplify(g,max_distance)
使用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) | +--------------------------------- +- 如果
ST_Validate(g)
根据OGC规范验证几何。几何在语法上可以格式正确(WKB值加SRID),但是在几何上无效。例如,此多边形在几何上是无效的:
POLYGON((0 0, 0 0, 0 0, 0 0, 0 0))
ST_Validate()
NULL
如果参数在语法上格式正确且在几何上有效,则返回几何,如果自变量在语法上格式不正确或在几何上无效或为NULL
。ST_Validate()
可以用于过滤掉无效的几何数据,尽管需要付出一定的代价。对于需要更精确结果而不被无效数据污染的应用程序,此惩罚可能是值得的。如果几何参数有效,则按原样返回,除非输入
Polygon
或MultiPolygon
具有顺时针环,则在检查有效性之前将这些环反转。如果几何有效,则返回带有反转环的值。唯一有效的空几何以空几何集合值的形式表示。
ST_Validate()
在这种情况下,无需进一步检查即可直接返回它。从MySQL 8.0.13开始,
ST_Validate()
按照本节简介中的描述处理其参数,但以下情况除外:如果几何图形的经度或纬度超出范围,则将发生错误:
- 如果任何经度参数不在范围内(-180,180],
ER_LONGITUDE_OUT_OF_RANGE
则会发生错误。 - 如果任何纬度参数不在[-90,90]范围内,
ER_LATITUDE_OUT_OF_RANGE
则会发生错误。
显示的范围以度为单位。精确的范围限制由于浮点运算而略有不同。
- 如果任何经度参数不在范围内(-180,180],
在MySQL 8.0.13之前,
ST_Validate()
按照本节简介中的描述处理其参数,但以下情况除外:- 如果几何结构在语法上不正确,则返回值为
NULL
。一个ER_GIS_INVALID_DATA
不会发生错误。 - 如果几何图形具有用于地理空间参考系统(SRS)的SRID值,
ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
则会发生错误。
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) | +------------------------------ +