• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • 空间便利功能

    本节中的功能提供了对几何值的便捷操作。

    除非另有说明,否则本节中的函数将按以下方式处理其参数:

    • 如果有任何参数NULL,则返回值为NULL
    • 如果任何几何参数都不是语法上格式正确的几何,ER_GIS_INVALID_DATA则会发生错误。
    • 如果任何几何参数的SRID值都引用未定义的空间参考系统(SRS),ER_SRS_NOT_FOUND则会发生错误。
    • 对于带有多个几何参数的函数,如果这些参数不具有相同的SRID,ER_GIS_DIFFERENT_SRIDS则会发生错误。
    • 否则,返回值为non-NULL

    这些便利功能可用:

    • ST_Distance_Sphere(g1,g2[,radius])

      返回球体之间PointMultiPoint参数上的最小球面距离,以米为单位。(有关通用距离的计算,请参见ST_Distance()函数。)可选radius参数应以米为单位。

      如果两个几何参数都是有效的直角坐标PointMultiPoint SRID 0中的值,则返回值是具有所提供半径的球体上两个几何之间的最短距离。如果省略,则默认半径为6,370,986米,点X和Y坐标分别解释为经度和纬度(以度为单位)。

      如果两个几何参数均有效,Point或者MultiPoint是地理空间参考系统(SRS)中的值,则返回值是具有所提供半径的球体上两个几何之间的最短距离。如果省略,则默认半径等于平均半径,定义为(2a + b)/ 3,其中a是SRS的半长轴,b是SRS的半短轴。

      ST_Distance_Sphere()如本节简介中所述处理其参数,但以下情况除外:

      • 支持的几何参数组合为PointPoint,或PointMultiPoint(以任何参数顺序)。如果至少一个几何形状既不是也不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_LONGITUDE_OUT_OF_RANGE则会发生错误。
        • 如果任何纬度参数不在[-90,90]范围内,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()在这种情况下返回1。MySQL不支持GIS EMPTY值,例如POINT EMPTY

      ST_IsValid()如本节简介中所述处理其参数,但有以下例外:

      • 如果几何图形的经度或纬度超出范围,则将发生错误:

        • 如果任何经度参数不在范围内(-180,180],ER_LONGITUDE_OUT_OF_RANGE则会发生错误。
        • 如果任何纬度参数不在[-90,90]范围内,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)

      返回形成围绕两点信封,作为一个矩形PointLineStringPolygon

      使用笛卡尔坐标系而不是在球体,椭球体或地球上进行计算。

      给定两个点pt1pt2ST_MakeEnvelope()在抽象平面上创建结果几何体,如下所示:

      • 如果pt1pt2相等,则结果为point pt1
      • 否则,如果是垂直或水平线段,则结果为线段。(pt1,pt2)(pt1,pt2)
      • 否则,结果是使用pt1pt2作为对角点的多边形。

      结果几何的SRID为0。

      ST_MakeEnvelope()如本节简介中所述处理其参数,但以下情况除外:

      • 如果参数不是Point值,ER_WRONG_ARGUMENTS则会发生错误。
      • 一个ER_GIS_INVALID_DATA用于附加条件的两个点的任何坐标值为无穷大或发生错误NaN
      • 如果任何几何都具有地理空间参考系统(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参数是要除去的距离(在输入坐标的单位)顶点到其他段。在简化线串的此距离内的顶点将被删除。

      根据Boost.Geometry,由于简化过程,几何形状可能变得无效,并且该过程可能会创建自相交。要检查结果的有效性,请将其传递给ST_IsValid()

      ST_Simplify()如本节简介中所述处理其参数,但有以下例外:

      • 如果max_distance参数不是正数或为NaNER_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()可以用于过滤掉无效的几何数据,尽管需要付出一定的代价。对于需要更精确结果而不被无效数据污染的应用程序,此惩罚可能是值得的。

      如果几何参数有效,则按原样返回,除非输入PolygonMultiPolygon具有顺时针环,则在检查有效性之前将这些环反转。如果几何有效,则返回带有反转环的值。

      唯一有效的空几何以空几何集合值的形式表示。ST_Validate()在这种情况下,无需进一步检查即可直接返回它。

      从MySQL 8.0.13开始,ST_Validate()按照本节简介中的描述处理其参数,但以下情况除外:

      • 如果几何图形的经度或纬度超出范围,则将发生错误:

        • 如果任何经度参数不在范围内(-180,180],ER_LONGITUDE_OUT_OF_RANGE则会发生错误。
        • 如果任何纬度参数不在[-90,90]范围内,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)          	|
      +------------------------------	+