MySQL ST_IsClosed 怎样判断折线是否闭合
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 文档。
MySQL ST_GeometryN 怎样读取集合中的指定几何对象
- 上一篇
- MySQL ST_GeometryN 怎样读取集合中的指定几何对象
- 下一篇
- MySQL ST_AsGeoJSON 怎样控制几何输出的小数位
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_AsGeoJSON 怎样控制几何输出的小数位
- 430浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_GeometryN 怎样读取集合中的指定几何对象
- 264浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_NumInteriorRing 怎样统计多边形内部孔洞
- 279浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_ExteriorRing 怎样提取多边形外环
- 330浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_Longitude 怎样读取地理点的经度
- 198浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_SwapXY 怎样交换几何对象的坐标分量
- 381浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_HausdorffDistance 怎样衡量两个几何集合的最大偏离
- 296浏览 收藏
-
- 数据库 · MySQL | 1小时前 | MySQL · mysql ST_FrechetDistance 空间函数 轨迹比较 LineString
- MySQL ST_FrechetDistance 怎样比较两条轨迹的形状差异
- 488浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_LineInterpolatePoint 怎样定位折线上的比例位置
- 399浏览 收藏
-
- 数据库 · MySQL | 1小时前 | MySQL · 数据校验 · 空间数据 MySQL ST_Validate 几何有效性 WKT ST_IsValid
- MySQL ST_Validate 怎样检查并返回有效几何对象
- 387浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_Simplify 怎样减少折线中的冗余点
- 384浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL ST_MakeEnvelope 怎样从两个点构造矩形范围
- 429浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 727次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 733次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 809次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 772次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 609次使用
-
- MySQL JSON_TABLE 展开数组时如何保留缺失字段
- 2026-09-10 501浏览
-
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 2026-08-30 501浏览
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览

