本节中的函数提供了对几何值的便捷操作。
除非另有指定,否则本节中的函数将其几何参数处理如下:
-
如果任何参数为
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)中的有效点或多点值,则返回值是球面上两个几何体之间的最短距离。如果省略,默认半径等于 SRS 的平均半径,定义为 (2a+b)/3,其中 a 是 SRS 的半长轴,b 是 SRS 的半短轴。
ST_Distance_Sphere()
按照本节介绍处理其参数,以下是例外情况:-
支持的几何参数组合是点和点,或者点和多点(在任何参数顺序中)。如果至少一个几何体既不是点也不是多点,并且其 SRID 是 0,则发生
ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS
错误。如果至少一个几何体既不是点也不是多点,并且其 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
错误。 -
如果任何几何图形具有地理 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)) | +----------------------------------------+
-
-
使用 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
。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) | +------------------------------+
-