MySQL ST_IsClosed 怎样判断折线是否闭合
来源:17golang原创
时间:2026-10-27 08:36:23 289浏览 收藏
MySQL 提供的空间函数 ST_IsClosed 可以直接用来判断折线是否闭合,只需要把你要检测的 LINESTRING 类型折线作为参数传入,函数就会返回0或者1,分别对应非闭合和闭合两种状态。
直接调用 ST_IsClosed 函数传入折线几何对象即可自动判断闭合,无需手动提取首尾坐标做对比。
MySQL ST_IsClosed(ls) 用于判断线是否闭合:对 LineString,起点与终点相同时返回 1,否则返回 0;对 MultiLineString,需要其中每一条 LineString 都各自闭合。它不会把若干开放线段自动拼成一个环,也不能仅凭结果为 1 就断定输入是合法多边形边界。
官方地址:https://dev.mysql.com/doc/refman/8.4/en/gis-linestring-property-functions.html
闭合究竟判断哪两个点
考虑导入线路后给记录标记“是否回到起点”的场景。这里首先要确定要问的是单条线路是否闭合,还是整个线网能不能围成区域。ST_IsClosed 回答前一个层面的几何属性问题。
例如,平面折线 (2,1)、(8,1)、(8,6)、(2,1) 的首尾相同,按定义闭合;若最后一个点换为 (2,2),就不闭合。中间是否绕行、是否有交叉,不属于首尾相同这个条件。不要因为预览图片的线宽遮住了一个小间隙,就认为数据库也应返回 1。

怎样写一个可解释的判定查询
下面使用 SRID 0 平面坐标,并把原始 WKT、起终点和闭合值一同输出,便于读者理解。示例没有连接数据库执行,文中的结论来自函数定义与坐标推导。
-- 构造一条闭合折线与一条开放折线,均为平面示例。
SET @closed_line = ST_GeomFromText(
'LINESTRING(2 1,8 1,8 6,2 1)', 0
);
SET @open_line = ST_GeomFromText(
'LINESTRING(2 1,8 1,8 6,2 2)', 0
);
-- 保留原始几何与端点,避免只看一个布尔值无法解释原因。
SELECT
ST_AsText(@closed_line) AS source_wkt,
ST_AsText(ST_StartPoint(@closed_line)) AS start_wkt,
ST_AsText(ST_EndPoint(@closed_line)) AS end_wkt,
ST_IsClosed(@closed_line) AS is_closed;
-- 第二个对象首尾不同,按定义应判为开放折线。
SELECT ST_IsClosed(@open_line) AS open_line_closed;
应用层应先明确只接受线型数据,并保存解析错误。WKT 是文本表示,要先通过 ST_GeomFromText 等接口得到几何值。不要把非法几何、空值或不支持的坐标系错误统一转成“未闭合”,那样会掩盖数据入口的问题。
对业务表查询时,可以把 ST_IsClosed 的结果放在返回字段中,让调用方明确区分 1、0 和 NULL。只筛选值为 1 的记录会自然漏掉未知状态,因此在做质量统计时还要单独统计缺失输入,而不是把剩下所有记录都解释成开放线。
多条线拼成一圈为什么仍可能不闭合
MultiLineString 的闭合定义是“每个成员自己闭合”。几条开放边即使首尾接成一个三角形,也不会因为整体看上去围成一圈,就满足这个判定。函数不负责按端点连接成员、合并拓扑或重建多边形。
-- 三个成员共同围成三角形,但每个成员自身都是开放线段。
SET @edges = ST_GeomFromText(
'MULTILINESTRING((0 0,5 0),(5 0,2 4),(2 4,0 0))', 0
);
SELECT ST_IsClosed(@edges) AS each_member_closed;
-- 单独查看一个成员,展示“成员自己闭合”的判定单位。
SELECT
ST_AsText(ST_GeometryN(@edges, 1)) AS first_member,
ST_IsClosed(ST_GeometryN(@edges, 1)) AS first_member_closed;
如果业务目标是将边网生成区域,需要另行定义端点匹配、方向整理、重复边、交叉和区域构造等规则。不要通过在每条边末尾重复加起点来“修正”结果,那会把一条边改成折返线,产生另一份几何含义。

闭合、自相交与多边形是什么关系
| 问题 | 对应关注点 | 不能据此推断 |
|---|---|---|
| 折线首尾是否相同 | ST_IsClosed | 是否没有自相交 |
| 线是否满足简单性条件 | ST_IsSimple 的相应规则 | 是否已经成为 Polygon |
| 能否作为目标区域的边界 | 环、区域结构与业务要求 | 仅首尾一致即可构造任何多边形 |
| 线路是否回到起点附近 | 距离容差与业务定义 | 严格闭合函数会自动采用业务容差 |
一个首尾相同的折线可以在中间交叉。即使它满足闭合条件,几何类型仍然是 LineString,调用 ST_IsClosed 也不会把它转换为 Polygon。涉及面数据时,应处理外环、内环、交叉和几何有效性等独立条件。通用几何属性文档介绍了几何类型和简单性等属性。
把“闭合”和“可用区域”分开保存,能使导入报错更有针对性。例如提示“端点未重合”和“边界自相交”应对应不同问题;不要让一个总的通过标志替代所有具体原因。
NULL、坐标精度和地理坐标怎样处理
MySQL 8.4 文档明确指出 ST_IsClosed 不支持地理 SRS,会报 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS。本文示例使用 SRID 0,不能据此推断同一查询直接适用于 SRID 4326。也不要仅把地理数据 SRID 改为 0 来消除报错,那会改变解释约定而非完成正确的坐标处理。
NULL 表示缺失或未知状态,与 0 有不同含义。函数参数若语法不完整或使用未定义的 SRS,可能出现错误;调用方应保留错误类别。正式业务入口还应区分空输入和支持的线类型,避免把各种非线对象混入同一判定列。
起终点只差很小,为什么不闭合?ST_IsClosed 没有提供业务容差参数。若业务允许“接近即算到达”,应单独定义距离阈值、单位和 SRS,并另存“近似到达”状态,不能把它当作严格闭合。
把显示坐标保留两位小数后相同,能证明闭合吗?不能。显示舍入可能掩盖实际差异,应使用原始几何判断;若要修改数据精度,需明确这会改变几何本身。
只要多折线整体接起来就返回 1 吗?不会。它要求每条成员折线分别闭合,不能代替整体线网的拓扑分析。
接口定义与地理 SRS 限制见 MySQL ST_IsClosed 文档。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
430 收藏
-
264 收藏
-
279 收藏
-
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次学习