MySQL ST_NumInteriorRing 怎样统计多边形内部孔洞
来源:17golang原创
时间:2026-10-27 08:32:59 279浏览 收藏
要统计 MySQL 中一个 Polygon 有几个内部孔洞,直接调用 ST_NumInteriorRing(poly) 即可。它返回内部环的数量,外部边界不计入这个数字;例如一个外环加两个内部环,结果就是 2。
官方地址:https://dev.mysql.com/doc/refman/8.4/en/gis-polygon-property-functions.html
最小写法是ST_NumInteriorRing(ST_GeomFromText(wkt))。若只是想知道孔洞数,用它;若还要查看某个孔洞的边界,再配合ST_InteriorRingN(),其中N从 1 开始。
问题:外环和孔洞为什么不能一起数
WKT 中的 Polygon 由一个外环和零个或多个内部环组成。外环描述多边形的外部边界,内部环描述被挖空的区域。ST_NumInteriorRing() 只返回后者的数量,因此不要把 WKT 中的环总数直接当成孔洞数:环总数减去外环才是内部环数量。
MySQL 8.4 手册同时列出单数形式 ST_NumInteriorRing() 和复数形式 ST_NumInteriorRings()。两者都用于返回 Polygon 的内部环数量,团队可以按现有 SQL 的命名习惯选择。
最小配方:用 ST_NumInteriorRing 统计一个孔洞
下面的 WKT 有一个外环和一个内部环。SQL 注释只解释示例的几何结构,不代表在本文环境中实际执行。
-- 外环是 0,0 到 10,10;内环是 2,2 到 4,4,表示一个孔洞 SET @poly = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(2 2,2 4,4 4,4 2,2 2))'; -- 统计 Polygon 的内部环数量,外环不会计入结果 SELECT ST_NumInteriorRing(ST_GeomFromText(@poly)) AS hole_count;
这个结构对应的结果应理解为 hole_count = 1。如果使用手册示例中的复数别名,写法如下:
-- 复数别名表达同一个统计意图,便于按团队命名习惯阅读 SELECT ST_NumInteriorRings(ST_GeomFromText(@poly)) AS hole_count;

变体:两个内部环时结果如何理解
一个 Polygon 可以包含多个内部环。下面把第二个孔洞加入同一个 WKT,函数返回的数量随内部环数量变化,外环仍然只算边界、不算孔洞。
-- 一个外环加两个内部环,两个内环分别代表两个独立孔洞 SET @poly_two_holes = 'POLYGON((0 0,12 0,12 12,0 12,0 0), (2 2,2 4,4 4,4 2,2 2), (7 7,7 10,10 10,10 7,7 7))'; -- 返回内部环数量,不把外环加到统计结果中 SELECT ST_NumInteriorRing(ST_GeomFromText(@poly_two_holes)) AS hole_count;
这类查询适合先做数据概览,例如把结果作为“地块孔洞数”展示。它回答的是“有几个内部环”,不是孔洞面积、孔洞周长,也不是多边形是否几何有效;这些是不同的问题,不能从数量列推导。
关键边界:N 从 1 开始,外环没有这个编号
统计数量后,如果还要检查某个孔洞的边界,可以使用 ST_InteriorRingN(poly, N)。官方手册说明内部环编号从 1 开始,因此第一个孔洞传入 1,第二个传入 2。返回值是一个 LineString,可以再用 ST_AsText() 转成便于阅读的 WKT。
-- N=1 表示第一个内部环;它不是外环,外环不参与这个编号 SELECT ST_AsText( ST_InteriorRingN(ST_GeomFromText(@poly_two_holes), 1) ) AS first_hole_ring; -- N=2 表示第二个内部环,返回同样是 LineString 形态的边界 SELECT ST_AsText( ST_InteriorRingN(ST_GeomFromText(@poly_two_holes), 2) ) AS second_hole_ring;
如果业务字段里的“第一个环”指的是整个 WKT 的第一个环,就要特别注意:那个环是外环;而 ST_InteriorRingN() 的 N=1 指第一个内部环。两套编号不要混用。

兼容坑:NULL、空几何和格式错误要分开看
MySQL 手册对这一组 Polygon 属性函数给出了通用输入规则。把这些情况分开处理,排查时比只盯着返回的数字更可靠。
| 输入情况 | 应关注的表现 | 写查询时的含义 |
|---|---|---|
| 参数为 NULL | 返回 NULL | 不要把 NULL 自动当成 0;它可能表示没有输入对象。 |
| 几何对象为空 | 返回 NULL | 空几何与“有一个没有孔洞的 Polygon”不是同一条数据语义。 |
| 几何语法不完整 | 可能出现 ER_GIS_INVALID_DATA | 先检查 WKT 的括号、环闭合和坐标表达。 |
| SRS 未定义 | 可能出现 ER_SRS_NOT_FOUND | 使用带 SRS 的数据时,要让空间参考标识能够被 MySQL 识别。 |
-- NULL 会沿着函数结果传递,报表层需要决定如何展示它
SELECT ST_NumInteriorRing(NULL) AS hole_count;
-- 空几何也不应直接解释为“0 个孔洞”
SELECT ST_NumInteriorRing(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY')) AS hole_count;
此外,本文标题讨论的是 Polygon 的内部环计数。若列中存的是 MultiPolygon,不能只因为名字相似就假设函数会自动把每个组成多边形的孔洞相加;应先依据实际数据类型选择对应的拆分或业务聚合方案。
完整片段:统计并读取第一个孔洞
如果页面既要显示孔洞数量,又要在详情页读取第一个孔洞的边界,可以把两个动作放在同一组查询中。这里仍然只展示函数关系,未把示例当作线上执行结果。
-- 统一准备一个包含两个内部环的 Polygon SET @poly = 'POLYGON((0 0,12 0,12 12,0 12,0 0), (2 2,2 4,4 4,4 2,2 2), (7 7,7 10,10 10,10 7,7 7))'; -- 数量字段用于摘要,指定内部环用于详情;两个函数的 N 规则要保持一致 SELECT ST_NumInteriorRing(ST_GeomFromText(@poly)) AS hole_count, ST_AsText(ST_InteriorRingN(ST_GeomFromText(@poly), 1)) AS first_hole_ring;
落地时可以按下面的顺序检查:
- 确认数据确实是
Polygon,并把外环与内部环的语义分开。 - 用
ST_NumInteriorRing()得到孔洞数量;数量为 0 只表示没有内部环。 - 需要具体边界时,用从 1 开始的
ST_InteriorRingN()读取指定内部环。 - 遇到 NULL、空几何或错误时,保留原始状态,不要统一改写成数字 0。
常见追问
ST_NumInteriorRing 和 ST_NumInteriorRings 有什么区别?
MySQL 8.4 手册将两者并列为返回 Polygon 内部环数量的函数名。一个是单数形式,一个是复数形式,按团队可读性选择即可。
外环会不会被 ST_NumInteriorRing 统计进去?
不会。它统计的是内部环,也就是通常所说的多边形孔洞;外环只是 Polygon 的外部边界。
怎样读取第二个孔洞的坐标?
用 ST_InteriorRingN(poly, 2) 取得第二个内部环,再用 ST_AsText() 转成 WKT。编号从 1 开始,不要传 0。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
430 收藏
-
289 收藏
-
264 收藏
-
330 收藏
-
198 收藏
-
381 收藏
-
296 收藏
-
488 收藏
-
399 收藏
-
387 收藏
-
384 收藏
-
429 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习