12.16.8 空间运算符功能
OpenGIS 提出了许多可以产生几何形状的功能。它们旨在实现空间 operator。
这些函数支持所有参数类型组合,但根据开放地理空间 union规范不适用的除外。
Buffer(g, d[, strategy1[, strategy2[, strategy3]]])
ST_Buffer()和Buffer()是同义词。有关更多信息,请参见ST_Buffer()的描述。
Buffer()已过时,将在以后的 MySQL 版本中删除。请改用ST_Buffer()。
ST_ConvexHull()和ConvexHull()是同义词。有关更多信息,请参见ST_ConvexHull()的描述。
ConvexHull()已过时,将在以后的 MySQL 版本中删除。请改用ST_ConvexHull()。
ST_Buffer(g, d[, strategy1[, strategy2[, strategy3]]])
返回 table 示所有与几何值* g
的距离小于或等于 d
*或NULL
(如果任何参数为NULL
)的距离的所有点的几何。几何参数的 SRID 必须为 0,因为ST_Buffer()仅支持笛卡尔坐标系。如果任何几何参数都不是语法上格式正确的几何,则会发生ER_GIS_INVALID_DATA错误。
如果 geometry 参数为空,则ST_Buffer()返回空的几何。
如果距离为 0,则ST_Buffer()返回几何参数不变:
mysql> SET @pt = ST_GeomFromText('POINT(0 0)');
mysql> SELECT ST_AsText(ST_Buffer(@pt, 0));
+------------------------------+
| ST_AsText(ST_Buffer(@pt, 0)) |
+------------------------------+
| POINT(0 0) |
+------------------------------+
ST_Buffer()支持Polygon
和MultiPolygon
值以及包含Polygon
或MultiPolygon
值的几何图形集合的负距离。结果可能是空的几何。 ST_Buffer()发生ER_WRONG_ARGUMENTS错误,而Point
,MultiPoint
,LineString
和MultiLineString
值的负距离以及不包含任何Polygon
或MultiPolygon
值的几何图形集合的错误。
ST_Buffer()允许在 distance 参数后面最多三个可选的策略参数。策略影响缓冲区的计算。这些参数是ST_Buffer_Strategy()函数产生的字节字符串值,用于点,联接和结束策略:
-
点策略适用于
Point
和MultiPoint
几何形状。如果未指定任何策略,则默认值为ST_Buffer_Strategy('point_circle', 32)。-
联接策略适用于
LineString
,MultiLineString
,Polygon
和MultiPolygon
几何。如果未指定连接策略,则默认值为ST_Buffer_Strategy('join_round', 32)。 -
最终策略适用于
LineString
和MultiLineString
几何形状。如果未指定结束策略,则默认值为ST_Buffer_Strategy('end_round', 32)。
-
每种类型最多可以指定一种策略,并且可以以任何 Sequences 给出它们。如果指定了给定类型的多个策略,则会发生ER_WRONG_ARGUMENTS错误。
mysql> SET @pt = ST_GeomFromText('POINT(0 0)');
mysql> SET @pt_strategy = ST_Buffer_Strategy('point_square');
mysql> SELECT ST_AsText(ST_Buffer(@pt, 2, @pt_strategy));
+--------------------------------------------+
| ST_AsText(ST_Buffer(@pt, 2, @pt_strategy)) |
+--------------------------------------------+
| POLYGON((-2 -2,2 -2,2 2,-2 2,-2 -2)) |
+--------------------------------------------+
mysql> SET @ls = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
mysql> SET @end_strategy = ST_Buffer_Strategy('end_flat');
mysql> SET @join_strategy = ST_Buffer_Strategy('join_round', 10);
mysql> SELECT ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy))
+---------------------------------------------------------------+
| ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy)) |
+---------------------------------------------------------------+
| POLYGON((5 5,5 10,0 10,-3.5355339059327373 8.535533905932738, |
| -5 5,-5 0,0 0,5 0,5 5)) |
+---------------------------------------------------------------+
ST_Buffer()和Buffer()是同义词。
ST_Buffer_Strategy(strategy[, points_per_circle])
此函数返回一个策略字节字符串,与ST_Buffer()一起使用以影响缓冲区计算。如果任何参数为NULL
,则返回值为NULL
。如果任何参数无效,则会发生ER_WRONG_ARGUMENTS错误。
有关策略的信息可在Boost.org获得。
第一个参数必须是指示策略选项的字符串:
-
对于 Integration 策略,允许的值为
'point_circle'
和'point_square'
。-
对于联接策略,允许的值为
'join_round'
和'join_miter'
。 -
对于最终策略,允许的值为
'end_round'
和'end_flat'
。
-
如果第一个参数是'point_circle'
,'join_round'
,'join_miter'
或'end_round'
,则必须将* points_per_circle
*作为正数给出。 * points_per_circle
的最大值是max_points_in_geometry系统变量的值。如果第一个参数是'point_square'
或'end_flat'
,则不能提供 points_per_circle
*参数,否则会发生ER_WRONG_ARGUMENTS错误。
有关示例,请参见ST_Buffer()的描述。
返回 table 示几何值* g
*的凸包的几何。如果参数为NULL
,则返回值为NULL
。
该函数通过首先检查几何体的顶点是否共线来计算几何体的凸包。如果是这样,函数将返回线性 Shell,否则返回多边形 Shell。此函数通过提取集合所有组件的所有顶点,从它们创建MultiPoint
值并计算其凸包来处理几何集合。如果参数为空的几何集合,则返回值为NULL
。
mysql> SET @g = 'MULTIPOINT(5 0,25 0,15 10,15 25)';
mysql> SELECT ST_AsText(ST_ConvexHull(ST_GeomFromText(@g)));
+-----------------------------------------------+
| ST_AsText(ST_ConvexHull(ST_GeomFromText(@g))) |
+-----------------------------------------------+
| POLYGON((5 0,25 0,15 25,5 0)) |
+-----------------------------------------------+
ST_ConvexHull()和ConvexHull()是同义词。
返回 table 示几何值* g1
和 g2
*的点集差异的几何。如果任何参数为NULL
,则返回值为NULL
。
mysql> SET @g1 = Point(1,1), @g2 = Point(2,2);
mysql> SELECT ST_AsText(ST_Difference(@g1, @g2));
+------------------------------------+
| ST_AsText(ST_Difference(@g1, @g2)) |
+------------------------------------+
| POINT(1 1) |
+------------------------------------+
返回 table 示几何值* g1
和 g2
*的点集交集的几何。如果任何参数为NULL
,则返回值为NULL
。
mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
mysql> SELECT ST_AsText(ST_Intersection(@g1, @g2));
+--------------------------------------+
| ST_AsText(ST_Intersection(@g1, @g2)) |
+--------------------------------------+
| POINT(2 2) |
+--------------------------------------+
返回 table 示几何值* g1
和 g2
*的点集对称差异的几何,定义为:
g1 symdifference g2 := (g1 union g2) difference (g1 intersection g2)
或者,在函数调用 table 示法中:
ST_SymDifference(g1, g2) = ST_Difference(ST_Union(g1, g2), ST_Intersection(g1, g2))
如果任何参数为NULL
,则返回值为NULL
。
mysql> SET @g1 = Point(1,1), @g2 = Point(2,2);
mysql> SELECT ST_AsText(ST_SymDifference(@g1, @g2));
+---------------------------------------+
| ST_AsText(ST_SymDifference(@g1, @g2)) |
+---------------------------------------+
| MULTIPOINT((1 1),(2 2)) |
+---------------------------------------+
返回 table 示几何值* g1
和 g2
*的点集并集的几何。如果任何参数为NULL
,则返回值为NULL
。
mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
mysql> SELECT ST_AsText(ST_Union(@g1, @g2));
+--------------------------------------+
| ST_AsText(ST_Union(@g1, @g2)) |
+--------------------------------------+
| MULTILINESTRING((1 1,3 3),(1 3,3 1)) |
+--------------------------------------+
此外,第 12.16.7 节“几何属性函数”讨论了几个从现有几何构造新几何的函数。有关这些功能的说明,请参见该部分: