跳到主要内容

ST_LENGTH

描述

返回线几何对象的球面长度,或面几何对象的边界周长,单位为米。此函数使用球面地球模型进行计算。

  • 对于 LINESTRING(线)或 MULTILINESTRING(多线),返回其所有线段在球面上的大圆距离之和,即线对象的长度
  • 对于 POLYGON(多边形)或 MULTIPOLYGON(多多边形),返回其外边界和内边界(孔洞)在球面上的大圆距离之和,即面对象的周长
  • 对于 CIRCLE(圆),返回其圆周长,计算公式为 2 * π * 半径
  • 对于 POINT(点),返回 0.0
备注

从 Apache Doris 4.0.4 开始支持该函数

语法

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