跳到主要内容

几何属性函数

几何属性函数用于访问几何对象的定性或定量属性。seekdb 当前版本所支持的几何属性函数包括 ST_AreaST_SRID()ST_Latitude()ST_Longitude()ST_X()ST_Y()

一个点由 X 和 Y 坐标组成,可以分别使用 ST_X()ST_Y() 函数获得。对于具有地理空间参考系统 (SRS) 的 Point 对象,可以分别使用 ST_Longitude()ST_Latitude() 函数获得经度和纬度。

ST_Area

ST_Area() 函数用于计算 Polygon 和 MultiPolygon 空间对象在空间坐标系下的面积,不支持输入其他类型的空间对象。语法如下:

ST_Area({poly|mpoly})

示例如下:

SELECT ST_Area(ST_GEOMFROMTEXT('POLYGON((0 0, 0 1, 1 1, 0 0))'));
+-----------------------------------------------------------+
| ST_Area(ST_GEOMFROMTEXT('POLYGON((0 0, 0 1, 1 1, 0 0))')) |
+-----------------------------------------------------------+
| 0.5 |
+-----------------------------------------------------------+
1 row in set (0.001 sec)

ST_Area() 函数不支持计算 0 维(点)或者 1 维(线段)空间对象的面积。

SELECT ST_Area(ST_GEOMFROMTEXT('LINESTRING(0 0, 0 1)'));
ERROR 3516 (22S01): POLYGON/MULTIPOLYGON value is a geometry of unexpected type LINESTRING in st_area.

对于 MultiPolygon 空间对象,ST_Area() 函数返回结果是集合内 Polygon 面积之和。

SELECT ST_Area(ST_GEOMFROMTEXT('MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))'));
+-----------------------------------------------------------------------------------------+
| st_area(ST_GEOMFROMTEXT('MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))')) |
+-----------------------------------------------------------------------------------------+
| 8 |
+-----------------------------------------------------------------------------------------+
1 row in set (0.001 sec)

ST_SRID

ST_SRID() 返回一个整数,指示与 g 关联的空间参考系统 (SRS) 的 ID。语法如下:

ST_SRID(g [, srid])

可选的 srid 参数表示一个有效的 SRID 值,ST_SRID() 返回值与其第一个参数类型相同且 SRID 值等于第二个参数。该函数仅设置对象的 SRID 值,并不执行坐标值的任何转换。对于单参数,ST_SRID() 返回几何 SRID,即使它引用了未定义的 SRS,不会发生 ER_SRS_NOT_FOUND 报错。

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

  • ST_SRID() 更改几何 SRID 值而不转换其坐标。

  • ST_Transform() 除了更改其 SRID 值外,还转换几何坐标。

SET @geo = ST_GeomFromText('LineString(1 1,2 2)', 0);
Query OK, 0 rows affected

SELECT ST_SRID(@geo);
+---------------+
| ST_SRID(@geo) |
+---------------+
| 0 |
+---------------+
1 row in set (0.001 sec)

SET @geo = ST_SRID(@geo, 4230);
Query OK, 0 rows affected

SELECT ST_SRID(@geo);
+---------------+
| ST_SRID(@geo) |
+---------------+
| 4230 |
+---------------+
1 row in set (0.001 sec)

ST_Latitude

ST_Latitude() 函数返回具有地理空间参考系统 (SRS) 的有效 Point 对象 p 的纬度值的双精度数。语法如下:

ST_Latitude(p [, new_latitude_val])

参数 new_latitude_val 是可选的,表示一个有效的纬度值,如果使用该参数,ST_Latitude() 返回一个 Point 对象,其纬度等于第二个参数。

如果 Point 对象有效但没有地理 SRS,则会发生报错 ER_SRS_NOT_GEOGRAPHIC

SET @pit = ST_GeomFromText('POINT(45 90)', 4326);
Query OK, 0 rows affected (0.001 sec)

SELECT ST_Latitude(@pit);
+-------------------+
| ST_Latitude(@pit) |
+-------------------+
| 45 |
+-------------------+
1 row in set (0.001 sec)

SELECT ST_AsText(ST_Latitude(@pit, 30));
+----------------------------------+
| ST_AsText(ST_Latitude(@pit, 30)) |
+----------------------------------+
| POINT(30 90) |
+----------------------------------+
1 row in set (0.001 sec)

ST_Longitude

ST_Longitude() 函数返回具有地理空间参考系统 (SRS) 的有效 Point 对象 p 的经度值的双精度数。语法如下:

ST_Longitude(p [, new_longitude_val])

参数 new_longitude_val 是可选的,表示一个有效的经度值,如果使用该参数,ST_Longitude() 返回一个 Point 对象,其经度等于第二个参数。 如果 Point 对象有效但没有地理 SRS,则会发生报错 ER_SRS_NOT_GEOGRAPHIC

SET @pit = ST_GeomFromText('POINT(45 90)', 4326);
Query OK, 0 rows affected (0.001 sec)

SELECT ST_Longitude(@pit);
+--------------------+
| ST_Longitude(@pit) |
+--------------------+
| 90 |
+--------------------+
1 row in set (0.001 sec)

SELECT ST_AsText(ST_Longitude(@pit, 30));
+-----------------------------------+
| ST_AsText(ST_Longitude(@pit, 30)) |
+-----------------------------------+
| POINT(45 30) |
+-----------------------------------+
1 row in set (0.001 sec)

ST_X

ST_X() 函数返回有效 Point 对象 p 的 X 坐标值的双精度数。X 坐标被认为是指在点空间参考系统 (SRS) 定义中出现的第一个轴。语法如下:

ST_X(p [, new_x_val])

参数 new_x_val 是可选的,如果使用该参数,ST_X() 返回一个 Point 对象,其 X 坐标等于第二个参数。如果 Point 对象具有地理 SRS,则第二个参数必须在经度或纬度值的有效范围内。

SELECT ST_X(Point(53.7, 56.34));
+--------------------------+
| ST_X(Point(53.7, 56.34)) |
+--------------------------+
| 53.7 |
+--------------------------+
1 row in set (0.001 sec)

SELECT ST_AsText(ST_X(Point(53.7, 56.34), 15.5));
+-------------------------------------------+
| ST_AsText(ST_X(Point(53.7, 56.34), 15.5)) |
+-------------------------------------------+
| POINT(15.5 56.34) |
+-------------------------------------------+
1 row in set (0.001 sec)

ST_Y()

ST_Y() 函数返回有效 Point 对象 p 的 Y 坐标值的双精度数。Y 坐标被认为是指在点空间参考系统 (SRS) 定义中出现的第二个轴。语法如下:

ST_Y(p [, new_y_val])

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

SELECT ST_Y(Point(53.7, 56.34));
+--------------------------+
| ST_Y(Point(53.7, 56.34)) |
+--------------------------+
| 56.34 |
+--------------------------+
1 row in set (0.001 sec)

SELECT ST_AsText(ST_Y(Point(53.7, 56.34), 15.5));
+-------------------------------------------+
| ST_AsText(ST_Y(Point(53.7, 56.34), 15.5)) |
+-------------------------------------------+
| POINT(53.7 15.5) |
+-------------------------------------------+
1 row in set (0.001 sec)

参数说明

几何属性相关函数中几何参数的返回值为非 NULL,以下情况除外:

  • 如果任何参数为 NULL 或任何几何参数为空几何,则返回值为 NULL
  • 如果任何几何参数的语法格式不正确,则会报错 ER_GIS_INVALID_DATA
  • 如果任何几何参数属于未定义的空间参考系统 (SRS),则会报错 ER_SRS_NOT_FOUND
  • 如果任何 SRID 参数不在 32 位无符号整数的范围内,则会发生报错 ER_DATA_OUT_OF_RANGE
  • 如果任何 SRID 参数引用未定义的 SRS,则会发生报错 ER_SRS_NOT_FOUND

对于 ST_Latitude()ST_Longitude()ST_X()ST_Y() 函数还要注意以下事项:

  • 如果任何几何参数是有效几何但不是 Point 对象,则会发生报错 ER_UNEXPECTED_GEOMETRY_TYPE
  • 如果提供了 X 或 Y 坐标参数并且值为 -inf+inf NaN,则会发生报错 ER_DATA_OUT_OF_RANGE
  • 如果经度或纬度值超出范围(范围以度为单位,如果 SRS 使用其他单位,则范围使用其单位中的相应值),则会发生报错。
    • 如果经度值不在范围 (-180, 180] 内,则会发生报错 ER_LONGITUDE_OUT_OF_RANGE
    • 如果纬度值不在 [−90, 90] 范围内,则会发生报错 ER_LATITUDE_OUT_OF_RANGE