wl# 14126:椭球形ST_Buffer的点

影响:服务器- 8.0状态:完成

ST_Buffer目前只支持笛卡尔空间参考系统(sss)中的计算。这个WL扩展了ST_Buffer,以检测它的参数在一个地理(椭球)SRS中,并计算椭球上的缓冲区。椭球型缓冲仅用于点。

预估SRSs和SRID 0中的缓冲区仍将返回与以前相同的结果。如果几何图形是一个点,并且SRID引用地理SRS,函数现在将返回一个值而不是引发错误。

函数ST_Buffer(geometry, distance[, strategy1[, strategy2[, strategy3]]])返回一个几何图形,它表示与几何图形任意点在指定距离内的所有点,使用指定的策略,如果没有指定策略,则使用默认策略。

一般要求

f - 1
如果函数的任何参数为NULL,则函数必须返回NULL。
f - 2
如果几何参数不是语法形式良好的几何,函数在求值时必须引发ER_GIS_INVALID_DATA。
F-3
如果几何参数在未定义的SRS中是一个格式良好的几何,函数在求值时必须引发ER_SRS_NOT_FOUND。

笛卡儿的缓冲区

本节旨在描述笛卡尔sss中缓冲区的现有行为。它并不打算改变现有的行为。

F-4a
如果几何参数在笛卡尔SRS中是一个结构良好但几何无效的几何,函数必须返回一个几何结果或引发一个错误。如果返回一个几何图形,则该值为未定义,即它可以是任何几何图形。返回值也可能在几何上无效。结果必须在与几何参数相同的SRS中。
F-4b
如果几何参数是一个结构良好的几何,它是一个空几何集合(这是目前唯一支持的空几何),在笛卡尔SRS中,函数必须返回一个空几何集合。(注意:这是为了向后兼容而保留的非标准行为。SQL/MM指定返回值必须为NULL。)结果必须在与几何参数相同的SRS中。
F-4c
如果几何参数在笛卡尔SRS中是一个格式良好、有效且非空的几何,则距离为正且缓冲策略有效(参见请求。F-4f),函数必须返回几何的笛卡尔缓冲区。距离参数必须在SRS距离单位中(如果SRID为0则不指定)。结果必须在与几何参数相同的SRS中。
F-4d
如果几何参数在笛卡尔SRS中是一个形式良好、有效且非空的几何包含任何点,线串,多点或多线串,距离为负且缓冲策略有效(参见req F-4f),函数必须返回几何图形的笛卡尔缓冲。结果必须在与几何参数相同的SRS中。其结果是一个缩小了指定距离的几何图形。如果几何图形减少到消失的程度,结果将变成一个空的几何图形集合。
F-4e
如果几何参数在包含任何点、线串、多点或多线串的笛卡尔SRS中是一个格式良好、有效且非空的几何,且距离为负,则函数必须引发ER_WRONG_ARGUMENTS。
F-4f
如果几何参数在笛卡尔SRS中是一个格式良好的几何,并且缓冲策略无效,函数在函数求值时必须引发ER_WRONG_ARGUMENTS。无效的缓冲区策略发生1)当两个或多个相同类型的策略(点,加入或结束)中指定调用ST_Buffer相同,2)时的值不是一个策略(例如,一个任意的二进制字符串或数字)作为战略传递参数,3)当一个策略是通过和几何不包含任何点或测点,或4)当结束或加入战略传递和几何不包含任何线、多边形,multilinestrings或多多边形。

地理缓冲区

F-5a
如果几何参数是地理SRS中的一个格式良好的点,距离参数不为负且没有指定策略,则函数必须返回该SRS中的点的地理缓冲区。距离参数必须在SRS距离单位中(目前总是米)。结果必须在与几何参数相同的SRS中。
F-5b
如果几何参数是地理SRS中的一个格式良好的点(点总是几何上有效的),并且距离为负值或任何策略(除了NULL,请参阅req。如果指定F-1),则函数在求值时必须引发ER_WRONG_ARGUMENTS。
F-5c
如果几何参数是地理SRS中格式良好的非点几何,则函数在函数求值期间必须引发er_not_implemented_for_geography SRS。
F-5d
如果几何参数是地理SRS中的几何,且经度值不在(-180,180)范围内(以度为单位——其他单位的其他限制),则函数必须引发er_geometry_param_longitude de_out_of_range。(*)
F-5e
如果几何参数是地理SRS中的几何,并且纬度值不在范围[-90,90](以度为单位——其他单位的其他限制),则函数必须引发ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE。(*)

(*)由于浮点运算,精确的极限会有轻微偏差。

没有新的语法。
我2
接口SQL01的语义被改变了:如果几何图形是地理SRS中的一个点,ST_Buffer将返回一个多边形(或者如果距离为0则返回一个点)。其他计算将保持当前的状态。
没有新的错误。
没有新的警告。

ST_Buffer的旧实现依赖于过时的(仅限笛卡尔)旧几何数据类型。这个WL基于gis::Geometry类型层次结构从头重新实现了ST_Buffer。

Item_func_st_buffer

Item_func_st_buffer类实现了SQL级别的ST_Buffer函数。

SQL级函数接口在mysql-test/suite/gis/t/st_buffer.test中进行了MTR测试。

缓冲和gis地理信息系统::::缓冲区

gis::Buffer函数(sql/gis/buffer_functor.{h,cc})和gis::Buffer函数(sql/gis/ Buffer .{h,cc})实现了Boost Geometry缓冲函数的接口。函子可能抛出异常,而函数声明为nothrow,并将函子包装在try-catch中,并将异常转换为my_error调用。

该函数通过unittest/gunit/gis_buffer-t.cc中的测试进行单元测试。这些测试处理不影响SQL级接口的边界测试。

清理

旧的函数实现在sql/item_geofunc_buffer中。cc及相关文件已被此WL删除。