跳到主要内容

ST_AREA_SQUARE_KM

描述

计算地球球面上闭合区域的面积,单位为平方千米。输入参数为表示地球表面区域的几何对象(如多边形、圆形、多面体等)。

对于非闭合几何对象(如点、线段),其面积为 0;对于无效几何对象(如自相交多边形),返回 NULL。

语法

ST_AREA_SQUARE_KM( <geo>)

参数

参数说明
<geo>地球球面上的几何对象,支持 GeoPolygon、GeoCircle、GeoMultiPolygon 等闭合区域类型。

返回值

ST_AREA_SQUARE_Km 存在以下边缘情况:

若输入参数为 NULL,返回 NULL。 若输入为非闭合几何对象(如点 GeoPoint、线段 GeoLineString),返回 0。 若输入几何对象无效(如自相交多边形、未闭合多边形),返回 NULL。 若输入坐标超出经纬度范围(经度 [-180, 180],纬度 [-90, 90]),返回 NULL。

举例

简单正方形区域(经纬度范围较小),边长约 1° 的正方形区域,面积约为 12,364 平方千米

SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))"));
+----------------------------------------------------------------------+
| st_area_square_km(st_polygon('POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))')) |
+----------------------------------------------------------------------+
| 12364.036567076409 |
+----------------------------------------------------------------------+

更大范围的矩形区域

mysql> SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"));
+--------------------------------------------------------------------------+
| ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))")) |
+--------------------------------------------------------------------------+
| 1233204.7035253085 |
+--------------------------------------------------------------------------+

包含曲线的复杂多边形

mysql> SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 5 1, 10 0, 5 -1, 0 0))"));
+------------------------------------------------------------------------+
| ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 5 1, 10 0, 5 -1, 0 0))")) |
+------------------------------------------------------------------------+
| 123725.16642083102 |
+------------------------------------------------------------------------+

跨经度 180° 的区域

mysql> SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((179 0, 180 0, 180 1, 179 1, 179 0))"));
+--------------------------------------------------------------------------------+
| ST_Area_Square_Km(ST_Polygon("POLYGON ((179 0, 180 0, 180 1, 179 1, 179 0))")) |
+--------------------------------------------------------------------------------+
| 12364.036567076282 |
+--------------------------------------------------------------------------------+

南半球区域

mysql> SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((0 -10, 10 -10, 10 -20, 0 -20, 0 -10))"));
+----------------------------------------------------------------------------------+
| ST_Area_Square_Km(ST_Polygon("POLYGON ((0 -10, 10 -10, 10 -20, 0 -20, 0 -10))")) |
+----------------------------------------------------------------------------------+
| 1195196.6541230455 |
+----------------------------------------------------------------------------------+

无效多边形(自相交)

mysql> SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))"));
+----------------------------------------------------------------------+
| ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))")) |
+----------------------------------------------------------------------+
| NULL |
+----------------------------------------------------------------------+

超出经纬度范围

mysql> SELECT ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 200 0, 200 1, 0 1, 0 0))"));
+--------------------------------------------------------------------------+
| ST_Area_Square_Km(ST_Polygon("POLYGON ((0 0, 200 0, 200 1, 0 1, 0 0))")) |
+--------------------------------------------------------------------------+
| NULL |
+--------------------------------------------------------------------------+

空对象

mysql> SELECT ST_Area_Square_Km(NULL);
+-------------------------+
| ST_Area_Square_Km(NULL) |
+-------------------------+
| NULL |
+-------------------------+

计算圆的区域面积

mysql> SELECT ST_Area_Square_Km(ST_Circle(0, 0, 1));
+---------------------------------------+
| ST_Area_Square_Km(ST_Circle(0, 0, 1)) |
+---------------------------------------+
| 3.141592653589787e-06 |
+---------------------------------------+

点对象(无面积)

SELECT ST_Area_Square_Km(ST_Point(0, 1));
+-------------------------------------------+
| st_area_square_Km(st_point(0.0, 1.0)) |
+-------------------------------------------+
| 0 |
+-------------------------------------------+

线段对象(无面积)

SELECT ST_Area_Square_Km(ST_LineFromText("LINESTRING (1 1, 2 2)"));
+-----------------------------------------------------------------+
| st_area_square_Km(st_linefromtext('LINESTRING (1 1, 2 2)')) |
+-----------------------------------------------------------------+
| 0 |
+-----------------------------------------------------------------+