14.16.8 空间操作符函数
OpenGIS 提出了一些函数,可以生成几何体。这些函数旨在实现空间操作符。这些函数支持所有可能的参数类型组合,除非根据Open Geospatial Consortium规范不适用。
MySQL 还实现了一些扩展到 OpenGIS 的函数,如函数描述中所提到的。另外,第14.16.7节,“几何体属性函数”讨论了一些从现有几何体构建新几何体的函数。请查看该节了解这些函数的描述:
除非另有指定,以下函数将其几何体参数处理如下:
-
如果任何参数为
NULL
,返回值为NULL
。 -
如果任何几何体参数不是语法正确的几何体,一个
ER_GIS_INVALID_DATA
错误发生。 -
如果任何几何体参数是一个语法正确的几何体,但是在未定义的空间参考系统(SRS)中,一个
ER_SRS_NOT_FOUND
错误发生。 -
对于函数,它们的参数不是在同一个SRS中,一个
ER_GIS_DIFFERENT_SRIDS
错误发生。 -
如果任何几何体参数的SRID值是一个地理SRS,并且函数不支持地理几何体,一个
ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
错误发生。 -
对于地理坐标系SRS几何形状参数,如果任何参数的经度或纬度超出范围,会出现错误:
-
如果经度值不在(-180, 180]范围内,将出现
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在[−90, 90]范围内,将出现
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
错误。
显示的范围是以度为单位。如果SRS使用另一种单位,范围使用该单位对应的值。由于浮点数计算,实际范围略有不同。
-
-
否则,返回值不是
NULL
。
这些空间操作函数可用:
-
ST_Buffer(
g
,d
[,strategy1
[,strategy2
[,strategy3
]]])返回一个表示距离几何形状值
g
的所有点的距离小于或等于距离d
的几何形状。结果在同一个SRS中。如果几何形状参数为空,
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
值的几何形状集合。 -
如果结果被减少到消失,结果是一个空几何形状。
-
将出现
ER_WRONG_ARGUMENTS
错误,对ST_Buffer()
使用负距离的Point
、MultiPoint
、LineString
和MultiLineString
值,以及不包含任何Polygon
或MultiPolygon
值的几何形状集合。
Point
几何形状在地理坐标系SRS中允许,但需要满足以下条件:-
如果距离不为负且没有指定策略,函数返回
Point
在其SRS中的地理缓冲区。距离参数必须在SRS距离单位(当前总是米)中。 -
如果距离为负或指定了策略(除了
NULL
),将出现ER_WRONG_ARGUMENTS
错误。
对于非
Point
几何体,出现ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
错误。ST_Buffer()
允许在距离参数后跟随至多三个可选策略参数。策略会影响缓冲计算。这些参数是由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)
。
每种类型的策略最多只能指定一个,并且可以在任何顺序中指定。
如果缓冲策略无效,出现
ER_WRONG_ARGUMENTS
错误。策略无效的原因是:-
指定了多个相同类型的策略。
-
传递了非策略值(例如任意二进制字符串或数字)作为策略。
-
传递了点策略,但几何体中没有
Point
或MultiPoint
值。 -
传递了连接或结束策略,但几何体中没有
LineString
、Polygon
、MultiLineString
或MultiPolygon
值。
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_Strategy(
strategy
[,points_per_circle
])该函数返回一个策略字节字符串,以便与
ST_Buffer()
一起使用,以影响缓冲计算。关于策略的信息可在Boost.org上找到。
首个参数必须是字符串,表示策略选项:
-
对于点策略,允许的值是
'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
系统变量的值。例如,请参阅
ST_Buffer()
的描述。ST_Buffer_Strategy()
按照本节介绍中所述处理其参数,以下例外:-
如果任何参数无效,则发生
ER_WRONG_ARGUMENTS
错误。 -
如果首个参数是
'point_square'
或'end_flat'
,则不能提供points_per_circle
值,否则发生ER_WRONG_ARGUMENTS
错误。
-
-
返回一个表示几何值
g
的凸包的几何值。这个函数通过首先检查几何值的顶点点是否共线。函数返回线性包围体,如果是,则返回多边形包围体。这个函数处理几何集合的顶点点,创建一个
MultiPoint
值,然后计算其凸包。ST_ConvexHull()
按照本节介绍中所述处理其参数,以下例外:-
返回值为
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)) | +-----------------------------------------------+
-
-
返回一个表示几何值
g1
和g2
的点集差的几何值。结果在几何参数的同一个 SRS 中。ST_Difference()
允许在笛卡尔或地理坐标系中传递参数,并按照本节介绍中描述处理参数。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) | +------------------------------------+
-
返回一个表示点集交集的几何体,点集由几何值
g1
和g2
组成。结果的坐标系与几何参数相同。ST_Intersection()
允许在笛卡尔或地理坐标系中传递参数,并按照本节介绍中描述处理参数。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) | +--------------------------------------+
-
ST_LineInterpolatePoint(
ls
,fractional_distance
)该函数将一个
LineString
几何体和一个在[0.0, 1.0]范围内的分数距离作为输入,并返回该距离点在几何体的起点到终点之间的Point
。它可以用来回答类似于在几何体中哪个Point
点位于中点的问题。该函数对所有笛卡尔和地理坐标系中的
LineString
几何体进行实现。如果
fractional_distance
参数为1.0,结果可能不一定是几何体的最后一个点,但是一点靠近它由于近似值计算的数值不准确性。与之相关的函数
ST_LineInterpolatePoints()
,它也接受类似的参数,但返回一个MultiPoint
几何体,其中包含在几何体中每个距离点的Point
值。例如,见ST_LineInterpolatePoints()
的描述。ST_LineInterpolatePoint()
按照本节介绍中描述处理参数,但以下例外:-
如果几何参数不是
LineString
,则出现ER_UNEXPECTED_GEOMETRY_TYPE
错误。 -
如果分数距离参数超出[0.0, 1.0]范围,出现
ER_DATA_OUT_OF_RANGE
错误。
ST_LineInterpolatePoint()
是 MySQL 对 OpenGIS 的扩展。 -
-
ST_LineInterpolatePoints(<<ls>, <<fractional_distance>>)
该函数将一个
LineString
几何体和一个在范围(0.0, 1.0]中的分数距离作为输入,并返回一个MultiPoint
几何体,该几何体包括LineString
的起点,plusPoint
值沿着LineString
的每个分数距离从其起点到其终点。它可以用来回答问题,如每隔10%的距离沿着道路描述的几何体中哪些Point
值。该函数对所有空间参考系统(包括笛卡尔和地理坐标系)中的
LineString
几何体进行实现。如果<fractional_distance>可以整除1.0且余数为0,结果可能不包含
LineString
的最后一个点,但是一点靠近它,因为在近似值计算中存在数值不准确性。与该函数相关的函数是
ST_LineInterpolatePoint()
,它也接受类似的参数,但返回Point
值沿着LineString
的给定分数距离从其起点到其终点。ST_LineInterpolatePoints()
将其参数按照本节的介绍处理,以下例外:-
如果几何体参数不是
LineString
,将出现ER_UNEXPECTED_GEOMETRY_TYPE
错误。 -
如果分数距离参数在范围[0.0, 1.0]外,出现
ER_DATA_OUT_OF_RANGE
错误。
mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)'); mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .5)); +----------------------------------------------+ | ST_AsText(ST_LineInterpolatePoint(@ls1, .5)) | +----------------------------------------------+ | POINT(0 5) | +----------------------------------------------+ mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .75)); +-----------------------------------------------+ | ST_AsText(ST_LineInterpolatePoint(@ls1, .75)) | +-----------------------------------------------+ | POINT(2.5 5) | +-----------------------------------------------+ mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, 1)); +---------------------------------------------+ | ST_AsText(ST_LineInterpolatePoint(@ls1, 1)) | +---------------------------------------------+ | POINT(5 5) | +---------------------------------------------+ mysql> SELECT ST_AsText(ST_LineInterpolatePoints(@ls1, .25)); +------------------------------------------------+ | ST_AsText(ST_LineInterpolatePoints(@ls1, .25)) | +------------------------------------------------+ | MULTIPOINT((0 2.5),(0 5),(2.5 5),(5 5)) | +------------------------------------------------+
ST_LineInterpolatePoints()
是MySQL对OpenGIS的扩展。 -
-
ST_PointAtDistance(<<ls>, <<distance>>)
该函数将一个
LineString
几何体和一个在范围[0.0,ST_Length(<<ls>)
]中的距离作为输入,并返回该距离从LineString
的起点的Point
值。它可以用来回答问题,如400米从道路描述的几何体的起点的Point
值。该函数对所有空间参考系统(包括笛卡尔和地理坐标系)中的
LineString
几何体进行实现。ST_PointAtDistance()
按照本节介绍中描述的方式处理其参数,以下例外:-
如果几何形状参数不是
LineString
,则出现ER_UNEXPECTED_GEOMETRY_TYPE
错误。 -
如果分数距离参数超出了范围 [0.0,
ST_Length(
),则出现ls
)ER_DATA_OUT_OF_RANGE
错误。
ST_PointAtDistance()
是 MySQL 对 OpenGIS 的扩展。 -
-
返回一个表示几何形状集对称差的几何形状,该几何形状是由几何值
g1
和g2
组成的对称差,该对称差定义为:g1 symdifference g2 := (g1 union g2) difference (g1 intersection g2)
或,以函数调用notation表示:
ST_SymDifference(g1, g2) = ST_Difference(ST_Union(g1, g2), ST_Intersection(g1, g2))
结果的坐标系与几何形状参数相同。
ST_SymDifference()
允许在笛卡尔坐标系或地理坐标系中传递参数,并按照本节介绍中描述的方式处理参数。mysql> SET @g1 = ST_GeomFromText('MULTIPOINT(5 0,15 10,15 25)'); mysql> SET @g2 = ST_GeomFromText('MULTIPOINT(1 1,15 10,15 25)'); mysql> SELECT ST_AsText(ST_SymDifference(@g1, @g2)); +---------------------------------------+ | ST_AsText(ST_SymDifference(@g1, @g2)) | +---------------------------------------+ | MULTIPOINT((1 1),(5 0)) | +---------------------------------------+
-
将几何形状从一个空间参考系统(SRS)转换到另一个。返回值是一个与输入几何形状相同类型的几何形状,但所有坐标都被转换到目标 SRID
target_srid
中。MySQL 支持除以下外的所有 EPSG 定义的 SRS:-
EPSG 1042 Krovak Modified
-
EPSG 1043 Krovak Modified (North Orientated)
-
EPSG 9816 Tunisia Mining Grid
-
EPSG 9826 Lambert Conic Conformal (West Orientated)
ST_Transform()
按照本节介绍中描述的方式处理参数,以下例外:-
具有地理坐标系 SRID 值的几何形状参数不产生错误。
-
如果几何形状或目标 SRID 参数具有指向未定义空间参考系统(SRS)的 SRID 值,则出现
ER_SRS_NOT_FOUND
错误。 -
如果几何体在一个SRS中,
ST_Transform()
不能从中转换,一个ER_TRANSFORM_SOURCE_SRS_NOT_SUPPORTED
错误将发生。 -
如果目标SRID在一个SRS中,
ST_Transform()
不能转换到其中,一个ER_TRANSFORM_TARGET_SRS_NOT_SUPPORTED
错误将发生。 -
如果几何体在一个非WGS 84的SRS中,没有TOWGS84子句,一个
ER_TRANSFORM_SOURCE_SRS_MISSING_TOWGS84
错误将发生。 -
如果目标SRID在一个非WGS 84的SRS中,没有TOWGS84子句,一个
ER_TRANSFORM_TARGET_SRS_MISSING_TOWGS84
错误将发生。
ST_SRID(
和g
,target_srid
)ST_Transform(
的区别在于:g
,target_srid
)-
ST_SRID()
将几何体的SRID值更改,而不转换坐标。 -
ST_Transform()
将几何体的坐标转换,同时将SRID值更改。
mysql> SET @p = ST_GeomFromText('POINT(52.381389 13.064444)', 4326); mysql> SELECT ST_AsText(@p); +----------------------------+ | ST_AsText(@p) | +----------------------------+ | POINT(52.381389 13.064444) | +----------------------------+ mysql> SET @p = ST_Transform(@p, 4230); mysql> SELECT ST_AsText(@p); +---------------------------------------------+ | ST_AsText(@p) | +---------------------------------------------+ | POINT(52.38208611407426 13.065520672345304) | +---------------------------------------------+
-
-
返回一个几何体,表示几何值
g1
和g2
的点集并集。结果在几何体参数的同一个SRS中。ST_Union()
允许在Cartesian或地理SRS中的参数,并根据本节介绍的描述处理其参数。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)) | +--------------------------------------+