---
title: github-fill
description: 几何属性函数 几何属性函数用于访问几何对象的定性或定量属性。OceanBase 数据库当前版本所支持的几何属性函数包括 ST_Area 、 ST_SRID() 、 ST_Latitude() 、 ST_Longitude() 、 ST_X() 和 ST_Y() 。 一个点由 X 和 Y 坐标组成，可以分别使用 ST_…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.3.2

# 几何属性函数

更新时间：2024-08-24 23:00:00

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.3.2/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/400.functions-of-mysql-mode/800.spatial-functions-of-mysql-mode/400.geometry-attribute-functions-of-mysql-mode.md)  

几何属性函数用于访问几何对象的定性或定量属性。OceanBase 数据库当前版本所支持的几何属性函数包括 `ST_Area`、`ST_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 空间对象在空间坐标系下的面积，不支持输入其他类型的空间对象。语法如下：

```sql
ST_Area({poly|mpoly})

```

示例如下：

```sql
obclient> 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

```

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

```sql
obclient> 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 面积之和。

```sql
obclient> 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

```

## ST_SRID

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

```sql
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 值外，还转换几何坐标。

```sql
obclient [test]> SET @geo = ST_GeomFromText('LineString(1 1,2 2)', 0);
Query OK, 0 rows affected

obclient [test]> SELECT ST_SRID(@geo);
+---------------+
| ST_SRID(@geo) |
+---------------+
|             0 |
+---------------+
1 row in set

obclient [test]> SET @geo = ST_SRID(@geo, 4230);
Query OK, 0 rows affected

obclient [test]> SELECT ST_SRID(@geo);
+---------------+
| ST_SRID(@geo) |
+---------------+
|          4230 |
+---------------+
1 row in set

```

## ST_Latitude

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

```sql
ST_Latitude(p [, new_latitude_val])

```

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

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

```sql
obclient [test]> SET @pit = ST_GeomFromText('POINT(45 90)', 4326);
Query OK, 0 rows affected

obclient [test]> SELECT ST_Latitude(@pit);
+-------------------+
| ST_Latitude(@pit) |
+-------------------+
|                45 |
+-------------------+
1 row in set

obclient [test]> SELECT ST_AsText(ST_Latitude(@pit, 30));
+----------------------------------+
| ST_AsText(ST_Latitude(@pit, 30)) |
+----------------------------------+
| POINT(30 90)                     |
+----------------------------------+
1 row in set

```

## ST_Longitude

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

```sql
ST_Longitude(p [, new_longitude_val])

```

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

obclient [test]> SELECT ST_Longitude(@pit);
+--------------------+
| ST_Longitude(@pit) |
+--------------------+
|                 90 |
+--------------------+
1 row in set

obclient [test]> SELECT ST_AsText(ST_Longitude(@pit, 30));
+-----------------------------------+
| ST_AsText(ST_Longitude(@pit, 30)) |
+-----------------------------------+
| POINT(45 30)                      |
+-----------------------------------+
1 row in set

```

## ST_X

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

```sql
ST_X(p [, new_x_val])

```

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

```sql
obclient [test]> SELECT ST_X(Point(53.7, 56.34));
+--------------------------+
| ST_X(Point(53.7, 56.34)) |
+--------------------------+
|                     53.7 |
+--------------------------+
1 row in set

obclient [test]> 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

```

## ST_Y()

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

```sql
ST_Y(p [, new_y_val])

```

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

```sql
obclient [test]> SELECT ST_Y(Point(53.7, 56.34));
+--------------------------+
| ST_Y(Point(53.7, 56.34)) |
+--------------------------+
|                    56.34 |
+--------------------------+
1 row in set

obclient [test]> 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

```

## 参数说明

几何属性相关函数中几何参数的返回值为非 `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`。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
