除非另有说明,本部分中介绍的函数处理几何参数的方式如下:● 如果几何参数不是语法良好的几何值,就会发生 ER_GIS_INVALID_DATA 错误。● 如果几何参数是语法良好的几何值,但处于未定义的空间参照系统(SRS),会发生 ER_SRS_NOT_FOUND 错误。● 对于接受多个几何参数的函数,如果这些参数不在同一个SRS中,会发生 ER_GIS_DIFFERENT_SRIDS 错误。● ST_Distance_Sphere(g1,g2 [, radius])返回球面上 Point 或 MultiPoint 参数之间的最小球面距离,单位为米。可选的radius参数应该以米为单位。如果两个几何参数在 SRID 0 中都是有效的笛卡尔 Point 或 MultiPoint 值,则返回值是在给定半径的球体上两个几何参数之间的最短距离。如果省略,默认半径为 6370986 米,点 X 和点 Y 坐标分别解释为经度和纬度,以度数表示。如果两个几何参数都是在地理空间参照系统(SRS)中有效的 Point 或 MultiPoint 值,则返回值是在给定半径的球体上两个几何参数之间的最短距离。如果省略,默认半径等于平均半径,定义为 (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_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE 错误(在 MySQL8.0.12 之前是 ER_LONGITUDE_OUT_OF_RANGE 错误)。○如果纬度值不在 [−90, 90] 范围内,则会出现 ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE 错误(在 MySQL8.0.12 之前是 ER_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 不支持 GIS EMPTY 值,如 POINT EMPTY。ST_IsValid() 按本部分开头中所介绍处理它的参数,但有一个例外:■ 如果几何值的地理SRS的经度或纬度超出范围,则会发生错误:○如果经度值不在(−180, 180] 范围内,则会出现 ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE 错误(在 MySQL8.0.12 之前是 ER_LONGITUDE_OUT_OF_RANGE 错误)。○如果纬度值不在[−90, 90] 范围内,则会出现 ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE 错误(在 MySQL8.0.12 之前是 ER_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 |
+------------------+
复制
● ST_MakeEnvelope(pt1, pt2)返回在两个点周围形成信封的矩形,值为 Point、LineString 或 Polygon。使用笛卡尔坐标系而不是在球面、椭球面或地球上进行计算。给定两个点pt1和pt2,ST_MakeEnvelope()在抽象平面上创建结果几何,如下所示:■ 如果 pt1和 pt2相等,结果是点 pt1。 ■ 如果 (pt1, pt2) 是一个垂直或水平线段,则结果是线段 (pt1, pt2)。 ■ 其他情况下,结果是一个使用 pt1和pt2作为对角线点的多边形。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)) |
+----------------------------------------+
复制
● ST_Simplify(g, max_distance)使用 Douglas-Peucker 算法简化几何值,并返回相同类型的简化值。几何值可以是任何几何类型,尽管 Douglas-Peucker 算法实际上可能不能处理每一种类型。几何集合的处理方法是将其组成部分一个个地交给简化算法,并将返回的几何值放入几何集合中。max_distance参数是一个顶点到要移除的其他段的距离(以输入坐标为单位)。在简化后的 linestring 距离内的顶点将被删除。根据 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() 在本例中直接返回它,而不进行进一步的检查。从 MySQL 8.0.13 开始,ST_Validate() 按本部分开始的描述处理它的参数,除了这些例外:■ 如果几何值的地理SRS的经度或纬度超出范围,则会发生错误:○如果经度值不在(−180, 180] 范围内,则会出现 ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE 错误(在 MySQL8.0.12 之前是 ER_LONGITUDE_OUT_OF_RANGE 错误)。○如果纬度值不在[−90, 90] 范围内,则会出现 ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE 错误(在 MySQL8.0.12 之前是 ER_LATITUDE_OUT_OF_RANGE 错误)。所示范围以度数表示。由于浮点运算,精确的范围限制略有偏差。在 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) |
+------------------------------+
复制
https://dev.mysql.com/doc/refman/8.0/en/spatial-convenience-functions.html