12.16.12 空间便利功能

本节中的功能提供了对几何值的便捷操作。

ST_Distance_Sphere(g1,g2 [,radius])

返回球体上两个点和/或多点之间的最小球面距离,以米为单位;如果任何几何参数为NULL或为空,则返回NULL

计算使用球形地球和可配置的半径。可选的* radius 参数应以米为单位。如果省略,则默认半径为 6,370,986 米。如果 radius *参数存在但不是正数,则发生ER_WRONG_ARGUMENTS错误。

几何参数应由指定(经度,纬度)坐标值的点组成:

  • 经度和纬度分别是该点的第一和第二坐标。

    • 两个坐标均以度为单位。

    • 经度值必须在(-180,180]范围内。正值位于本初子午线以东。

    • 纬度值必须在[-90,90]范围内。正值位于赤道以北。

支持的参数组合为(PointPoint),(PointMultiPoint)和(MultiPointPoint)。其他组合发生ER_GIS_UNSUPPORTED_ARGUMENT错误。

如果任何几何参数都不是语法上格式正确的几何字节字符串,则会发生ER_GIS_INVALID_DATA错误。

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.如果参数为NULL,则返回值为NULL。几何有效性由 OGC 规范定义。

唯一有效的空几何以空几何集合值的形式 table 示。 ST_IsValid()在这种情况下返回 1.

ST_IsValid()仅适用于笛卡尔坐标系,并且需要 SRID 为 0 的几何参数。否则会发生ER_WRONG_ARGUMENTS错误。

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)

PointLineStringPolygon的形式返回围绕两点形成信封的矩形。如果任何参数为NULL,则返回值为NULL

使用笛卡尔坐标系而不是在球体,椭球体或地球上进行计算。

给定两个点* pt1 pt2 *,ST_MakeEnvelope()在抽象平面上创建结果几何,如下所示:

  • 如果* pt1 pt2 相等,则结果为点 pt1 *。

    • 否则,如果(pt1, pt2)是垂直或水平线段,则结果是线段(pt1, pt2)

    • 否则,结果是使用* pt1 pt2 *作为对角点的多边形。

结果几何的 SRID 为 0.

ST_MakeEnvelope()要求Point几何参数的 SRID 为 0.否则会发生ER_WRONG_ARGUMENTS错误。

如果任何参数都不是语法上格式正确的几何字节串,或者如果两个点的任何坐标值是无穷大或NaN,则会发生ER_GIS_INVALID_DATA错误。

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 算法简化几何图形,并返回相同类型的简化值。如果任何参数为NULL,则返回值为NULL

尽管 Douglas-Peucker 算法实际上可能不会处理每种类型,但是几何形状可以是任何几何类型。通过将其组成部分逐一赋予简化算法来处理几何图形集合,并将返回的几何图形作为结果放入几何图形集合中。

  • max_distance 参数是顶点到要删除的其他线段的距离(以 Importing 坐标为单位)。在简化线串的此距离内的顶点将被删除。如果 max_distance *参数不是正数或为NaN,则会发生ER_WRONG_ARGUMENTS错误。

根据 Boost.Geometry,由于简化过程,几何形状可能变得无效,并且该过程可能会创建自相交。要检查结果的有效性,请将其传递给ST_IsValid()

如果几何参数不是语法上格式正确的几何字节字符串,则会发生ER_GIS_INVALID_DATA错误。

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()可用于过滤掉无效的几何数据,尽管需要付出一定的代价。对于需要更精确结果而不被无效数据污染的应用程序,此惩罚可能是值得的。

如果 geometry 参数有效,则按原样返回,除非 ImportingPolygonMultiPolygon具有顺时针环,则在检查有效性之前将这些环反转。如果几何有效,则返回带有反转环的值。

唯一有效的空几何以空几何集合值的形式 table 示。 ST_Validate()直接返回,无需进一步检查。

ST_Validate()仅适用于笛卡尔坐标系,并且需要 SRID 为 0 的几何参数。否则会发生ER_WRONG_ARGUMENTS错误。

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)          |
+------------------------------+