OpenGIS 提出了许多可以生成几何图形的函数。它们旨在实现空间运算符。这些函数支持所有参数类型组合,除了根据 开放地理空间联盟 规范不适用的组合。
MySQL 还实现了一些函数,这些函数是 OpenGIS 的扩展,如函数描述中所述。此外,第 14.16.7 节,“几何属性函数”,讨论了几个从现有几何图形构造新几何图形的函数。有关这些函数的描述,请参阅该部分
除非另有说明,否则本节中的函数会按如下方式处理它们的几何图形参数
如果任何参数为
NULL
,则返回值为NULL
。如果任何几何图形参数不是语法上格式良好的几何图形,则会发生
ER_GIS_INVALID_DATA
错误。如果任何几何图形参数是未定义空间参考系 (SRS) 中的语法上格式良好的几何图形,则会发生
ER_SRS_NOT_FOUND
错误。对于采用多个几何图形参数的函数,如果这些参数不在同一个 SRS 中,则会发生
ER_GIS_DIFFERENT_SRIDS
错误。如果任何几何图形参数具有地理 SRS 的 SRID 值,并且该函数不处理地理几何图形,则会发生
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) | +------------------------------+
如果几何图形参数位于笛卡尔 SRS 中
ST_Buffer()
支持Polygon
和MultiPolygon
值的负距离,以及包含Polygon
或MultiPolygon
值的几何图形集合。如果结果减少到消失,则结果为空几何图形。
对于带负距离的
ST_Buffer()
,Point
、MultiPoint
、LineString
和MultiLineString
值以及不包含任何Polygon
或MultiPolygon
值的几何图形集合,会发生ER_WRONG_ARGUMENTS
错误。
Point
几何图形在地理 SRS 中是允许的,但必须满足以下条件如果距离不为负,并且未指定任何策略,则该函数返回其 SRS 中
Point
的地理缓冲区。距离参数必须以 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
策略,但几何图形不包含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()
允许参数在笛卡尔或地理 SRS 中,并按本节简介中所述处理其参数。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
的点集交的几何图形。结果与几何图形参数的 SRS 相同。ST_Intersection()
允许参数在笛卡尔或地理 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_Intersection(@g1, @g2)); +--------------------------------------+ | ST_AsText(ST_Intersection(@g1, @g2)) | +--------------------------------------+ | POINT(2 2) | +--------------------------------------+
ST_LineInterpolatePoint(
ls
,fractional_distance
)此函数采用
LineString
几何图形和 [0.0, 1.0] 范围内的分数距离,并返回沿LineString
的Point
,该点位于从其起点到其终点的距离的给定分数处。它可以用来回答诸如哪个Point
位于由几何图形参数描述的道路的一半位置等问题。此函数针对所有空间参考系统(笛卡尔和地理)中的
LineString
几何图形实现。如果
fractional_distance
参数为 1.0,则结果可能不完全是LineString
参数的最后一个点,而是一个接近该点的点,这是由于近似值计算中的数值误差造成的。一个相关的函数,
ST_LineInterpolatePoints()
,采用类似的参数,但返回一个MultiPoint
,该点包含沿LineString
的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
起点,加上沿LineString
的Point
值,这些值位于从其起点到其终点的距离的每个分数处。它可以用来回答诸如哪个Point
值位于由几何图形参数描述的道路的每 10% 位置等问题。此函数针对所有空间参考系统(笛卡尔和地理)中的
LineString
几何图形实现。如果
fractional_distance
参数将 1.0 除以余数为零,则结果可能不包含LineString
参数的最后一个点,而是一个接近该点的点,这是由于近似值计算中的数值误差造成的。一个相关的函数,
ST_LineInterpolatePoint()
,采用类似的参数,但返回沿LineString
的Point
,该点位于从其起点到其终点的距离的给定分数处。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
的空间参考系统 (SRS) 的单位测量),并返回沿LineString
的Point
,该点位于从其起点到该点的距离处。它可以用来回答诸如哪个Point
值距离由几何图形参数描述的道路起点 400 米等问题。此函数针对所有空间参考系统(笛卡尔和地理)中的
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)
或者,在函数调用表示法中
ST_SymDifference(g1, g2) = ST_Difference(ST_Union(g1, g2), ST_Intersection(g1, g2))
结果与几何图形参数的 SRS 相同。
ST_SymDifference()
允许参数在笛卡尔或地理 SRS 中,并按本节简介中所述处理其参数。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,但以下列出的 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()
处理其参数的方式如本节简介中所述,但有以下例外具有地理 SRS 的 SRID 值的几何图形参数不会产生错误。
如果几何图形或目标 SRID 参数具有 SRID 值,该值引用了未定义的空间参考系统 (SRS),则会发生
ER_SRS_NOT_FOUND
错误。如果几何图形位于
ST_Transform()
无法从中转换的 SRS 中,则会发生ER_TRANSFORM_SOURCE_SRS_NOT_SUPPORTED
错误。如果目标 SRID 位于
ST_Transform()
无法转换为的 SRS 中,则会发生ER_TRANSFORM_TARGET_SRS_NOT_SUPPORTED
错误。如果几何图形位于不是 WGS 84 且没有 TOWGS84 子句的 SRS 中,则会发生
ER_TRANSFORM_SOURCE_SRS_MISSING_TOWGS84
错误。如果目标 SRID 位于不是 WGS 84 且没有 TOWGS84 子句的 SRS 中,则会发生
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()
允许参数以笛卡尔或地理 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)) | +--------------------------------------+