14.16.7.4 多边形和多边形属性函数
本节中的函数返回Polygon
或MultiPolygon
值的属性。
除非另有指定,以下函数在处理几何形状参数时遵循以下规则:
-
如果任何参数为
NULL
或任何几何形状参数为空几何形状,则返回值为NULL
。 -
如果任何几何形状参数不是语法正确的几何形状,发生
ER_GIS_INVALID_DATA
错误。 -
如果任何几何形状参数是语法正确的几何形状,但在未定义的空间参考系统(SRS)中,则发生
ER_SRS_NOT_FOUND
错误。 -
对于需要多个几何形状参数的函数,如果这些参数不在同一个SRS中,则发生
ER_GIS_DIFFERENT_SRIDS
错误。 -
否则,返回值不是
NULL
。
这些函数可用于获取多边形属性:
-
返回一个双精度数字,表示
Polygon
或MultiPolygon
参数的面积,以其空间参考系统为单位。ST_Area()
根据本节介绍中描述的方式处理其参数,以下例外情况:-
如果几何体是几何无效的,则结果可能是一个未定义的面积(即可以是任何数字),或者发生错误。
-
如果几何体是有效的,但不是
Polygon
或MultiPolygon
对象,发生ER_UNEXPECTED_GEOMETRY_TYPE
错误。 -
如果几何体是有效的
Polygon
在笛卡尔坐标系中,则结果是该多边形的笛卡尔面积。 -
如果几何体是有效的
MultiPolygon
在笛卡尔坐标系中,则结果是多个多边形的笛卡尔面积之和。 -
如果几何体是有效的
Polygon
在地理坐标系中,则结果是该多边形在该坐标系中的地理面积,以平方米为单位。 -
如果几何体是有效的
MultiPolygon
在地理坐标系中,则结果是多个多边形在该坐标系中的地理面积之和,以平方米为单位。 -
如果面积计算结果为
+inf
,发生ER_DATA_OUT_OF_RANGE
错误。 -
如果几何体具有地理SRS,且经度或纬度超出范围,错误将发生:
-
如果经度值不在(-180, 180]范围内,将出现
ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在[−90, 90]范围内,将出现
ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE
错误。
显示的范围是度数。由于浮点计算,实际范围略有不同。
-
mysql> SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))'; mysql> SELECT ST_Area(ST_GeomFromText(@poly)); +---------------------------------+ | ST_Area(ST_GeomFromText(@poly)) | +---------------------------------+ | 4 | +---------------------------------+ mysql> SET @mpoly = 'MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))'; mysql> SELECT ST_Area(ST_GeomFromText(@mpoly)); +----------------------------------+ | ST_Area(ST_GeomFromText(@mpoly)) | +----------------------------------+ | 8 | +----------------------------------+
-
-
返回Polygon或MultiPolygon参数的数学中心点作为Point。结果不保证在MultiPolygon上。
这个函数处理几何集合,通过计算集合中最高维度组件的中心点来实现。这些组件被提取并转换为单个MultiPolygon、MultiLineString或MultiPoint,以便进行中心点计算。
ST_Centroid()
根据本节介绍中描述的方式处理其参数,以下例外:-
返回值为
NULL
,当参数是一个空几何集合时满足额外条件。 -
如果几何对象具有地理空间参考系统(SRS)的SRID值,则出现
ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
错误。
mysql> SET @poly = ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))'); mysql> SELECT ST_GeometryType(@poly),ST_AsText(ST_Centroid(@poly)); +------------------------+--------------------------------------------+ | ST_GeometryType(@poly) | ST_AsText(ST_Centroid(@poly)) | +------------------------+--------------------------------------------+ | POLYGON | POINT(4.958333333333333 4.958333333333333) | +------------------------+--------------------------------------------+
-
-
将
Polygon
值poly
的外部环返回为LineString
。ST_ExteriorRing()
根据本节介绍中描述处理其参数。mysql> SET @poly = 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'; mysql> SELECT ST_AsText(ST_ExteriorRing(ST_GeomFromText(@poly))); +----------------------------------------------------+ | ST_AsText(ST_ExteriorRing(ST_GeomFromText(@poly))) | +----------------------------------------------------+ | LINESTRING(0 0,0 3,3 3,3 0,0 0) | +----------------------------------------------------+
-
将
Polygon
值poly
的第N
-个内部环返回为LineString
。从1开始编号。ST_InteriorRingN()
根据本节介绍中描述处理其参数。mysql> SET @poly = 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'; mysql> SELECT ST_AsText(ST_InteriorRingN(ST_GeomFromText(@poly),1)); +-------------------------------------------------------+ | ST_AsText(ST_InteriorRingN(ST_GeomFromText(@poly),1)) | +-------------------------------------------------------+ | LINESTRING(1 1,1 2,2 2,2 1,1 1) | +-------------------------------------------------------+
-
ST_NumInteriorRing(
,poly
)ST_NumInteriorRings(
poly
)返回Polygon值
poly
中的内环数量。ST_NumInteriorRing()
和ST_NuminteriorRings()
按照本节介绍中描述的方式处理其参数。mysql> SET @poly = 'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'; mysql> SELECT ST_NumInteriorRings(ST_GeomFromText(@poly)); +---------------------------------------------+ | ST_NumInteriorRings(ST_GeomFromText(@poly)) | +---------------------------------------------+ | 1 | +---------------------------------------------+