当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL ST_IsClosed 怎样判断折线是否闭合

MySQL ST_IsClosed 怎样判断折线是否闭合

来源:17golang原创 2026-10-27 08:36:23 0浏览 收藏

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;

如果业务目标是将边网生成区域,需要另行定义端点匹配、方向整理、重复边、交叉和区域构造等规则。不要通过在每条边末尾重复加起点来“修正”结果,那会把一条边改成折返线,产生另一份几何含义。

多折线成员闭合与整体线网关系结构图
静态结构图:MultiLineString 的闭合要求作用于各成员,不进行自动拼环。

闭合、自相交与多边形是什么关系

问题对应关注点不能据此推断
折线首尾是否相同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 文档。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
MySQL ST_GeometryN 怎样读取集合中的指定几何对象MySQL ST_GeometryN 怎样读取集合中的指定几何对象
上一篇
MySQL ST_GeometryN 怎样读取集合中的指定几何对象
MySQL ST_AsGeoJSON 怎样控制几何输出的小数位
下一篇
MySQL ST_AsGeoJSON 怎样控制几何输出的小数位
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    727次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    733次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    809次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    772次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    609次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码