本节中的函数提供了对几何值的便捷操作。
除非另有指定,否则本节中的函数将其几何参数处理如下:
-
如果任何参数为
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) | +------------------------------+ -