ST_AREA_SQUARE_METERS
描述
计算地球球面上闭合区域的面积,单位为平方米。输入参数为表示地球表面区域的几何对象(如多边形、圆形、多面体等)。
对于非闭合几何对象(如点、线段),其面积为 0;对于无效几何对象(如自相交多边形),返回 NULL。
语法
ST_AREA_SQUARE_METERS( <geo>)
参数
| 参数 | 说明 | 
|---|---|
| <geo> | 地球球面上的几何对象,支持 GeoPolygon、GeoCircle、GeoMultiPolygon 等闭合区域类型。 | 
返回值
返回区域的面积,单位为平方米,类型为 DOUBLE。
ST_AREA_SQUARE_METERS 存在以下边缘情况:
- 若输入参数为 NULL,返回 NULL。
- 若输入为非闭合几何对象(如点 GeoPoint、线段 GeoLineString),返回 0。
- 若输入几何对象无效(如自相交多边形、未闭合多边形),返回 NULL。
- 若输入坐标超出经纬度范围(经度 [-180, 180],纬度 [-90, 90]),返回 NULL。
举例
圆形区域(半径 1 度的圆)
SELECT ST_Area_Square_Meters(ST_Circle(0, 0, 1));
+-------------------------------------------------+
| st_area_square_meters(st_circle(0.0, 0.0, 1.0)) |
+-------------------------------------------------+
|                              3.1415926535897869 |
+-------------------------------------------------+
点对象(无面积)
SELECT ST_Area_Square_Meters(ST_Point(0, 1));
+-------------------------------------------+
| st_area_square_meters(st_point(0.0, 1.0)) |
+-------------------------------------------+
|                                         0 |
+-------------------------------------------+
线段对象(无面积)
SELECT ST_Area_Square_Meters(ST_LineFromText("LINESTRING (1 1, 2 2)"));
+-----------------------------------------------------------------+
| st_area_square_meters(st_linefromtext('LINESTRING (1 1, 2 2)')) |
+-----------------------------------------------------------------+
|                                                               0 |
+-----------------------------------------------------------------+
简单正方形区域(经纬度范围较小)
mysql> SELECT ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))"));
+--------------------------------------------------------------------------+
| ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))")) |
+--------------------------------------------------------------------------+
|                                                       12364036567.076408 |
+--------------------------------------------------------------------------+
复杂多边形区域
mysql> SELECT ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 5 1, 10 0, 5 -1, 0 0))"));
+----------------------------------------------------------------------------+
| ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 5 1, 10 0, 5 -1, 0 0))")) |
+----------------------------------------------------------------------------+
|                                                         123725166420.83101 |
+----------------------------------------------------------------------------+
跨经度 180° 的矩形区域
mysql> SELECT ST_Area_Square_Meters(ST_Polygon("POLYGON ((179 0, 180 0, 180 1, 179 1, 179 0))"));
+------------------------------------------------------------------------------------+
| ST_Area_Square_Meters(ST_Polygon("POLYGON ((179 0, 180 0, 180 1, 179 1, 179 0))")) |
+------------------------------------------------------------------------------------+
|                                                                  12364036567.07628 |
+------------------------------------------------------------------------------------+
南半球圆形区域
mysql> SELECT ST_Area_Square_Meters(ST_Circle(0, -30, 2));
+---------------------------------------------+
| ST_Area_Square_Meters(ST_Circle(0, -30, 2)) |
+---------------------------------------------+
|                          12.566370614359073 |
+---------------------------------------------+
无效多边形(自相交)
mysql>  SELECT ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))"));
+--------------------------------------------------------------------------+
| ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))")) |
+--------------------------------------------------------------------------+
|                                                                     NULL |
+--------------------------------------------------------------------------+
未闭合多边形
mysql> SELECT ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 1 0, 1 1, 0 1))"));
+---------------------------------------------------------------------+
| ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 1 0, 1 1, 0 1))")) |
+---------------------------------------------------------------------+
|                                                                NULL |
+---------------------------------------------------------------------+
坐标超出范围
mysql>  SELECT ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 200 0, 200 1, 0 1, 0 0))"));
+------------------------------------------------------------------------------+
| ST_Area_Square_Meters(ST_Polygon("POLYGON ((0 0, 200 0, 200 1, 0 1, 0 0))")) |
+------------------------------------------------------------------------------+
|                                                                         NULL |
+------------------------------------------------------------------------------+
空对象输入
mysql> SELECT ST_Area_Square_Meters(NULL);
+-----------------------------+
| ST_Area_Square_Meters(NULL) |
+-----------------------------+
|                        NULL |
+-----------------------------+