暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 空间分析函数 - 空间便利函数

林员外聊编程 2021-08-29
264
空间便利函数
 
本部分函数提供了对几何值的方便操作。
 
除非另有说明,本部分中介绍的函数处理几何参数的方式如下:
 
● 如果参数为 NULL,则返回值为 NULL
 
● 如果几何参数不是语法良好的几何值,就会发生 ER_GIS_INVALID_DATA 错误。
 
● 如果几何参数是语法良好的几何值,但处于未定义的空间参照系统(SRS),会发生 ER_SRS_NOT_FOUND 错误。
 
● 对于接受多个几何参数的函数,如果这些参数不在同一个SRS中,会发生 ER_GIS_DIFFERENT_SRIDS 错误。
 
● 其他情况下返回值是非 NULL
 
以下是提供的便利函数:
 
● ST_Distance_Sphere(g1,g2 [, radius])
 
返回球面上 Point MultiPoint 参数之间的最小球面距离,单位为米。可选的radius参数应该以米为单位。
 
如果两个几何参数在 SRID 0 中都是有效的笛卡尔 Point MultiPoint 值,则返回值是在给定半径的球体上两个几何参数之间的最短距离。如果省略,默认半径为 6370986 米,点 X 和点 Y 坐标分别解释为经度和纬度,以度数表示。
 
如果两个几何参数都是在地理空间参照系统(SRS)中有效的 Point MultiPoint 值,则返回值是在给定半径的球体上两个几何参数之间的最短距离。如果省略,默认半径等于平均半径,定义为 (2a+b)/3,其中 a SRS 的长半轴,b SRS 的短半轴。
 
ST_Distance_Sphere() 按照本部分开始介绍中的描述处理它的参数,但有以下例外:
 
支持的几何参数组合是 Point Point,或 Point MultiPoint(以任何参数顺序)。如果至少有一个几何值既不是 Point 也不是 MultiPoint,并且它的 SRID 0,则会发生 ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS 错误。如果至少有一个几何值既不是Point 也不是 MultiPoint,并且它的 SRID 指向一个地理 SRS,则会发生 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误。如果任何几何值指向投影的 SRS,则会发生 ER_NOT_IMPLEMENTED_FOR_PROJECTED_SRS 错误。
 
  如果任何参数的经度或纬度超出范围,则会发生错误:
 
○如果经度值不在 (−180, 180] 范围内,则会出现 ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE 错误( MySQL8.0.12 之前是 ER_LONGITUDE_OUT_OF_RANGE 错误)
 
○如果纬度值不在 [−90, 90] 范围内,则会出现 ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE 错误( MySQL8.0.12 之前是 ER_LATITUDE_OUT_OF_RANGE 错误)
 
显示的范围以度为单位。如果SRS使用其他单位,则范围使用其单位中的相应值。由于采用浮点运算,精确的范围限制略有偏差。
 
如果 radius参数存在但不是正数,则发生ER_NONPOSITIVE_RADIUS 错误。
 
如果距离超出双精度数的范围,则发生ER_STD_OVERFLOW_ERROR 错误。
 
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。几何有效性由 OGC 规范定义。
 
唯一有效的空几何值是空几何集合值。在这种情况下,ST_IsValid() 返回 1MySQL 不支持 GIS EMPTY 值,如 POINT EMPTY
 
ST_IsValid() 按本部分开头中所介绍处理它的参数,但有一个例外:
 
如果几何值的地理SRS的经度或纬度超出范围,则会发生错误:
 
○如果经度值不在(−180, 180] 范围内,则会出现 ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE 错误( MySQL8.0.12 之前是 ER_LONGITUDE_OUT_OF_RANGE 错误)
 
○如果纬度值不在[−90, 90] 范围内,则会出现 ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE 错误( MySQL8.0.12 之前是 ER_LATITUDE_OUT_OF_RANGE 错误)
 
所示范围以度数表示。如果SRS 使用其他单位,则范围使用其单位中相应的值。由于浮点运算,精确的范围限制略有偏差。
 
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)
 
返回在两个点周围形成信封的矩形,值为 PointLineString Polygon
 
使用笛卡尔坐标系而不是在球面、椭球面或地球上进行计算。
 
给定两个点pt1pt2ST_MakeEnvelope()在抽象平面上创建结果几何,如下所示:
 
如果 pt1 pt2相等,结果是点 pt1
 
    ■  如果 (pt1, pt2) 是一个垂直或水平线段,则结果是线段 (pt1, pt2)
 
    ■  其他情况下,结果是一个使用 pt1pt2作为对角线点的多边形。
 
结果几何值的 SRID 0
 
ST_MakeEnvelope() 按照本部分开头介绍中的描述处理它的参数,但有以下例外:
 
如果参数不是 Point 值,则会发生ER_WRONG_ARGUMENTS 错误。
 
  ■如果两个点的任何坐标值为无穷大或 NaN,则会出现 ER_GIS_INVALID_DATA 错误。
 
   ■  如果任何几何值具有地理空间参照系统(SRS) SRID 值,就会发生 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误。
 
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 算法简化几何值,并返回相同类型的简化值。
 
几何值可以是任何几何类型,尽管 Douglas-Peucker 算法实际上可能不能处理每一种类型。几何集合的处理方法是将其组成部分一个个地交给简化算法,并将返回的几何值放入几何集合中。
 
max_distance参数是一个顶点到要移除的其他段的距离(以输入坐标为单位)。在简化后的 linestring 距离内的顶点将被删除。
 
根据 Boost.Geometry,几何值可能会因为简化的过程而失效,这个过程可能会产生自交叉。要检查结果的有效性,请将其传递给 ST_IsValid()
 
ST_Simplify() 按照本部分开头中的描述处理其参数,但有一个例外:
 
  如果 max_distance参数不是正的,或者是NaN,就会发生 ER_WRONG_ARGUMENTS 错误。
 
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() 可以用来过滤无效的几何数据,但这是有代价的。对于那些需要更精确的结果而不受无效数据影响的应用程序来说,这种代价可能是值得的。
 
如果几何参数有效,则按原样返回,除非输入 Polygon MultiPolygon 具有顺时针环,在检查有效性之前,这些环将被反转。如果几何有效,则返回带有反方向环的值。
 
唯一有效的空几何是空的几何集合值。ST_Validate() 在本例中直接返回它,而不进行进一步的检查。
 
MySQL 8.0.13 开始,ST_Validate() 按本部分开始的描述处理它的参数,除了这些例外:
 
如果几何值的地理SRS的经度或纬度超出范围,则会发生错误:
 
○如果经度值不在(−180, 180] 范围内,则会出现 ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE 错误( MySQL8.0.12 之前是 ER_LONGITUDE_OUT_OF_RANGE 错误)
 
○如果纬度值不在[−90, 90] 范围内,则会出现 ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE 错误( MySQL8.0.12 之前是 ER_LATITUDE_OUT_OF_RANGE 错误)
 
所示范围以度数表示。由于浮点运算,精确的范围限制略有偏差。
 
MySQL 8.0.13 之前,ST_Validate() 会像本节开始介绍中描述的那样处理它的参数,但有以下例外:
 
如果几何值不是语法良好的形式,返回值是NULL。不会发生 ER_GIS_INVALID_DATA 错误。
 
■如果几何值具有地理空间参照系统(SRS)SRID值,会发生 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误。
 
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) |
+------------------------------+
复制
 
 
官方网址:
https://dev.mysql.com/doc/refman/8.0/en/spatial-convenience-functions.html
文章转载自林员外聊编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论