跳到主要内容

空间分析函数

空间分析函数用于执行复杂空间处理和分析的函数,如缓冲区分析、合并、裁剪等。

seekdb 当前所支持的空间分析函数包括 ST_Length()ST_Centroid()_ST_PointOnSurface()

ST_Length

ST_Length(ls[,unit]) 函数用于计算线性几何体(如线段、折线或曲线)的长度。这个函数通常适用于 LINESTRINGMULTILINESTRING 类型的几何对象。

要使单位转换生效,几何体 ls 必须有一个与之关联的空间参考系统ID(SRID),且该 SRID 不为 0(SRID = 0 通常意味着没有空间参考)。

使用的单位必须是数据库支持的合法单位,且数据库能够识别该单位对应的转换系数。

全部单位和其对应转换系数如下:

+--------------------------------------+---------------------+
| UNIT_NAME | CONVERSION_FACTOR |
+--------------------------------------+---------------------+
| British chain (Benoit 1895 A) | 20.1167824 |
| British chain (Benoit 1895 B) | 20.116782494375872 |
| British chain (Sears 1922 truncated) | 20.116756 |
| British chain (Sears 1922) | 20.116765121552632 |
| British foot (1865) | 0.30480083333333335 |
| British foot (1936) | 0.3048007491 |
| British foot (Benoit 1895 A) | 0.3047997333333333 |
| British foot (Benoit 1895 B) | 0.30479973476327077 |
| British foot (Sears 1922 truncated) | 0.30479933333333337 |
| British foot (Sears 1922) | 0.3047994715386762 |
| British link (Benoit 1895 A) | 0.201167824 |
| British link (Benoit 1895 B) | 0.2011678249437587 |
| British link (Sears 1922 truncated) | 0.20116756 |
| British link (Sears 1922) | 0.2011676512155263 |
| British yard (Benoit 1895 A) | 0.9143992 |
| British yard (Benoit 1895 B) | 0.9143992042898124 |
| British yard (Sears 1922 truncated) | 0.914398 |
| British yard (Sears 1922) | 0.9143984146160288 |
| centimetre | 0.01 |
| chain | 20.1168 |
| Clarke's chain | 20.1166195164 |
| Clarke's foot | 0.3047972654 |
| Clarke's link | 0.201166195164 |
| Clarke's yard | 0.9143917962 |
| fathom | 1.8288 |
| foot | 0.3048 |
| German legal metre | 1.0000135965 |
| Gold Coast foot | 0.3047997101815088 |
| Indian foot | 0.30479951024814694 |
| Indian foot (1937) | 0.30479841 |
| Indian foot (1962) | 0.3047996 |
| Indian foot (1975) | 0.3047995 |
| Indian yard | 0.9143985307444408 |
| Indian yard (1937) | 0.91439523 |
| Indian yard (1962) | 0.9143988 |
| Indian yard (1975) | 0.9143985 |
| kilometre | 1000 |
| link | 0.201168 |
| metre | 1 |
| millimetre | 0.001 |
| nautical mile | 1852 |
| Statute mile | 1609.344 |
| US survey chain | 20.11684023368047 |
| US survey foot | 0.30480060960121924 |
| US survey link | 0.2011684023368047 |
| US survey mile | 1609.3472186944375 |
| yard | 0.9144 |
+--------------------------------------+---------------------+

语法如下:

ST_Length(ls[,unit])

参数释义:

  • ls:输入参数,表示要计算其长度的线性几何体。
  • unit:(可选参数)指定长度的单位。如果未提供,长度默认以米(metre)为单位。根据函数实现和空间数据库系统,这个参数可以接受各种长度单位,如 'foot'(英尺)、'centimetre'(厘米)等。

示例如下:

SET @ls = ST_GeomFromText('LineString(1 1,2 2,3 3)', 4326);
Query OK, 0 rows affected (0.001 sec)

SELECT ST_Length(@ls, "foot");
+------------------------+
| ST_Length(@ls, "foot") |
+------------------------+
| 1029205.9131247795 |
+------------------------+
1 row in set (0.001 sec)

SELECT ST_Length(@ls);
+-------------------+
| ST_Length(@ls) |
+-------------------+
| 313701.9623204328 |
+-------------------+
1 row in set (0.001 sec)

在这个示例中,首先通过 ST_GeomFromText 函数创建了一个线性几何体(LineString),这个几何体由三个点组成,每个点的坐标依次是 (1,1), (2,2), 和 (3,3)。

然后,使用 ST_Length 函数计算了这个 LineString 的长度。首先指定长度单位为英尺,得到的长度结果为 1029205.9131247795 英尺。然后,再次调用 ST_Length 函数但没有指定单位,因此使用默认单位米,得到的长度结果为 313701.9623204328 米。

ST_Centroid

ST_Centroid(geometry A) 是一个空间函数,用于计算给定几何体 A 的质心(几何中心)。质心是几何体各部分的平衡点,可以被视为几何体的中心位置。对于二维几何体,如多边形,质心是所有点的平均位置。

  • 如果 A 是空几何体(没有任何点),则函数可能返回 NULL 或无效结果。
  • 如果 A 是一个复杂的几何体,质心计算可能会变得复杂和计算密集,特别是当几何体具有很多顶点或内部孔洞时。
  • 计算出的质心点可能不位于原始几何体上,尤其是在几何体自身形状不规则或有凹部分时。例如,对于一个“U”形的多边形,质心可能位于凹陷的外部空间中。
  • 对于线性几何体(如线段或折线),质心是线上所有点的平均位置,但对于复杂线形(如自相交或弯曲的折线),质心的位置可能在直观上难以解释。

语法如下:

ST_Centroid(geometry A)

示例如下:

SELECT ST_AsText(_ST_PointOnSurface(geom)) AS pt_on_surf, ST_AsText(ST_Centroid(geom)) AS centroid FROM (SELECT ST_GeomFromText('POLYGON ((0 0, 0 10, 10 10, 10 8, 2 8, 2 2, 10 2, 10 0, 0 0))') AS geom) AS t;

在这个示例中,定义了一个具有复杂形状的多边形几何体,并对其进行了两种空间分析操作:

_ST_PointOnSurface 函数用于获取位于多边形表面上的一个点。这个点通常用于代表整个几何体的位置,并且保证位于多边形内部。 ST_Centroid 函数用于计算多边形的质心,它是多边形各部分的平衡点,但不保证位于多边形内部。 结果显示在两列中,第一列 pt_on_surf 是多边形表面上的点的坐标,第二列 centroid 是计算出的多边形质心的坐标。查询结果返回可见,多边形表面上的点位于 (1, 5),而质心的坐标是 (4.076923076923077, 5)。

返回结果如下:

+------------+----------------------------+
| pt_on_surf | centroid |
+------------+----------------------------+
| POINT(1 5) | POINT(4.076923076923077 5) |
+------------+----------------------------+
1 row in set (0.001 sec)

_ST_PointOnSurface

_ST_PointOnSurface(geometry a) 函数用于从输入的几何体 a 中返回一个点,该点保证位于几何体的表面上。它能够返回一个确切位于几何体内部的点(对于多边形和其他面状几何体来说),而不仅仅是几何体的几何或算术中心。

_ST_PointOnSurface 函数通常只对面状几何体(如多边形)有意义,因为对于线状或点状几何体来说,内部点的概念可能不太清晰或不适用。

该函数可能不会返回多个内部点中的任何一个,而是返回一个可代表整个几何体的特定点(例如,可能是多边形的一个角点或边上的一个点)。

语法如下:

_ST_PointOnSurface(geometry g1)

示例如下:

SELECT ST_AsText(_ST_PointOnSurface(geom)) AS pt_on_surf, ST_AsText(ST_Centroid(geom)) AS centroid FROM (SELECT ST_GeomFromText('POLYGON ((0 0, 0 10, 10 10, 10 8, 2 8, 2 2, 10 2, 10 0, 0 0))') AS geom) AS t;

在这个示例中,首先从 Well-Known Text (WKT) 格式的字符串创建了一个具有特定形状的多边形几何体。然后对这个多边形使用了两个函数:_ST_PointOnSurfaceST_Centroid

_ST_PointOnSurface 函数返回一个点,该点保证位于多边形的表面上,这意味着该点在多边形的边界或内部。而 ST_Centroid 函数计算并返回多边形的几何中心。

最后,查询结果使用了两列来展示这两个点的坐标,pt_on_surf 是表面上的点,而 centroid 是质心的坐标。在提供的示例中,pt_on_surf 返回了坐标为 (1 5) 的点,而 centroid 返回了坐标为 (4.076923076923077 5) 的点。

返回结果如下:

+------------+----------------------------+
| pt_on_surf | centroid |
+------------+----------------------------+
| POINT(1 5) | POINT(4.076923076923077 5) |
+------------+----------------------------+
1 row in set (0.001 sec)