MySQL8-中文参考-五十一-

132 阅读54分钟

MySQL8 中文参考(五十一)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

14.16.5 创建几何值的 MySQL 特定函数

原文:dev.mysql.com/doc/refman/8.0/en/gis-mysql-specific-functions.html

MySQL 提供了一组有用的非标准函数来创建几何值。本节中描述的函数是 MySQL 对 OpenGIS 规范的扩展。

这些函数从 WKB 值或几何对象作为参数生成几何对象。如果任何参数不是适当的 WKB 或几何表示适当对象类型的表示,则返回值为NULL

例如,您可以直接将Point()的几何返回值插入到POINT列中:

INSERT INTO t1 (pt_col) VALUES(Point(1,2));
  • GeomCollection(*g* [, *g*] ...)

    从几何参数构造GeomCollection值。

    GeomCollection()返回所有包含在参数中的适当几何体,即使存在不受支持的几何体也是如此。

    GeomCollection()允许不带参数作为创建空几何体的一种方式。此外,接受 WKT 几何集参数的函数,如ST_GeomFromText(),理解 OpenGIS 的'GEOMETRYCOLLECTION EMPTY'标准语法和 MySQL 的'GEOMETRYCOLLECTION()'非标准语法。

    GeomCollection()GeometryCollection()是同义词���首选函数为GeomCollection()

  • GeometryCollection(*g* [, *g*] ...)

    从几何参数构造GeomCollection值。

    GeometryCollection()返回所有包含在参数中的适当几何体,即使存在不受支持的几何体也是如此。

    GeometryCollection()允许不带参数作为创建空几何体的一种方式。此外,接受 WKT 几何集参数的函数,如ST_GeomFromText(),理解 OpenGIS 的'GEOMETRYCOLLECTION EMPTY'标准语法和 MySQL 的'GEOMETRYCOLLECTION()'非标准语法。

    GeomCollection()GeometryCollection()是同义词,首选函数为GeomCollection()

  • LineString(*pt* [, *pt*] ...)

    从一些Point或 WKBPoint参数构建一个LineString值。如果参数数量少于两个,返回值为NULL

  • MultiLineString(*ls* [, *ls*] ...)

    使用LineString或 WKBLineString参数构建一个MultiLineString值。

  • MultiPoint(*pt* [, *pt2*] ...)

    使用Point或 WKBPoint参数构建一个MultiPoint值。

  • MultiPolygon(*poly* [, *poly*] ...)

    从一组Polygon或 WKBPolygon参数构建一个MultiPolygon值。

  • Point(*x*, *y*)

    使用其坐标构建一个Point

  • Polygon(*ls* [, *ls*] ...)

    从一些LineString或 WKBLineString参数构建一个Polygon值。如果任何参数不代表一个LinearRing(即不是一个封闭且简单的LineString),返回值为NULL

14.16.6 几何格式转换函数

原文:dev.mysql.com/doc/refman/8.0/en/gis-format-conversion-functions.html

MySQL 支持本节列出的函数,用于将几何值从内部几何格式转换为 WKT 或 WKB 格式,或交换 X 和 Y 坐标的顺序。

还有函数用于将字符串从 WKT 或 WKB 格式转换为内部几何格式。参见第 14.16.3 节,“从 WKT 值创建几何值的函数”和第 14.16.4 节,“从 WKB 值创建几何值的函数”。

函数,比如ST_GeomFromText(),接受 WKT 几何集合参数,理解 OpenGIS 标准语法'GEOMETRYCOLLECTION EMPTY'和 MySQL 非标准语法'GEOMETRYCOLLECTION()'。另一种生成空几何集合的方法是调用不带参数的GeometryCollection()。生成 WKT 值的函数,比如ST_AsWKT(),生成'GEOMETRYCOLLECTION EMPTY'标准语法:

mysql> SET @s1 = ST_GeomFromText('GEOMETRYCOLLECTION()');
mysql> SET @s2 = ST_GeomFromText('GEOMETRYCOLLECTION EMPTY');
mysql> SELECT ST_AsWKT(@s1), ST_AsWKT(@s2);
+--------------------------+--------------------------+
| ST_AsWKT(@s1)            | ST_AsWKT(@s2)            |
+--------------------------+--------------------------+
| GEOMETRYCOLLECTION EMPTY | GEOMETRYCOLLECTION EMPTY |
+--------------------------+--------------------------+
mysql> SELECT ST_AsWKT(GeomCollection());
+----------------------------+
| ST_AsWKT(GeomCollection()) |
+----------------------------+
| GEOMETRYCOLLECTION EMPTY   |
+----------------------------+

除非另有说明,本节中的函数处理其几何参数如下:

  • 如果任何参数为NULL,返回值为NULL

  • 如果任何几何参数不是语法上良好形式的几何,则会发生ER_GIS_INVALID_DATA错误。

  • 如果任何几何参数处于未定义的空间参考系统中,轴将按照几何中出现的顺序输出,并发生ER_WARN_SRS_NOT_FOUND_AXIS_ORDER警告。

  • 默认情况下,地理坐标(纬度、经度)按照几何参数的空间参考系统指定的顺序解释。可提供一个可选的*options参数来覆盖默认轴顺序。options由逗号分隔的*key*=*value*列表组成。唯一允许的key*值是axis-order,允许的值为lat-longlong-latsrid-defined(默认值)。

    如果*options参数为NULL,返回值为NULL。如果options*参数无效,将出现错误指示原因。

  • 否则,返回值为非NULL

这些函数可用于格式转换或坐标交换:

  • ST_AsBinary(*g* [, *options*])ST_AsWKB(*g* [, *options*])

    将内部几何格式的值转换为其 WKB 表示形式,并返回二进制结果。

    函数返回值的地理坐标(纬度、经度)顺序由适用于几何参数的空间参考系统指定。可提供一个可选的*options*参数来覆盖默认轴顺序。

    ST_AsBinary()ST_AsWKB() 处理其参数的方式如本节介绍的那样。

    mysql> SET @g = ST_LineFromText('LINESTRING(0 5,5 10,10 15)', 4326);
    mysql> SELECT ST_AsText(ST_GeomFromWKB(ST_AsWKB(@g)));
    +-----------------------------------------+
    | ST_AsText(ST_GeomFromWKB(ST_AsWKB(@g))) |
    +-----------------------------------------+
    | LINESTRING(5 0,10 5,15 10)              |
    +-----------------------------------------+
    mysql> SELECT ST_AsText(ST_GeomFromWKB(ST_AsWKB(@g, 'axis-order=long-lat')));
    +----------------------------------------------------------------+
    | ST_AsText(ST_GeomFromWKB(ST_AsWKB(@g, 'axis-order=long-lat'))) |
    +----------------------------------------------------------------+
    | LINESTRING(0 5,5 10,10 15)                                     |
    +----------------------------------------------------------------+
    mysql> SELECT ST_AsText(ST_GeomFromWKB(ST_AsWKB(@g, 'axis-order=lat-long')));
    +----------------------------------------------------------------+
    | ST_AsText(ST_GeomFromWKB(ST_AsWKB(@g, 'axis-order=lat-long'))) |
    +----------------------------------------------------------------+
    | LINESTRING(5 0,10 5,15 10)                                     |
    +----------------------------------------------------------------+
    
  • ST_AsText(*g* [, *options*]), ST_AsWKT(*g* [, *options*])

    将内部几何格式的值转换为其 WKT 表示形式,并返回字符串结果。

    函数返回值的地理坐标(纬度、经度)顺序由适用于几何参数的空间参考系统指定。可提供一个可选的*options*参数来覆盖默认轴顺序。

    ST_AsText()ST_AsWKT() 处理其参数的方式如本节介绍的那样。

    mysql> SET @g = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT ST_AsText(ST_GeomFromText(@g));
    +--------------------------------+
    | ST_AsText(ST_GeomFromText(@g)) |
    +--------------------------------+
    | LINESTRING(1 1,2 2,3 3)        |
    +--------------------------------+
    

    MultiPoint 值的输出包括每个点周围的括号。例如:

    mysql> SELECT ST_AsText(ST_GeomFromText(@mp));
    +---------------------------------+
    | ST_AsText(ST_GeomFromText(@mp)) |
    +---------------------------------+
    | MULTIPOINT((1 1),(2 2),(3 3))   |
    +---------------------------------+
    
  • ST_SwapXY(*g*)

    接受内部几何格式的参数,交换几何内每个坐标对的 X 和 Y 值,并返回结果。

    ST_SwapXY() 处理其参数的方式如本节介绍的那样。

    mysql> SET @g = ST_LineFromText('LINESTRING(0 5,5 10,10 15)');
    mysql> SELECT ST_AsText(@g);
    +----------------------------+
    | ST_AsText(@g)              |
    +----------------------------+
    | LINESTRING(0 5,5 10,10 15) |
    +----------------------------+
    mysql> SELECT ST_AsText(ST_SwapXY(@g));
    +----------------------------+
    | ST_AsText(ST_SwapXY(@g))   |
    +----------------------------+
    | LINESTRING(5 0,10 5,15 10) |
    +----------------------------+
    

14.16.7 几何属性函数

原文:dev.mysql.com/doc/refman/8.0/en/gis-property-functions.html

14.16.7.1 通用几何属性函数

14.16.7.2 点属性函数

14.16.7.3 线串和多线串属性函数

14.16.7.4 多边形和多多边形属性函数

14.16.7.5 几何集合属性函数

每个属于这个组的函数都以几何值作为其参数,并返回几何的一些定量或定性属性。一些函数限制其参数类型。如果参数的几何类型不正确,则这些函数返回NULL。例如,ST_Area() 多边形函数在对象类型既不是Polygon也不是MultiPolygon时返回NULL

原文:dev.mysql.com/doc/refman/8.0/en/gis-general-property-functions.html

14.16.7.1 通用几何属性函数

本节列出的函数不限制其参数,并接受任何类型的几何值。

除非另有说明,本节中的函数处理其几何参数如下:

  • 如果任何参数为NULL,则返回值为NULL

  • 如果任何几何参数不是语法上良好形式的几何图形,则会发生ER_GIS_INVALID_DATA错误。

  • 如果任何几何参数是在未定义的空间参考系统(SRS)中语法上良好形式的几何,则会发生ER_SRS_NOT_FOUND错误。

  • 如果任何 SRID 参数不在 32 位无符号整数的范围内,则会发生ER_DATA_OUT_OF_RANGE错误。

  • 如果任何 SRID 参数引用未定义的 SRS,则会发生ER_SRS_NOT_FOUND错误。

  • 否则,返回值为非NULL

这些函数可用于获取几何属性:

  • ST_Dimension(*g*)

    返回几何值g的固有维度。维度可以是−1、0、1 或 2。这些值的含义在第 13.4.2.2 节“几何类”中给出。

    ST_Dimension()处理其参数如本节介绍的那样。

    mysql> SELECT ST_Dimension(ST_GeomFromText('LineString(1 1,2 2)'));
    +------------------------------------------------------+
    | ST_Dimension(ST_GeomFromText('LineString(1 1,2 2)')) |
    +------------------------------------------------------+
    |                                                    1 |
    +------------------------------------------------------+
    
  • ST_Envelope(*g*)

    返回几何值g的最小边界矩形(MBR)。结果以由边界框的角点定义的Polygon值返回:

    POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
    
    mysql> SELECT ST_AsText(ST_Envelope(ST_GeomFromText('LineString(1 1,2 2)')));
    +----------------------------------------------------------------+
    | ST_AsText(ST_Envelope(ST_GeomFromText('LineString(1 1,2 2)'))) |
    +----------------------------------------------------------------+
    | POLYGON((1 1,2 1,2 2,1 2,1 1))                                 |
    +----------------------------------------------------------------+
    

    如果参数是点或垂直或水平线段,则ST_Envelope()返回点或线段作为其 MBR,而不是返回无效多边形:

    mysql> SELECT ST_AsText(ST_Envelope(ST_GeomFromText('LineString(1 1,1 2)')));
    +----------------------------------------------------------------+
    | ST_AsText(ST_Envelope(ST_GeomFromText('LineString(1 1,1 2)'))) |
    +----------------------------------------------------------------+
    | LINESTRING(1 1,1 2)                                            |
    +----------------------------------------------------------------+
    

    ST_Envelope()处理其参数如本节介绍的那样,但有一个例外:

    • 如果几何图形具有地理空间参考系统(SRS)的 SRID 值,则会发生ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。
  • ST_GeometryType(*g*)

    返回一个二进制字符串,指示几何实例g是其成员的几何类型的名称。该名称对应于可实例化的Geometry子类之一。

    ST_GeometryType() 处理其参数如本节介绍的那样。

    mysql> SELECT ST_GeometryType(ST_GeomFromText('POINT(1 1)'));
    +------------------------------------------------+
    | ST_GeometryType(ST_GeomFromText('POINT(1 1)')) |
    +------------------------------------------------+
    | POINT                                          |
    +------------------------------------------------+
    
  • ST_IsEmpty(*g*)

    此函数是一个占位符,对于空几何体集合值返回 1,否则返回 0。

    唯一有效的空几何体以空几何体集合值的形式表示。MySQL 不支持 GIS EMPTY 值,如 POINT EMPTY

    ST_IsEmpty() 处理其参数如本节介绍的那样。

  • ST_IsSimple(*g*)

    如果几何值 g 根据 ISO SQL/MM Part 3: Spatial 标准是简单的,则返回 1。如果参数不简单,则 ST_IsSimple() 返回 0。

    在 Section 13.4.2, “The OpenGIS Geometry Model” 下给出的可实例化几何类的描述包括导致类实例被分类为非简单的特定条件。

    ST_IsSimple() 处理其参数如本节介绍的那样,除了:

    • 如果几何体具有地理 SRS,其经度或纬度超出范围,则会出现错误:

      • 如果经度值不在范围内(−180, 180],则会出现 ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE 错误(在 MySQL 8.0.12 之前为 ER_LONGITUDE_OUT_OF_RANGE)。

      • 如果纬度值不在范围内 [−90, 90],则会出现 ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE 错误(在 MySQL 8.0.12 之前为 ER_LATITUDE_OUT_OF_RANGE)。

      显示的范围以度为单位。由于浮点运算,确切的范围限制略有偏差。

  • ST_SRID(*g* [, *srid*])

    使用表示有效几何对象 g 的单个参数,ST_SRID() 返回一个整数,指示与 g 关联的空间参考系统(SRS)的 ID。

    带有可选的第二个参数表示有效的 SRID 值,ST_SRID() 返回一个与其第一个参数类型相同的对象,其 SRID 值等于第二个参数。这仅设置对象的 SRID 值;不执行任何坐标值的转换。

    ST_SRID()处理其参数的方式如本节介绍中所述,但有一个例外:

    • 对于单参数语法,ST_SRID()即使引用未定义的 SRS 也会返回几何图形的 SRID。不会发生ER_SRS_NOT_FOUND错误。

    ST_SRID(*g*, *target_srid*)ST_Transform(*g*, *target_srid*)的区别如下:

    • ST_SRID()改变几何图形的 SRID 值,而不改变其坐标。

    • ST_Transform()会在改变 SRID 值的同时转换几何图形的坐标。

    mysql> SET @g = ST_GeomFromText('LineString(1 1,2 2)', 0);
    mysql> SELECT ST_SRID(@g);
    +-------------+
    | ST_SRID(@g) |
    +-------------+
    |           0 |
    +-------------+
    mysql> SET @g = ST_SRID(@g, 4326);
    mysql> SELECT ST_SRID(@g);
    +-------------+
    | ST_SRID(@g) |
    +-------------+
    |        4326 |
    +-------------+
    

    通过将一个 MySQL 特定函数创建空间值的结果和一个 SRID 值传递给ST_SRID(),可以在特定的 SRID 中创建几何图形。例如:

    SET @g1 = ST_SRID(Point(1, 1), 4326);
    

    然而,该方法会在 SRID 0 中创建几何图形,然后将其转换为 SRID 4326(WGS 84)。更好的选择是一开始就使用正确的空间参考系统创建几何图形。例如:

    SET @g1 = ST_PointFromText('POINT(1 1)', 4326);
    SET @g1 = ST_GeomFromText('POINT(1 1)', 4326);
    

    ST_SRID()的两个参数形式对于纠正或更改具有不正确 SRID 的几何图形非常有用。

原文:dev.mysql.com/doc/refman/8.0/en/gis-point-property-functions.html

14.16.7.2 点属性函数

一个Point由 X 和 Y 坐标组成,可以分别使用ST_X()ST_Y()函数获取。这些函数还允许一个可选的第二个参数,指定 X 或 Y 坐标值,此时函数结果是第一个参数的Point对象,相应坐标被修改为等于第二个参数。

对于具有地理空间参考系统(SRS)的Point对象,可以分别使用ST_Longitude()ST_Latitude()函数获取经度和纬度。这些函数还允许一个可选的第二个参数,指定经度或纬度值,此时函数结果是第一个参数的Point对象,经度或纬度被修改为等于第二个参数。

除非另有说明,本节中的函数处理其几何参数如下:

  • 如果任何参数为NULL,则返回值为NULL

  • 如果任何几何参数是有效几何但不是Point对象,则会发生ER_UNEXPECTED_GEOMETRY_TYPE错误。

  • 如果任何几何参数不是语法上良好形式的几何图形,则会发生ER_GIS_INVALID_DATA错误。

  • 如果任何几何参数是在未定义的空间参考系统(SRS)中语法上良好形式的几何图形,则会发生ER_SRS_NOT_FOUND错误。

  • 如果提供了 X 或 Y 坐标参数且值为-inf+infNaN,则会发生ER_DATA_OUT_OF_RANGE错误。

  • 如果经度或纬度值超出范围,则会发生错误:

    • 如果经度值不在范围(−180, 180]内,则会发生ER_LONGITUDE_OUT_OF_RANGE错误。

    • 如果纬度值不在范围[-90, 90]内,则会发生ER_LATITUDE_OUT_OF_RANGE错误。

    显示的范围为度数。由于浮点运算,确切的范围限制略有偏差。

  • 否则,返回值为非NULL

这些函数可用于获取点属性:

  • ST_Latitude(*p* [, *new_latitude_val*])

    以一个代表具有地理空间参考系统(SRS)的有效Point对象*p的单个参数为参数,ST_Latitude()返回p*的纬度值作为双精度数。

    通过可选的第二个参数代表有效的纬度值,ST_Latitude()返回一个Point对象,其纬度等于第二个参数。

    ST_Latitude()处理其参数如本节介绍的那样,另外如果Point对象有效但没有地理 SRS,则会发生ER_SRS_NOT_GEOGRAPHIC错误。

    mysql> SET @pt = ST_GeomFromText('POINT(45 90)', 4326);
    mysql> SELECT ST_Latitude(@pt);
    +------------------+
    | ST_Latitude(@pt) |
    +------------------+
    |               45 |
    +------------------+
    mysql> SELECT ST_AsText(ST_Latitude(@pt, 10));
    +---------------------------------+
    | ST_AsText(ST_Latitude(@pt, 10)) |
    +---------------------------------+
    | POINT(10 90)                    |
    +---------------------------------+
    

    此函数在 MySQL 8.0.12 中添加。

  • ST_Longitude(*p* [, *new_longitude_val*])

    以一个代表具有地理空间参考系统(SRS)的有效Point对象*p的单个参数为参数,ST_Longitude()返回p*的经度值作为双精度数。

    通过可选的第二个参数代表有效的经度值,ST_Longitude()返回一个Point对象,其经度等于第二个参数。

    ST_Longitude()处理其参数如本节介绍的那样,另外如果Point对象有效但没有地理 SRS,则会发生ER_SRS_NOT_GEOGRAPHIC错误。

    mysql> SET @pt = ST_GeomFromText('POINT(45 90)', 4326);
    mysql> SELECT ST_Longitude(@pt);
    +-------------------+
    | ST_Longitude(@pt) |
    +-------------------+
    |                90 |
    +-------------------+
    mysql> SELECT ST_AsText(ST_Longitude(@pt, 10));
    +----------------------------------+
    | ST_AsText(ST_Longitude(@pt, 10)) |
    +----------------------------------+
    | POINT(45 10)                     |
    +----------------------------------+
    

    此函数在 MySQL 8.0.12 中添加。

  • ST_X(*p* [, *new_x_val*])

    以一个代表有效的Point对象*p的单个参数为参数,ST_X()返回p*的 X 坐标值作为双精度数。从 MySQL 8.0.12 开始,X 坐标被认为是指Point空间参考系统(SRS)定义中首先出现的轴。

    通过可选的第二个参数,ST_X()返回一个Point对象,其 X 坐标等于第二个参数。从 MySQL 8.0.12 开始,如果Point对象具有地理 SRS,则第二个参数必须在经度或纬度值的适当范围内。

    ST_X()处理其参数如本节介绍的那样。

    mysql> SELECT ST_X(Point(56.7, 53.34));
    +--------------------------+
    | ST_X(Point(56.7, 53.34)) |
    +--------------------------+
    |                     56.7 |
    +--------------------------+
    mysql> SELECT ST_AsText(ST_X(Point(56.7, 53.34), 10.5));
    +-------------------------------------------+
    | ST_AsText(ST_X(Point(56.7, 53.34), 10.5)) |
    +-------------------------------------------+
    | POINT(10.5 53.34)                         |
    +-------------------------------------------+
    
  • ST_Y(*p* [, *new_y_val*])

    带有一个表示有效Point对象*p的单个参数,ST_Y()以双精度数值返回p*的 Y 坐标值。从 MySQL 8.0.12 开始,Y 坐标被认为是指Point空间参考系统(SRS)定义中出现的第二个轴。

    使用可选的第二个参数,ST_Y()返回一个Point对象,其 Y 坐标等于第二个参数。从 MySQL 8.0.12 开始,如果Point对象具有地理 SRS,则第二个参数必须在经度或纬度值的适当范围内。

    ST_Y()处理其参数的方式如本节介绍的那样。

    mysql> SELECT ST_Y(Point(56.7, 53.34));
    +--------------------------+
    | ST_Y(Point(56.7, 53.34)) |
    +--------------------------+
    |                    53.34 |
    +--------------------------+
    mysql> SELECT ST_AsText(ST_Y(Point(56.7, 53.34), 10.5));
    +-------------------------------------------+
    | ST_AsText(ST_Y(Point(56.7, 53.34), 10.5)) |
    +-------------------------------------------+
    | POINT(56.7 10.5)                          |
    +-------------------------------------------+
    

原文:dev.mysql.com/doc/refman/8.0/en/gis-linestring-property-functions.html

14.16.7.3 LineString 和 MultiLineString 属性函数

LineStringPoint值组成。您可以提取LineString的特定点,计算其包含的点数,或获取其长度。

本节中的一些函数也适用于MultiLineString值。

除非另有说明,本节中的函数处理其几何参数如下:

  • 如果任何参数为NULL或任何几何参数为空几何体,则返回值为NULL

  • 如果任何几何参数不是语法上格式良好的几何体,则会发生ER_GIS_INVALID_DATA错误。

  • 如果任何几何参数是在未定义空间参考系统(SRS)中语法上格式良好的几何体,则会发生ER_SRS_NOT_FOUND错误。

  • 否则,返回值为非NULL

可用于获取线串属性的这些函数:

  • ST_EndPoint(*ls*)

    返回LineString值*ls*的端点的Point

    ST_EndPoint()处理其参数如本节介绍的那样。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT ST_AsText(ST_EndPoint(ST_GeomFromText(@ls)));
    +----------------------------------------------+
    | ST_AsText(ST_EndPoint(ST_GeomFromText(@ls))) |
    +----------------------------------------------+
    | POINT(3 3)                                   |
    +----------------------------------------------+
    
  • ST_IsClosed(*ls*)

    对于LineString值*lsST_IsClosed()ls*闭合时返回 1(即,其ST_StartPoint()ST_EndPoint()的值相同)。

    对于MultiLineString值*lsST_IsClosed()ls闭合时返回 1(即,对于ls*中的每个LineStringST_StartPoint()ST_EndPoint()的值相同)。

    ST_IsClosed()如果*ls未闭合,则返回 0,如果ls*为NULL,则返回NULL

    ST_IsClosed()处理其参数如本节介绍的那样,但有一个例外:

    • 如果几何体具有地理空间参考系统(SRS)的 SRID 值,则会发生ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。
    mysql> SET @ls1 = 'LineString(1 1,2 2,3 3,2 2)';
    mysql> SET @ls2 = 'LineString(1 1,2 2,3 3,1 1)';
    
    mysql> SELECT ST_IsClosed(ST_GeomFromText(@ls1));
    +------------------------------------+
    | ST_IsClosed(ST_GeomFromText(@ls1)) |
    +------------------------------------+
    |                                  0 |
    +------------------------------------+
    
    mysql> SELECT ST_IsClosed(ST_GeomFromText(@ls2));
    +------------------------------------+
    | ST_IsClosed(ST_GeomFromText(@ls2)) |
    +------------------------------------+
    |                                  1 |
    +------------------------------------+
    
    mysql> SET @ls3 = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';
    
    mysql> SELECT ST_IsClosed(ST_GeomFromText(@ls3));
    +------------------------------------+
    | ST_IsClosed(ST_GeomFromText(@ls3)) |
    +------------------------------------+
    |                                  0 |
    +------------------------------------+
    
  • ST_Length(*ls* [, *unit*])

    返回一个双精度数字,���示LineStringMultiLineString值*ls*在其关联的空间参考系统中的长度。MultiLineString值的长度等于其元素的长度之和。

    ST_Length()计算结果如下:

    • 如果几何图形在笛卡尔空间参考系统中是有效的LineString,则返回值为几何图形的笛卡尔长度。

    • 如果几何图形在笛卡尔空间参考系统中是有效的MultiLineString,则返回值为其元素的笛卡尔长度之和。

    • 如果几何图形是地理空间参考系统中有效的LineString,则返回值为该 SRS 中几何图形的大地长度,单位为米。

    • 如果几何图形在地理空间参考系统中是有效的MultiLineString,则返回值为该 SRS 中其元素的大地长度之和,单位为米。

    ST_Length()处理其参数的方式如本节介绍所述,但有以下例外:

    • 如果几何图形不是LineStringMultiLineString,则返回值为NULL

    • 如果几何图形在几何上无效,则结果要么是未定义长度(即可以是任何数字),要么会发生错误。

    • 如果长度计算结果为+inf,则会发生ER_DATA_OUT_OF_RANGE错误。

    • 如果几何图形具有地理空间参考系统(SRS),其中经度或纬度超出范围,则会发生错误:

      • 如果经度值不在范围(−180,180]内,则会发生ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LONGITUDE_OUT_OF_RANGE)。

      • 如果纬度值不在范围[−90,90]内,则会发生ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LATITUDE_OUT_OF_RANGE)。

      显示的范围以度为单位。由于浮点运算,确切的范围限制略有偏差。

    从 MySQL 8.0.16 开始,ST_Length()允许一个可选的*unit*参数,用于指定返回长度值的线性单位。以下规则适用:

    • 如果指定了一个 MySQL 不支持的单位,将会发生ER_UNIT_NOT_FOUND错误。

    • 如果指定了一个受支持的线性单位且 SRID 为 0,则会发生ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT错误。

    • 如果指定了支持的线性单位且 SRID 不为 0,则结果将以该单位表示。

    • 如果未指定单位,则结果将以几何图形的 SRS 单位(笛卡尔或地理)表示。目前,所有 MySQL SRS 均以米表示。

    如果在INFORMATION_SCHEMA ST_UNITS_OF_MEASURE表中找到支持的单位,则支持该单位。请参阅 Section 28.3.37, “The INFORMATION_SCHEMA ST_UNITS_OF_MEASURE Table”。

    mysql> SET @ls = ST_GeomFromText('LineString(1 1,2 2,3 3)');
    mysql> SELECT ST_Length(@ls);
    +--------------------+
    | ST_Length(@ls)     |
    +--------------------+
    | 2.8284271247461903 |
    +--------------------+
    
    mysql> SET @mls = ST_GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))');
    mysql> SELECT ST_Length(@mls);
    +-------------------+
    | ST_Length(@mls)   |
    +-------------------+
    | 4.242640687119286 |
    +-------------------+
    
    mysql> SET @ls = ST_GeomFromText('LineString(1 1,2 2,3 3)', 4326);
    mysql> SELECT ST_Length(@ls);
    +-------------------+
    | ST_Length(@ls)    |
    +-------------------+
    | 313701.9623204328 |
    +-------------------+
    mysql> SELECT ST_Length(@ls, 'metre');
    +-------------------------+
    | ST_Length(@ls, 'metre') |
    +-------------------------+
    |       313701.9623204328 |
    +-------------------------+
    mysql> SELECT ST_Length(@ls, 'foot');
    +------------------------+
    | ST_Length(@ls, 'foot') |
    +------------------------+
    |     1029205.9131247795 |
    +------------------------+
    
  • ST_NumPoints(*ls*)

    返回LineString值*ls*中的Point对象数量。

    ST_NumPoints()处理其参数的方式如本节介绍所述。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT ST_NumPoints(ST_GeomFromText(@ls));
    +------------------------------------+
    | ST_NumPoints(ST_GeomFromText(@ls)) |
    +------------------------------------+
    |                                  3 |
    +------------------------------------+
    
  • ST_PointN(*ls*, *N*)

    返回LineString值*ls中第N*个Point。点从 1 开始编号。

    ST_PointN()处理其参数的方式如本节介绍所述。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT ST_AsText(ST_PointN(ST_GeomFromText(@ls),2));
    +----------------------------------------------+
    | ST_AsText(ST_PointN(ST_GeomFromText(@ls),2)) |
    +----------------------------------------------+
    | POINT(2 2)                                   |
    +----------------------------------------------+
    
  • ST_StartPoint(*ls*)

    返回LineString值*ls*的起始点Point

    ST_StartPoint()处理其参数的方式如本节介绍所述。

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT ST_AsText(ST_StartPoint(ST_GeomFromText(@ls)));
    +------------------------------------------------+
    | ST_AsText(ST_StartPoint(ST_GeomFromText(@ls))) |
    +------------------------------------------------+
    | POINT(1 1)                                     |
    +------------------------------------------------+
    

原文:dev.mysql.com/doc/refman/8.0/en/gis-polygon-property-functions.html

14.16.7.4 多边形和多多边形属性函数

本节中的函数返回PolygonMultiPolygon值的属性。

除非另有说明,本节中的函数处理其几何体参数如下:

  • 如果任何参数是NULL或任何几何体参数是空几何体,则返回值为NULL

  • 如果任何几何体参数不是语法正确的几何体,则会发生ER_GIS_INVALID_DATA错误。

  • 如果任何几何体参数是在未定义的空间参考系统(SRS)中语法正确的几何体,则会发生ER_SRS_NOT_FOUND错误。

  • 对于接受多个几何体参数的函数,如果这些参数不在相同的 SRS 中,则会发生ER_GIS_DIFFERENT_SRIDS错误。

  • 否则,返回值为非NULL

可用于获取多边形属性的这些函数:

  • ST_Area({*poly*|*mpoly*})

    返回一个双精度数字,指示PolygonMultiPolygon参数的面积,以其空间参考系统中的度量为准。

    截至 MySQL 8.0.13,ST_Area()处理其参数如本节介绍中所述,但有以下例外:

    • 如果几何体在几何上无效,则结果要么是未定义的面积(即可以是任何数字),要么会发生错误。

    • 如果几何体有效但不是PolygonMultiPolygon对象,则会发生ER_UNEXPECTED_GEOMETRY_TYPE错误。

    • 如果几何体在笛卡尔 SRS 中是有效的Polygon,则结果是多边形的笛卡尔面积。

    • 如果几何体在笛卡尔 SRS 中是有效的MultiPolygon,则结果是多边形的笛卡尔面积之和。

    • 如果几何体在地理 SRS 中是有效的Polygon,则结果是该 SRS 中多边形的大地面积,单位为平方米。

    • 如果几何体在地理空间参考系统(SRS)中是有效的MultiPolygon,则结果是该 SRS 中多边形的大地面积之和,单位为平方米。

    • 如果面积计算结果为+inf,则会发生ER_DATA_OUT_OF_RANGE错误。

    • 如果几何体具有经度或纬度超出范围的地理 SRS,则会��生错误:

      • 如果经度值不在(-180, 180]范围内,则会出现ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LONGITUDE_OUT_OF_RANGE)。

      • 如果纬度值不在[-90, 90]范围内,则会出现ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LATITUDE_OUT_OF_RANGE)。

      显示的范围为度数。由于浮点运算,确切的范围限制略有偏差。

    在 MySQL 8.0.13 之前,ST_Area() 处理其参数如本节介绍中所述,但有以下例外:

    • 对于维度为 0 或 1 的参数,结果为 0。

    • 如果几何体为空,则返��值为 0 而不是NULL

    • 对于几何集合,结果是所有组件面积值的总和。如果几何集合为空,则其面积返回为 0。

    • 如果几何体具有地理空间参考系统(SRS)的 SRID 值,则会出现ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。

    mysql> SET @poly =
           'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))';
    mysql> SELECT ST_Area(ST_GeomFromText(@poly));
    +---------------------------------+
    | ST_Area(ST_GeomFromText(@poly)) |
    +---------------------------------+
    |                               4 |
    +---------------------------------+
    
    mysql> SET @mpoly =
           'MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))';
    mysql> SELECT ST_Area(ST_GeomFromText(@mpoly));
    +----------------------------------+
    | ST_Area(ST_GeomFromText(@mpoly)) |
    +----------------------------------+
    |                                8 |
    +----------------------------------+
    
  • ST_Centroid({*poly*|*mpoly*})

    PolygonMultiPolygon参数的数学质心作为Point返回。结果不能保证在MultiPolygon上。

    此函数通过计算集合中维度最高的组件的质心点来处理几何集合。这些组件被提取并组成一个单独的MultiPolygonMultiLineStringMultiPoint以进行质心计算。

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

    • 当参数为一个空的几何集合时,返回值为NULL

    • 如果几何体具有地理空间参考系统(SRS)的 SRID 值,则会出现ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。

    mysql> SET @poly =
           ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))');
    mysql> SELECT ST_GeometryType(@poly),ST_AsText(ST_Centroid(@poly));
    +------------------------+--------------------------------------------+
    | ST_GeometryType(@poly) | ST_AsText(ST_Centroid(@poly))              |
    +------------------------+--------------------------------------------+
    | POLYGON                | POINT(4.958333333333333 4.958333333333333) |
    +------------------------+--------------------------------------------+
    
  • ST_ExteriorRing(*poly*)

    Polygonpoly 的外环作为LineString返回。

    ST_ExteriorRing() 处理其参数如本节介绍中所述。

    mysql> SET @poly =
           'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT ST_AsText(ST_ExteriorRing(ST_GeomFromText(@poly)));
    +----------------------------------------------------+
    | ST_AsText(ST_ExteriorRing(ST_GeomFromText(@poly))) |
    +----------------------------------------------------+
    | LINESTRING(0 0,0 3,3 3,3 0,0 0)                    |
    +----------------------------------------------------+
    
  • ST_InteriorRingN(*poly*, *N*)

    返回Polygon值*poly中第N*个内部环作为LineString。环从 1 开始编号。

    ST_InteriorRingN() 处理其参数,如本节介绍所述。

    mysql> SET @poly =
           'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT ST_AsText(ST_InteriorRingN(ST_GeomFromText(@poly),1));
    +-------------------------------------------------------+
    | ST_AsText(ST_InteriorRingN(ST_GeomFromText(@poly),1)) |
    +-------------------------------------------------------+
    | LINESTRING(1 1,1 2,2 2,2 1,1 1)                       |
    +-------------------------------------------------------+
    
  • ST_NumInteriorRing(*poly*), ST_NumInteriorRings(*poly*)

    返回Polygon值*poly*中内部环的数量。

    ST_NumInteriorRing()ST_NuminteriorRings() 处理其参数,如本节介绍所述。

    mysql> SET @poly =
           'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))';
    mysql> SELECT ST_NumInteriorRings(ST_GeomFromText(@poly));
    +---------------------------------------------+
    | ST_NumInteriorRings(ST_GeomFromText(@poly)) |
    +---------------------------------------------+
    |                                           1 |
    +---------------------------------------------+
    

原文:dev.mysql.com/doc/refman/8.0/en/gis-geometrycollection-property-functions.html

14.16.7.5 几何集合属性函数

这些函数返回 GeometryCollection 值的属性。

除非另有说明,本节中的函数将其几何参数处理如下:

  • 如果任何参数是 NULL 或任何几何参数是空几何体,则返回值为 NULL

  • 如果任何几何参数不是语法上良好形成的几何体,则会发生 ER_GIS_INVALID_DATA 错误。

  • 如果任何几何参数是在未定义的空间参考系统(SRS)中是语法上良好形成的几何体,则会发生 ER_SRS_NOT_FOUND 错误。

  • 否则,返回值为非 NULL

这些函数可用于获取几何集合属性:

  • ST_GeometryN(*gc*, *N*)

    返回 GeometryCollectiongc 中第 N 个几何体。几何体从 1 开始编号。

    ST_GeometryN() 处理其参数,如本节介绍的那样。

    mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';
    mysql> SELECT ST_AsText(ST_GeometryN(ST_GeomFromText(@gc),1));
    +-------------------------------------------------+
    | ST_AsText(ST_GeometryN(ST_GeomFromText(@gc),1)) |
    +-------------------------------------------------+
    | POINT(1 1)                                      |
    +-------------------------------------------------+
    
  • ST_NumGeometries(*gc*)

    返回 GeometryCollectiongc 中的几何体数量。

    ST_NumGeometries() 处理其参数,如本节介绍的那样。

    mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';
    mysql> SELECT ST_NumGeometries(ST_GeomFromText(@gc));
    +----------------------------------------+
    | ST_NumGeometries(ST_GeomFromText(@gc)) |
    +----------------------------------------+
    |                                      2 |
    +----------------------------------------+
    

14.16.8 空间运算符函数

原文:dev.mysql.com/doc/refman/8.0/en/spatial-operator-functions.html

OpenGIS 提出了许多可以生成几何的函数。它们旨在实现空间运算符。这些函数支持除根据Open Geospatial Consortium规范不适用的参数类型组合之外的所有参数类型组合。

MySQL 还实现了一些作为 OpenGIS 扩展的特定函数,如函数描述中所述。此外,第 14.16.7 节,“几何属性函数”讨论了几个从现有几何构造新几何的函数。请参阅该部分以了解这些函数的描述:

  • ST_Envelope(*g*)

  • ST_StartPoint(*ls*)

  • ST_EndPoint(*ls*)

  • ST_PointN(*ls*, *N*)

  • ST_ExteriorRing(*poly*)

  • ST_InteriorRingN(*poly*, *N*)

  • ST_GeometryN(*gc*, *N*)

除非另有说明,本节中的函数处理其几何参数如下:

  • 如果任何参数为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错误(在 MySQL 8.0.12 之前是 ER_LONGITUDE_OUT_OF_RANGE)。

    • 如果纬度值不在范围 [−90, 90] 内,会出现一个ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前是 ER_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() 支持PolygonMultiPolygon值的负距离,以及包含PolygonMultiPolygon值的几何集合。

    • 如果结果减少到消失,结果是一个空几何体。

    • 对于具有负距离的PointMultiPointLineStringMultiLineString值以及不包含任何PolygonMultiPolygon值的几何集合的ST_Buffer()会出现一个ER_WRONG_ARGUMENTS错误。

    如果几何参数在地理 SRS 中:

    • 在 MySQL 8.0.26 之前,会出现一个ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。

    • 截至 MySQL 8.0.26,允许在地理 SRS 中使用Point几何体。对于非Point几何体,仍会出现一个ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。

    对于允许地理Point几何体的 MySQL 版本:

    • 如果距离不为负数且未指定任何策略,则函数返回其 SRS 中点的地理缓冲区。距离参数必须以 SRS 距离单位(目前始终为米)表示。

    • 如果距离为负数或指定了任何策略(除了NULL),则会发生ER_WRONG_ARGUMENTS错误。

    ST_Buffer()允许在距离参数后跟随最多三个可选策略参数。策略影响缓冲计算。这些参数是由ST_Buffer_Strategy()函数生成的字节字符串值,用于点、连接和端点策略:

    • 点策略适用于PointMultiPoint几何体。如果未指定点策略,则默认为ST_Buffer_Strategy('point_circle', 32)

    • 连接策略适用于LineStringMultiLineStringPolygonMultiPolygon几何体。如果未指定连接策略,则默认为ST_Buffer_Strategy('join_round', 32)

    • 端点策略适用于LineStringMultiLineString几何体。如果未指定端点策略,则默认为ST_Buffer_Strategy('end_round', 32)

    每种类型最多可以指定一个策略,并且可以以任何顺序给出。

    如果缓冲策略无效,则会发生ER_WRONG_ARGUMENTS错误。在以下任何情况下,策略都是无效的:

    • 指定了给定类型(点、连接或端点)的多个策略。

    • 作为策略传递的不是策略的值(例如任意二进制字符串或数字)。

    • 传递了一个Point策略,几何体不包含PointMultiPoint值。

    • 传递了端点或连接策略,几何体不包含LineStringPolygonMultiLinestringMultiPolygon值。

    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错误。

  • ST_ConvexHull(*g*)

    返回一个表示几何值*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))                 |
    +-----------------------------------------------+
    
  • ST_Difference(*g1*, *g2*)

    返回一个几何体,表示几何值*g1g2*的点集差集。结果与几何参数在相同的 SRS 中。

    截至 MySQL 8.0.26,ST_Difference()允许在笛卡尔或地理 SRS 中使用参数。在 MySQL 8.0.26 之前,ST_Difference()仅允许在笛卡尔 SRS 中使用参数;对于地理 SRS 中的参数,会出现ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_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)                         |
    +------------------------------------+
    
  • ST_Intersection(*g1*, *g2*)

    返回一个几何体,表示几何值*g1g2*的点集交集。结果与几何参数在相同的 SRS 中。

    截至 MySQL 8.0.27,ST_Intersection()允许在笛卡尔或地理 SRS 中使用参数。在 MySQL 8.0.27 之前,ST_Intersection()仅允许在笛卡尔 SRS 中使用参数;对于地理 SRS 中的参数,会出现ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。

    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]内的分数距离,并返回LineString上给定分数距离从起点到终点的距离的Point。它可用于回答诸如哪个Point位于由几何参数描述的道路中点的问题。

    该函数在所有空间参考系统中实现了对LineString几何的支持,包括笛卡尔和地理坐标系。

    如果*fractional_distance*参数为 1.0,则由于近似值计算中的数值不准确性,结果可能并非LineString参数的确切最后一个点,而是接近它的点。

    一个相关函数,ST_LineInterpolatePoints(),接受类似参数,但返回由LineString上每个距离从起点到终点的分数的Point值组成的MultiPoint。有关这两个函数的示例,请参阅ST_LineInterpolatePoints()描述。

    ST_LineInterpolatePoint()处理其参数的方式如本节介绍的那样,但有以下例外:

    • 如果几何参数不是LineString,则会出现ER_UNEXPECTED_GEOMETRY_TYPE错误。

    • 如果分数距离参数超出范围[0.0, 1.0],则会出现ER_DATA_OUT_OF_RANGE错误。

    ST_LineInterpolatePoint()是 MySQL 对 OpenGIS 的扩展。此函数在 MySQL 8.0.24 中添加。

  • ST_LineInterpolatePoints(*ls*, *fractional_distance*)

    此函数接受一个LineString几何体和一个范围在(0.0, 1.0]的分数距离,并返回由LineString起始点加上沿着LineString的每个分数距离处的Point值组成的MultiPoint。它可以用来回答诸如描述几何参数的道路每隔 10%的距离处是哪些Point值的问题。

    该函数适用于所有空间参考系统中的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 的扩展。此函数在 MySQL 8.0.24 中添加。

  • ST_PointAtDistance(*ls*, *distance*)

    此函数接受一个LineString几何体和一个距离范围在 0.0, [ST_Length(*ls*)]之间的距离,以LineString的空间参考系统(SRS)单位测量,并返回沿着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 的扩展。此函数在 MySQL 8.0.24 中添加。

  • ST_SymDifference(*g1*, *g2*)

    返回表示几何值 g1g2 的点集对称差异的几何体,定义如下:

    *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)中。

    截至 MySQL 8.0.27,ST_SymDifference() 允许在笛卡尔或地理 SRS 中使用参数。在 MySQL 8.0.27 之前,ST_SymDifference() 仅允许在笛卡尔 SRS 中使用参数;对于地理 SRS 中的参数,会出现 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误。

    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))               |
    +---------------------------------------+
    
  • ST_Transform(*g*, *target_srid*)

    将几何从一个空间参考系统(SRS)转换到另一个。返回值是与输入几何相同类型的几何,所有坐标都转换为目标 SRID,target_srid。在 MySQL 8.0.30 之前,转换支持仅限于地理 SRS(除非几何参数的 SRID 与目标 SRID 值相同,在这种情况下,对于任何有效的 SRS,返回值是输入几何),此函数不支持笛卡尔 SRS。从 MySQL 8.0.30 开始,支持 Popular Visualisation Pseudo Mercator(EPSG 1024)投影方法,用于 WGS 84 Pseudo-Mercator(SRID 3857)。在 MySQL 8.0.32 及更高版本中,支持扩展到除以下列出的 SRS 外的所有由 EPSG 定义的 SRS:

    • EPSG 1042 Krovak Modified

    • EPSG 1043 Krovak Modified(北向)

    • EPSG 9816 突尼斯矿业网格

    • EPSG 9826 Lambert Conic Conformal(西向)

    ST_Transform() 处理其参数如本节介绍的那样,但有以下例外:

    • 具有地理空间参考系统(SRS)的 SRID 值的几何参数不会产生错误。

    • 如果几何或目标 SRID 参数具有指向未定义空间参考系统(SRS)的 SRID 值,则会发生 ER_SRS_NOT_FOUND 错误。

    • 如果几何体在一个ST_Transform()无法从中转换的 SRS 中,将会发生ER_TRANSFORM_SOURCE_SRS_NOT_SUPPORTED错误。

    • 如果目标 SRID 在一个ST_Transform()无法转换到的 SRS 中,将会发生ER_TRANSFORM_TARGET_SRS_NOT_SUPPORTED错误。

    • 如果几何体在一个没有 TOWGS84 子句的不是 WGS 84 的 SRS 中,将会发生ER_TRANSFORM_SOURCE_SRS_MISSING_TOWGS84错误。

    • 如果目标 SRID 在一个没有 TOWGS84 子句的不是 WGS 84 的 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) |
    +---------------------------------------------+
    
  • ST_Union(*g1*, *g2*)

    返回一个几何体,表示几何值*g1g2*的点集并。结果与几何参数在相同的 SRS 中。

    截至 MySQL 8.0.26,ST_Union()允许参数在笛卡尔或地理 SRS 中。在 MySQL 8.0.26 之前,ST_Union()仅允许参数在笛卡尔 SRS 中;对于地理 SRS 中的参数,将会发生ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。

    ST_Union()处理其参数如本节介绍的那样。

    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)) |
    +--------------------------------------+
    

14.16.9 测试几何对象之间空间关系的函数

原文:dev.mysql.com/doc/refman/8.0/en/spatial-relation-functions.html

14.16.9.1 使用对象形状的空间关系函数

14.16.9.2 使用最小外接矩形的空间关系函数

本节描述的函数接受两个几何对象作为参数,并返回它们之间的定性或定量关系。

MySQL 实现了两组函数,使用由 OpenGIS 规范定义的函数名称。一组函数使用精确的对象形状测试两个几何值之间的关系,另一组函数使用对象的最小外接矩形(MBRs)。

原文:dev.mysql.com/doc/refman/8.0/en/spatial-relation-functions-object-shapes.html

14.16.9.1 使用对象形状的空间关系函数

OpenGIS 规范定义了以下函数,用于测试两个几何值 g1g2 之间的关系,使用精确的对象形状。返回值 1 和 0 分别表示真和假,除了距离函数返回距离值。

此部分中的函数检测笛卡尔或地理空间参考系统(SRS)中的参数,并返回适合该 SRS 的结果。

除非另有说明,此部分中的函数处理其几何参数如下:

  • 如果任何参数为NULL或任何几何参数为空几何体,则返回值为NULL

  • 如果任何几何参数不是语法上良好形成的几何体,则会发生ER_GIS_INVALID_DATA错误。

  • 如果任何几何参数是在未定义空间参考系统(SRS)中的语法上良好形成的几何体,则会发生ER_SRS_NOT_FOUND错误。

  • 对于接受多个几何参数的函数,如果这些参数不在同一个 SRS 中,则会发生ER_GIS_DIFFERENT_SRIDS错误。

  • 如果任何几何参数几何上无效,则结果为真或假(未定义哪个),或者会发生错误。

  • 对于地理 SRS 几何参数,如果任何参数的经度或��度超出范围,则会发生错误:

    • 如果经度值不在范围(−180, 180]内,则会发生ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LONGITUDE_OUT_OF_RANGE)。

    • 如果纬度值不在范围 [−90, 90] 内,则会发生ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LATITUDE_OUT_OF_RANGE)。

    显示的范围以度为单位。如果一个 SRS 使用另一个单位,则范围使用其单位中的相应值。由于浮点运算,确切的范围限制略有偏差。

  • 否则,返回值为非NULL

此部分中的一些函数允许一个单位参数,指定返回值的长度单位。除非另有说明,函数处理其单位参数如下:

  • 如果在INFORMATION_SCHEMA ST_UNITS_OF_MEASURE表中找到单位,则支持该单位。请参见 Section 28.3.37, “The INFORMATION_SCHEMA ST_UNITS_OF_MEASURE Table”。

  • 如果指定了单位但 MySQL 不支持,将出现ER_UNIT_NOT_FOUND错误。

  • 如果指定了支持的线性单位且 SRID 为 0,则会出现ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT错误。

  • 如果指定了支持的线性单位且 SRID 不为 0,则结果以该单位表示。

  • 如果未指定单位,则结果以几何图形的 SRS 单位表示,无论是笛卡尔还是地理。目前,所有 MySQL SRS 都以米表示。

这些对象形状函数可用于测试几何关系:

  • ST_Contains(*g1*, *g2*)

    返回 1 或 0 以指示*g1是否完全包含g2*。这测试与ST_Within()相反的关系。

    ST_Contains() 处理其参数如本节介绍的那样。

  • ST_Crosses(*g1*, *g2*)

    如果它们的空间关系具有以下属性,则两个几何体空间交叉

    • 除非*g1g2都是 1 维的:g1g2相交,如果g2的内部与g1的内部有共同点,但g2不覆盖g1*的整个内部。

    • 如果*g1g2*都是 1 维的:如果线在有限数量的点上相交(即没有共同的线段,只有共同的单个点)。

    此函数返回 1 或 0 以指示*g1是否在空间上与g2*相交。

    ST_Crosses() 处理其参数如本节介绍的那样,除了对于这些额外条件,返回值为NULL

    • *g1*是 2 维的(PolygonMultiPolygon)。

    • *g2*是 1 维的(PointMultiPoint)。

  • ST_Disjoint(*g1*, *g2*)

    返回 1 或 0 以指示*g1是否在空间上与g2*不相交(不相交)。

    ST_Disjoint() 处理其参数如本节介绍的那样。

  • ST_Distance(*g1*, *g2* [, *unit*])

    返回*g1g2之间的距离,以几何参数的空间参考系统(SRS)的长度单位或可选的unit*参数指定的单位进行测量。

    该函数通过返回两个几何参数的所有组件之间的最短距离来处理几何集合。

    ST_Distance() 处理其几何参数的方式如本节介绍所述,但有以下例外:

    • ST_Distance() 检测地理(椭球体)空间参考系统中的参数,并返回椭球体上的大地距离。从 MySQL 8.0.18 开始,ST_Distance() 支持所有几何类型的地理 SRS 参数的距离计算。在 MySQL 8.0.18 之前,唯一允许的地理参数类型是PointPoint,或PointMultiPoint(任意参数顺序)。如果在地理 SRS 中使用其他几何类型参数组合调用,将会出现ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误。

    • 如果任何参数在几何上无效,则结果要么是未定义的距离(即可以是任何数字),要么会出现错误。

    • 如果中间或最终结果产生NaN或负数,则会出现ER_GIS_INVALID_DATA错误。

    从 MySQL 8.0.14 开始,ST_Distance() 允许一个可选的*unit参数,用于指定返回距离值的线性单位。ST_Distance() 处理其unit*参数的方式如本节介绍所述。

    mysql> SET @g1 = ST_GeomFromText('POINT(1 1)');
    mysql> SET @g2 = ST_GeomFromText('POINT(2 2)');
    mysql> SELECT ST_Distance(@g1, @g2);
    +-----------------------+
    | ST_Distance(@g1, @g2) |
    +-----------------------+
    |    1.4142135623730951 |
    +-----------------------+
    
    mysql> SET @g1 = ST_GeomFromText('POINT(1 1)', 4326);
    mysql> SET @g2 = ST_GeomFromText('POINT(2 2)', 4326);
    mysql> SELECT ST_Distance(@g1, @g2);
    +-----------------------+
    | ST_Distance(@g1, @g2) |
    +-----------------------+
    |     156874.3859490455 |
    +-----------------------+
    mysql> SELECT ST_Distance(@g1, @g2, 'metre');
    +--------------------------------+
    | ST_Distance(@g1, @g2, 'metre') |
    +--------------------------------+
    |              156874.3859490455 |
    +--------------------------------+
    mysql> SELECT ST_Distance(@g1, @g2, 'foot');
    +-------------------------------+
    | ST_Distance(@g1, @g2, 'foot') |
    +-------------------------------+
    |             514679.7439273146 |
    +-------------------------------+
    

    对于在球体上进行距离计算的特殊情况,请参阅ST_Distance_Sphere()函数。

  • ST_Equals(*g1*, *g2*)

    返回 1 或 0 以指示*g1是否空间上等于g2*。

    ST_Equals() 处理其参数的方式如本节介绍所述,但对于空几何参数不返回NULL

    mysql> SET @g1 = Point(1,1), @g2 = Point(2,2);
    mysql> SELECT ST_Equals(@g1, @g1), ST_Equals(@g1, @g2);
    +---------------------+---------------------+
    | ST_Equals(@g1, @g1) | ST_Equals(@g1, @g2) |
    +---------------------+---------------------+
    |                   1 |                   0 |
    +---------------------+---------------------+
    
  • ST_FrechetDistance(*g1*, *g2* [, *unit*])

    返回两个几何图形之间的离散弗雷歇距离,反映了几何图形的相似程度。结果是一个双精度数字,以几何参数的空间参考系统(SRS)的长度单位或*unit*参数的长度单位来衡量,如果给定了该参数。

    此函数实现了离散弗雷歇距离,这意味着它仅限于几何图形上的点之间的距离。例如,给定两个LineString参数,只考虑几何图形中明确提到的点。这些点之间的线段上的点不被考虑。

    ST_FrechetDistance() 处理其几何参数,如本节介绍中所述,但有以下例外:

    • 几何图形可以具有笛卡尔或地理 SRS,但仅支持LineString值。如果参数在相同的笛卡尔或地理 SRS 中,但任一参数不是LineString,则会出现ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRSER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS错误,取决于 SRS 类型。

    ST_FrechetDistance() 处理其可选的*unit*参数,如本节介绍中所述。

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)');
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2);
    +--------------------------------+
    | ST_FrechetDistance(@ls1, @ls2) |
    +--------------------------------+
    |             2.8284271247461903 |
    +--------------------------------+
    
    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)', 4326);
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)', 4326);
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2);
    +--------------------------------+
    | ST_FrechetDistance(@ls1, @ls2) |
    +--------------------------------+
    |              313421.1999416798 |
    +--------------------------------+
    mysql> SELECT ST_FrechetDistance(@ls1, @ls2, 'foot');
    +----------------------------------------+
    | ST_FrechetDistance(@ls1, @ls2, 'foot') |
    +----------------------------------------+
    |                     1028284.7767115477 |
    +----------------------------------------+
    

    此函数在 MySQL 8.0.23 中添加。

  • ST_HausdorffDistance(*g1*, *g2* [, *unit*])

    返回两个几何图形之间的离散豪斯多夫距离,反映了几何图形的相似程度。结果是一个双精度数字,以几何参数的空间参考系统(SRS)的长度单位或*unit*参数的长度单位来衡量,如果给定了该参数。

    此函数实现了离散豪斯多夫距离,这意味着它仅限于几何图形上的点之间的距离。例如,给定两个LineString参数,只考虑几何图形中明确提到的点。这些点之间的线段上的点不被考虑。

    ST_HausdorffDistance() 处理其几何参数,如本节介绍中所述,但有以下例外:

    • 如果几何体参数在相同的笛卡尔或地理 SRS 中,但不是支持的组合,则会出现 ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRSER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 错误,取决于 SRS 类型。支持以下组合:

      • LineStringLineString

      • PointMultiPoint

      • LineStringMultiLineString

      • MultiPointMultiPoint

      • MultiLineStringMultiLineString

    ST_HausdorffDistance() 处理其可选的 unit 参数如本节介绍所述。

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)');
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2);
    +----------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2) |
    +----------------------------------+
    |                                1 |
    +----------------------------------+
    
    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)', 4326);
    mysql> SET @ls2 = ST_GeomFromText('LINESTRING(0 1,0 6,3 3,5 6)', 4326);
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2);
    +----------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2) |
    +----------------------------------+
    |               111319.49079326246 |
    +----------------------------------+
    mysql> SELECT ST_HausdorffDistance(@ls1, @ls2, 'foot');
    +------------------------------------------+
    | ST_HausdorffDistance(@ls1, @ls2, 'foot') |
    +------------------------------------------+
    |                        365221.4264870815 |
    +------------------------------------------+
    

    此函数在 MySQL 8.0.23 中添加。

  • ST_Intersects(*g1*, *g2*)

    返回 1 或 0 表示 g1 在空间上是否与 g2 相交。

    ST_Intersects() 处理其参数的方式如本节介绍所述。

  • ST_Overlaps(*g1*, *g2*)

    如果两个几何体相交并且它们的交集结果是相同维度但不等于给定几何体之一,则它们在空间上重叠。

    此函数返回 1 或 0 表示 g1 在空间上是否与 g2 重叠。

    ST_Overlaps() 处理其参数的方式如本节介绍所述,除了两个几何体的维度不相等的额外条件,返回值为 NULL

  • ST_Touches(*g1*, *g2*)

    如果两个几何体的内部不相交,但其中一个几何体的边界与另一个的边界或内部相交,则它们在空间上接触

    此函数返回 1 或 0 表示 g1 在空间上是否与 g2 接触。

    ST_Touches() 处理其参数的方式如本节介绍所述,除了对于两个几何体都是 0 维(PointMultiPoint)的额外条件,返回值为 NULL

  • ST_Within(*g1*, *g2*)

    返回 1 或 0 表示 g1 是否在空间上在 g2 内部。这测试与 ST_Contains() 相反的关系。

    ST_Within() 处理其参数的方式如本节介绍所述。

原文:dev.mysql.com/doc/refman/8.0/en/spatial-relation-functions-mbr.html

14.16.9.2 使用最小外接矩形的空间关系函数

MySQL 提供了几个 MySQL 特定的函数,用于测试两个几何图形*g1g2*的最小外接矩形(MBRs)之间的关系。返回值 1 和 0 分别表示真和假。

点的边界框被解释为既是边界又是内部的点。

直线的边界框被解释为一条线,其中线的内部也是边界。端点是边界点。

如果任何参数是几何集合,则这些参数的内部、边界和外部是集合中所有元素的并集。

本节中的函数检测笛卡尔或地理空间参考系统(SRS)中的参数,并返回适合 SRS 的结果。

除非另有说明,本节中的函数处理其几何参数如下:

  • 如果任何参数为NULL或为空几何,则返回值为NULL

  • 如果任何几何参数不是语法上格式良好的几何图形,则会发生ER_GIS_INVALID_DATA错误。

  • 如果任何几何参数是在未定义的空间参考系统(SRS)中语法上格式良好的几何图形,则会发生ER_SRS_NOT_FOUND错误。

  • 对于接受多个几何参数的函数,如果这些参数不在相同的 SRS 中,则会发生ER_GIS_DIFFERENT_SRIDS错误。

  • 如果任何参数在几何上无效,则结果为真或假(未定义),或者会发生错误���

  • 对于地理空间参考系统(SRS)的几何参数,如果任何参数的经度或纬度超出范围,则会发生错误:

    • 如果经度值不在范围(−180, 180]内,则会发生ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LONGITUDE_OUT_OF_RANGE)。

    • 如果纬度值不在范围[−90, 90]内,则会发生ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LATITUDE_OUT_OF_RANGE)。

    显示的范围以度为单位。如果一个 SRS 使用另一个单位,范围将使用其单位中的相应值。由于浮点运算,确切的范围限制略有偏差。

  • 否则,返回值为非NULL

这些 MBR 函数可用于测试几何关系:

  • MBRContains(*g1*, *g2*)

    返回 1 或 0 以指示 g1 的最小边界矩形是否包含 g2 的最小边界矩形。这测试与 MBRWithin() 相反的关系。

    MBRContains() 处理其参数如本节介绍的那样。

    mysql> SET @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = ST_GeomFromText('Point(1 1)');
    mysql> SELECT MBRContains(@g1,@g2), MBRWithin(@g2,@g1);
    +----------------------+--------------------+
    | MBRContains(@g1,@g2) | MBRWithin(@g2,@g1) |
    +----------------------+--------------------+
    |                    1 |                  1 |
    +----------------------+--------------------+
    
  • MBRCoveredBy(*g1*, *g2*)

    返回 1 或 0 以指示 g1 的最小边界矩形是否被 g2 的最小边界矩形覆盖。这测试与 MBRCovers() 相反的关系。

    MBRCoveredBy() 处理其参数如本节介绍的那样。

    mysql> SET @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = ST_GeomFromText('Point(1 1)');
    mysql> SELECT MBRCovers(@g1,@g2), MBRCoveredby(@g1,@g2);
    +--------------------+-----------------------+
    | MBRCovers(@g1,@g2) | MBRCoveredby(@g1,@g2) |
    +--------------------+-----------------------+
    |                  1 |                     0 |
    +--------------------+-----------------------+
    mysql> SELECT MBRCovers(@g2,@g1), MBRCoveredby(@g2,@g1);
    +--------------------+-----------------------+
    | MBRCovers(@g2,@g1) | MBRCoveredby(@g2,@g1) |
    +--------------------+-----------------------+
    |                  0 |                     1 |
    +--------------------+-----------------------+
    
  • MBRCovers(*g1*, *g2*)

    返回 1 或 0 以指示 g1 的最小边界矩形是否覆盖 g2 的最小边界矩形。这测试与 MBRCoveredBy() 相反的关系。参见 MBRCoveredBy() 的描述以获取示例。

    MBRCovers() 处理其参数如本节介绍的那样。

  • MBRDisjoint(*g1*, *g2*)

    返回 1 或 0 以指示两个几何体 g1g2 的最小边界矩形是否不相交。

    MBRDisjoint() 处理其参数如本节介绍的那样。

  • MBREquals(*g1*, *g2*)

    返回 1 或 0 以指示两个几何体 g1g2 的最小边界矩形是否相同。

    MBREquals() 处理其参数如本节介绍的那样,除了对空几何体参数不返回NULL

  • MBRIntersects(*g1*, *g2*)

    返回 1 或 0 以指示两个几何体 g1g2 的最小边界矩形是否相交。

    MBRIntersects() 处理其参数如本节介绍的那样。

  • MBROverlaps(*g1*, *g2*)

    如果两个几何体相交且它们的交集结果是与给定几何体的维度相同但不等于任何一个给定几何体的几何体,则两个几何体空间重叠

    此函数返回 1 或 0,指示两个几何体 g1g2 的最小外接矩形是否重叠。

    MBROverlaps() 处理其参数,如本节介绍的那样。

  • MBRTouches(*g1*, *g2*)

    如果两个几何体的内部不相交,但其中一个几何体的边界与另一个的边界或内部相交,则两个几何体空间接触

    此函数返回 1 或 0,指示两个几何体 g1g2 的最小外接矩形是否相接。

    MBRTouches() 处理其参数,如本节介绍的那样。

  • MBRWithin(*g1*, *g2*)

    返回 1 或 0,指示*g1* 的最小外接矩形是否在*g2* 的最小外接矩形内。这测试与 MBRContains() 相反的关系。

    MBRWithin() 处理其参数,如本节介绍的那样。

    mysql> SET @g1 = ST_GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = ST_GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))');
    mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);
    +--------------------+--------------------+
    | MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |
    +--------------------+--------------------+
    |                  1 |                  0 |
    +--------------------+--------------------+
    

14.16.10 空间 Geohash 函数

原文:dev.mysql.com/doc/refman/8.0/en/spatial-geohash-functions.html

Geohash 是一种将任意精度的纬度和经度坐标编码为文本字符串的系统。Geohash 值是仅包含字符"0123456789bcdefghjkmnpqrstuvwxyz"的字符串。

本节中的函数使得可以操作 geohash 值,从而为应用程序提供了导入和导出 geohash 数据、以及索引和搜索 geohash 值的功能。

除非另有规定,本节中的函数将按照以下方式处理它们的几何参数:

  • 如果任何参数为NULL,则返回值为NULL

  • 如果任何参数无效,则会发生错误。

  • 如果任何参数的经度或纬度超出范围,则会发生错误:

    • 如果经度值不在范围(−180, 180]内,则会发生ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LONGITUDE_OUT_OF_RANGE)。

    • 如果纬度值不在范围[−90, 90]内,则会发生ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE错误(在 MySQL 8.0.12 之前为ER_LATITUDE_OUT_OF_RANGE��。

    显示的范围以度为单位。由于浮点运算,确切的范围限制略有偏差。

  • 如果任何点参数的 SRID 不是 0 或 4326,则会发生ER_SRS_NOT_FOUND错误。*point*参数的 SRID 有效性不会被检查。

  • 如果任何 SRID 参数引用未定义的空间参考系统(SRS),则会发生ER_SRS_NOT_FOUND错误。

  • 如果任何 SRID 参数不在 32 位无符号整数的范围内,则会发生ER_DATA_OUT_OF_RANGE错误。

  • 否则,返回值为非NULL

这些 geohash 函数可用:

  • ST_GeoHash(*longitude*, *latitude*, *max_length*), ST_GeoHash(*point*, *max_length*)

    返回一个连接字符集和排序规则中的 geohash 字符串。

    对于第一个语法,*longitude必须是范围[−180, 180]内的数字,latitude*必须是范围[−90, 90]内的数字。对于第二个语法,需要一个POINT值,其中 X 和 Y 坐标分别在经度和纬度的有效范围内。

    结果字符串的长度不超过*max_length个字符,上限为 100。字符串可能短于max_length个字符,因为创建地理哈希值的算法会一直持续,直到生成一个精确表示位置或max_length*个字符的字符串,以先出现者为准。

    ST_GeoHash()处理其参数的方式如本节介绍所述。

    mysql> SELECT ST_GeoHash(180,0,10), ST_GeoHash(-180,-90,15);
    +----------------------+-------------------------+
    | ST_GeoHash(180,0,10) | ST_GeoHash(-180,-90,15) |
    +----------------------+-------------------------+
    | xbpbpbpbpb           | 000000000000000         |
    +----------------------+-------------------------+
    
  • ST_LatFromGeoHash(*geohash_str*)

    返回地理哈希字符串值的纬度,作为双精度数在范围[−90, 90]内。

    ST_LatFromGeoHash()解码函数从*geohash_str*参数中最多读取 433 个字符。这代表了坐标值内部表示中信息的上限。超过第 433 个字符的字符将被忽略,即使它们在其他情况下是非法的并产生错误。

    ST_LatFromGeoHash()处理其参数的方式如本节介绍所述。

    mysql> SELECT ST_LatFromGeoHash(ST_GeoHash(45,-20,10));
    +------------------------------------------+
    | ST_LatFromGeoHash(ST_GeoHash(45,-20,10)) |
    +------------------------------------------+
    |                                      -20 |
    +------------------------------------------+
    
  • ST_LongFromGeoHash(*geohash_str*)

    返回地理哈希字符串值的经度,作为双精度数在范围[−180, 180]内。

    关于从*geohash_str*参数中处理的最大字符数的描述在ST_LatFromGeoHash()中的备注也适用于ST_LongFromGeoHash()

    ST_LongFromGeoHash()处理其参数的方式如本节介绍所述。

    mysql> SELECT ST_LongFromGeoHash(ST_GeoHash(45,-20,10));
    +-------------------------------------------+
    | ST_LongFromGeoHash(ST_GeoHash(45,-20,10)) |
    +-------------------------------------------+
    |                                        45 |
    +-------------------------------------------+
    
  • ST_PointFromGeoHash(*geohash_str*, *srid*)

    返回包含解码地理哈希值的POINT值,给定地理哈希字符串值。

    点的 X 和 Y 坐标分别是经度范围为[−180, 180]和纬度范围为[−90, 90]。

    *srid*参数是一个 32 位无符号整数。

    关于从*geohash_str*参数中处理的最大字符数的描述在ST_LatFromGeoHash()中的备注也适用于ST_PointFromGeoHash()

    ST_PointFromGeoHash()处理其参数的方式如本节介绍所述。

    mysql> SET @gh = ST_GeoHash(45,-20,10);
    mysql> SELECT ST_AsText(ST_PointFromGeoHash(@gh,0));
    +---------------------------------------+
    | ST_AsText(ST_PointFromGeoHash(@gh,0)) |
    +---------------------------------------+
    | POINT(45 -20)                         |
    +---------------------------------------+
    

14.16.11 空间 GeoJSON 函数

原文:dev.mysql.com/doc/refman/8.0/en/spatial-geojson-functions.html

本节描述了在 GeoJSON 文档和空间值之间转换的函数。GeoJSON 是一种用于编码几何/地理要素的开放标准。有关更多信息,请参见geojson.org。这里讨论的函数遵循 GeoJSON 规范修订版 1.0。

GeoJSON 支持与 MySQL 支持的相同的几何/地理数据类型。除了从中提取几何对象外,不支持 Feature 和 FeatureCollection 对象。CRS 支持仅限于标识 SRID 的值。

MySQL 还支持本机JSON数据类型和一组 SQL 函数,以便对 JSON 值进行操作。有关更多信息,请参见第 13.5 节,“JSON 数据类型”和第 14.17 节,“JSON 函数”。

  • ST_AsGeoJSON(*g* [, *max_dec_digits* [, *options*]])

    从几何体*g*生成一个 GeoJSON 对象。对象字符串具有连接字符集和排序规则。

    如果任何参数为NULL,则返回值为NULL。如果任何非NULL参数无效,则会发生错误。

    max_dec_digits,如果指定,限制了坐标的小数位数并导致输出四舍五入。如果未指定,则此参数默认为其最大值 2³² − 1。最小值为 0。

    options,如果指定,是一个位掩码。下表显示了允许的标志值。如果几何参数的 SRID 为 0,则即使请求了 CRS 对象的标志值也不会产生 CRS 对象。

    标志值含义
    0无选项。如果未指定*options*,则为默认值。
    1将边界框添加到输出中。
    2将短格式 CRS URN 添加到输出中。默认格式是短格式(EPSG:*srid*)。
    4添加长格式 CRS URN(urn:ogc:def:crs:EPSG:*srid*)。此标志覆盖标志 2。例如,选项值为 5 和 7 表示相同的含义(添加边界框和长格式 CRS URN)。
    mysql> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)'),2);
    +-------------------------------------------------------------+
    | ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)'),2) |
    +-------------------------------------------------------------+
    | {"type": "Point", "coordinates": [11.11, 12.22]}            |
    +-------------------------------------------------------------+
    
  • ST_GeomFromGeoJSON(*str* [, *options* [, *srid*]])

    解析表示 GeoJSON 对象的字符串*str*并返回几何体。

    如果任何参数为NULL,则返回值为NULL。如果任何非NULL参数无效,则会发生错误。

    options,如果给定,描述如何处理包含高于 2 维坐标的几何体的 GeoJSON 文档。下表显示了允许的*options*值。

    选项值含义
    1拒绝文档并生成错误。如果未指定*options*,则为默认值。
    2, 3, 4接受文档并去除高维坐标的坐标。

    options 的值为 2、3 和 4 目前产生相同的效果。如果将来支持坐标维度高于 2 的几何体,可以预期这些值会产生不同的效果。

    如果给定 srid 参数,必须是一个 32 位无符号整数。如果未给定,几何返回值的 SRID 为 4326。

    如果 srid 指的是未定义的空间参考系统 (SRS),将会出现 ER_SRS_NOT_FOUND 错误。

    对于地理 SRS 几何参数,如果任何参数的经度或纬度超出范围,将会出现错误:

    • 如果经度值不在范围 (−180, 180] 内,将会出现 ER_LONGITUDE_OUT_OF_RANGE 错误。

    • 如果纬度值不在范围 [−90, 90] 内,将会出现 ER_LATITUDE_OUT_OF_RANGE 错误。

    显示的范围以度为单位。如果一个 SRS 使用其他单位,范围将使用其单位的相应值。由于浮点运算,确切的范围限制略有偏差。

    GeoJSON 几何体、要素和要素集合对象可能具有一个 crs 属性。解析函数解析 urn:ogc:def:crs:EPSG::*srid*EPSG:*srid* 命名的 CRS URNs,但不解析作为链接对象给出的 CRS。此外,urn:ogc:def:crs:OGC:1.3:CRS84 被识别为 SRID 4326。如果对象具有无法理解的 CRS,将会出现错误,但如果给定了可选的 srid 参数,则会忽略任何 CRS,即使它是无效的。

    如果在 GeoJSON 文档的较低级别找到一个指定与顶级对象 SRID 不同的 SRID 的 crs 成员,将会出现 ER_INVALID_GEOJSON_CRS_NOT_TOP_LEVEL 错误。

    如 GeoJSON 规范所述,对于 GeoJSON 输入的 type 成员(PointLineString 等),解析是区分大小写的。规范对于其他解析的大小写敏感性保持沉默,在 MySQL 中不区分大小写。

    这个例子展示了一个简单 GeoJSON 对象的解析结果。请注意,坐标的顺序取决于所使用的 SRID。

    mysql> SET @json = '{ "type": "Point", "coordinates": [102.0, 0.0]}';
    mysql> SELECT ST_AsText(ST_GeomFromGeoJSON(@json));
    +--------------------------------------+
    | ST_AsText(ST_GeomFromGeoJSON(@json)) |
    +--------------------------------------+
    | POINT(0 102)                         |
    +--------------------------------------+
    mysql> SELECT ST_SRID(ST_GeomFromGeoJSON(@json));
    +------------------------------------+
    | ST_SRID(ST_GeomFromGeoJSON(@json)) |
    +------------------------------------+
    |                               4326 |
    +------------------------------------+
    mysql> SELECT ST_AsText(ST_SRID(ST_GeomFromGeoJSON(@json),0));
    +-------------------------------------------------+
    | ST_AsText(ST_SRID(ST_GeomFromGeoJSON(@json),0)) |
    +-------------------------------------------------+
    | POINT(102 0)                                    |
    +-------------------------------------------------+
    

14.16.12 空间聚合函数

dev.mysql.com/doc/refman/8.0/en/spatial-aggregate-functions.html

MySQL 支持对一组值执行计算的聚合函数。有关这些函数的一般信息,请参见第 14.19.1 节,“聚合函数描述”。本节描述了ST_Collect()空间聚合函数。

ST_Collect()可以作为窗口函数使用,如其语法描述中的[*over_clause*]所示,表示可选的OVER子句。*over_clause*在第 14.20.2 节,“窗口函数概念和语法”中描述,该节还包括有关窗口函数使用的其他信息。

  • ST_Collect([DISTINCT] *g*) [*over_clause*]

    聚合几何值并返回单个几何集合值。使用DISTINCT选项,返回不同几何参数的聚合。

    与其他聚合函数一样,可以使用GROUP BY将参数分组为子集。ST_Collect()为每个子集返回一个聚合值。

    如果*over_clause存在,则此函数将作为窗口函数执行。over_clause如第 14.20.2 节,“窗口函数概念和语法”中描述的那样。与大多数支持窗口化的聚合函数不同,ST_Collect()允许将over_clause*与DISTINCT一起使用。

    ST_Collect()处理其参数如下:

    • NULL参数将被忽略。

    • 如果所有参数都为NULL或聚合结果为空,则返回值为NULL

    • 如果任何几何参数不是语法上良好形式的几何图形,则会发生ER_GIS_INVALID_DATA错误。

    • 如果任何几何参数是在未定义的空间参考系统(SRS)中为语法上良好形式的几何图形,则会发生ER_SRS_NOT_FOUND错误。

    • 如果存在多个几何参数且这些参数在相同的 SRS 中,则返回值也将在该 SRS 中。如果这些参数不在相同的 SRS 中,则会发生ER_GIS_DIFFERENT_SRIDS_AGGREGATION错误。

    • 结果是可能的最窄的Multi*Xxx*GeometryCollection值,结果类型根据非NULL几何参数确定如下:

      • 如果所有参数都是Point值,则结果是一个MultiPoint值。

      • 如果所有参数都是LineString值,则结果是一个MultiLineString值。

      • 如果所有参数都是Polygon值,则结果是一个MultiPolygon值。

      • 否则,参数是几何类型的混合,结果是一个GeometryCollection值。

    这个示例数据集展示了假设产品按年份和制造地点的情况:

    CREATE TABLE product (
      year INTEGER,
      product VARCHAR(256),
      location Geometry
    );
    
    INSERT INTO product
    (year,  product,     location) VALUES
    (2000, "Calculator", ST_GeomFromText('point(60 -24)',4326)),
    (2000, "Computer"  , ST_GeomFromText('point(28 -77)',4326)),
    (2000, "Abacus"    , ST_GeomFromText('point(28 -77)',4326)),
    (2000, "TV"        , ST_GeomFromText('point(38  60)',4326)),
    (2001, "Calculator", ST_GeomFromText('point(60 -24)',4326)),
    (2001, "Computer"  , ST_GeomFromText('point(28 -77)',4326));
    

    一些使用ST_Collect()在数据集上的示例查询:

    mysql> SELECT ST_AsText(ST_Collect(location)) AS result
           FROM product;
    +------------------------------------------------------------------+
    | result                                                           |
    +------------------------------------------------------------------+
    | MULTIPOINT((60 -24),(28 -77),(28 -77),(38 60),(60 -24),(28 -77)) |
    +------------------------------------------------------------------+
    
    mysql> SELECT ST_AsText(ST_Collect(DISTINCT location)) AS result
           FROM product;
    +---------------------------------------+
    | result                                |
    +---------------------------------------+
    | MULTIPOINT((60 -24),(28 -77),(38 60)) |
    +---------------------------------------+
    
    mysql> SELECT year, ST_AsText(ST_Collect(location)) AS result
           FROM product GROUP BY year;
    +------+------------------------------------------------+
    | year | result                                         |
    +------+------------------------------------------------+
    | 2000 | MULTIPOINT((60 -24),(28 -77),(28 -77),(38 60)) |
    | 2001 | MULTIPOINT((60 -24),(28 -77))                  |
    +------+------------------------------------------------+
    
    mysql> SELECT year, ST_AsText(ST_Collect(DISTINCT location)) AS result
           FROM product GROUP BY year;
    +------+---------------------------------------+
    | year | result                                |
    +------+---------------------------------------+
    | 2000 | MULTIPOINT((60 -24),(28 -77),(38 60)) |
    | 2001 | MULTIPOINT((60 -24),(28 -77))         |
    +------+---------------------------------------+
    
    # selects nothing
    mysql> SELECT ST_Collect(location) AS result
           FROM product WHERE year = 1999;
    +--------+
    | result |
    +--------+
    | NULL   |
    +--------+
    
    mysql> SELECT ST_AsText(ST_Collect(location)
             OVER (ORDER BY year, product ROWS BETWEEN 1 PRECEDING AND CURRENT ROW))
             AS result
           FROM product;
    +-------------------------------+
    | result                        |
    +-------------------------------+
    | MULTIPOINT((28 -77))          |
    | MULTIPOINT((28 -77),(60 -24)) |
    | MULTIPOINT((60 -24),(28 -77)) |
    | MULTIPOINT((28 -77),(38 60))  |
    | MULTIPOINT((38 60),(60 -24))  |
    | MULTIPOINT((60 -24),(28 -77)) |
    +-------------------------------+
    

    此函数在 MySQL 8.0.24 中添加。