ST_LENGTH
描述
返回线几何对象的球面长度,或面几何对象的边界周长,单位为米。此函数使用球面地球模型进行计算。
- 对于
LINESTRING(线)或MULTILINESTRING(多线),返回其所有线段在球面上的大圆距离之和,即线对象的长度。 - 对于
POLYGON(多边形)或MULTIPOLYGON(多多边形),返回其外边界和内边界(孔洞)在球面上的大圆距离之和,即面对象的周长。 - 对于
CIRCLE(圆),返回其圆周长,计算公式为2 * π * 半径。 - 对于
POINT(点),返回0.0。
语法
ST_LENGTH( <shape> )
参数
| 参数 | 说明 |
|---|---|
<shape> | 输入的几何图形,类型为 GEOMETRY 或可以转换为 GEOMETRY 的 VARCHAR(WKT 格式)。支持 LINESTRING, POLYGON, CIRCLE, POINT 等类型。 |
返回值
返回几何对象的长度或周长,单位为米(DOUBLE 类型)。
ST_LENGTH 存在以下边缘情况:
- 若输入参数为
NULL,返回NULL。 - 若输入参数无法解析为有效的几何对象,返回
NULL。 - 若输入几何对象为
POINT或长度为零的线,返回0.0。 - 对于
CIRCLE类型,使用ST_CIRCLE创建时半径参数的单位必须为米,以确保返回正确的圆周长(米)。
举例
计算线的长度 (LINESTRING)
-- 计算赤道上一段经度相差 1 度的线段的长度
SELECT ST_LENGTH(ST_GeometryFromText('LINESTRING(0 0, 1 0)'));
+--------------------------------------------------------+
| ST_LENGTH(ST_GeometryFromText('LINESTRING(0 0, 1 0)')) |
+--------------------------------------------------------+
| 111195.1011774839 |
+--------------------------------------------------------+
计算多边形的周长 (POLYGON)
-- 计算一个边长约0.0009度(约100米)的小正方形的周长
SELECT ST_LENGTH(ST_GeometryFromText('POLYGON((-0.00045 -0.00045, 0.00045 -0.00045, 0.00045 0.00045, -0.00045 0.00045, -0.00045 -0.00045))')) AS perimeter;
+-------------------+
| perimeter |
+-------------------+
| 400.3023642327689 |
+-------------------+
计算圆的周长 (CIRCLE)
-- 计算半径为 100 米的圆的周长
SELECT ST_LENGTH(ST_Circle(0, 0, 100));
+---------------------------------+
| ST_LENGTH(ST_Circle(0, 0, 100)) |
+---------------------------------+
| 628.3185307179587 |
+---------------------------------+
点的长度
SELECT ST_LENGTH(ST_GeometryFromText('POINT(1 1)'));
+----------------------------------------------+
| ST_LENGTH(ST_GeometryFromText('POINT(1 1)')) |
+----------------------------------------------+
| 0 |
+----------------------------------------------+
无效参数(返回 NULL)
SELECT ST_LENGTH('NOT_A_GEOMETRY');
+-----------------------------+
| ST_LENGTH('NOT_A_GEOMETRY') |
+-----------------------------+
| NULL |
+-----------------------------+
NULL 参数
SELECT ST_LENGTH(NULL);
+-----------------+
| ST_LENGTH(NULL) |
+-----------------+
| NULL |
+-----------------+
复杂线对象的长度
-- 计算一条折线的总长度
SELECT ST_LENGTH(ST_LineFromText("LINESTRING (0 0,1 0,1 1)"));
+--------------------------------------------------------+
| ST_LENGTH(ST_LineFromText("LINESTRING (0 0,1 0,1 1)")) |
+--------------------------------------------------------+
| 222390.2023549679 |
+--------------------------------------------------------+