MySQL ST_Longitude 怎样读取地理点的经度
来源:17golang原创
时间:2026-10-27 08:29:50 198浏览 收藏
在 MySQL 空间字段里,读取地理点经度的直接方法是 ST_Longitude(point)。它要求参数是有效的 Point,并且带有地理空间参考系(SRS);返回值是经度数值。实际排查时,先看 SRID,再看坐标轴顺序,不要把“第一个坐标”直接等同于经度。
官方地址:https://dev.mysql.com/doc/refman/8.4/en/gis-point-property-functions.html
ST_Longitude(p)读取带地理 SRS 的 Point 经度,结果是双精度数。- SRID 4326 的默认轴定义是纬度、经度,所以 WKT 输入要先确认语义。
ST_X()按 SRS 第一轴工作,不能在所有地理点上替代ST_Longitude()。
创建带地理 SRS 的 POINT
先用一个带 SRID 4326 的点作为示例。WGS 84 的轴定义是 Lat、Long,下面的 WKT 因而按“纬度、经度”填写。上海附近的测试点可写成:
-- 4326 的 SRS 定义先写纬度,再写经度
SET @pt = ST_GeomFromText('POINT(31.2304 121.4737)', 4326);
-- 先确认对象类型和空间参考系
SELECT ST_GeometryType(@pt) AS geometry_type,
ST_SRID(@pt) AS srid;
-- 地理语义下分别读取纬度和经度
SELECT ST_Latitude(@pt) AS latitude,
ST_Longitude(@pt) AS longitude;
这里的关键不是把数字放进 POINT 就结束,而是给点绑定了可识别的地理 SRS。ST_Longitude(@pt)应得到约 121.4737,ST_Latitude(@pt)应得到约 31.2304。表字段已经保存空间对象时,也可以直接把列名传给函数。

用 ST_Longitude 读取或修改经度
单参数调用用于读取:
-- 单参数返回经度数值,不会改变原 Point SELECT ST_Longitude(@pt) AS longitude; -- 第二参数表示新的经度,返回一个经度被替换后的 Point SELECT ST_AsText(ST_Longitude(@pt, 120.9000)) AS changed_point;
第二个参数的语义容易被忽略:它不是格式化精度,也不是查询过滤条件,而是返回一个新点,并把经度替换成给定值。经度必须落在 (-180, 180] 范围内;超出范围会触发经度越界错误。若只想查看原值,保持单参数形式最清楚。
生产查询可以把结果投影成普通数值,再交给应用层地图、报表或导出逻辑。若还需要纬度,应显式调用 ST_Latitude(),不要依赖列序或字符串拆分。
axis-order 与错误边界
最常见的偏差来自把 ST_X() 当成经度读取器。ST_X()返回 SRS 定义中的第一轴;而 ST_Longitude()表达的是经度语义。对 SRID 4326 来说,第一轴是纬度,因此两者可能得到不同结果。
-- 用 SRID 4326 时,显式比较语义函数与第一轴函数
SELECT ST_Longitude(@pt) AS longitude,
ST_Latitude(@pt) AS latitude,
ST_X(@pt) AS first_axis,
ST_Y(@pt) AS second_axis;
-- 外部数据若明确采用经度、纬度顺序,导入时覆盖默认轴顺序
SET @lon_lat = ST_GeomFromText(
'POINT(121.4737 31.2304)',
4326,
'axis-order=long-lat'
);
SELECT ST_Longitude(@lon_lat) AS longitude;
此外,NULL输入会得到 NULL;有效但不是 Point 的几何对象会报几何类型错误;语法不完整或 SRID 未定义也会失败。没有地理 SRS 的普通 Point()属于笛卡尔对象,调用 ST_Longitude()会触发 ER_SRS_NOT_GEOGRAPHIC,这时不是把它换成 ST_X()就能证明数据是经纬度。

落地前的检查清单
| 检查项 | 建议 |
|---|---|
| 对象类型 | 确认输入是有效 Point,而不是 LineString 或 Polygon。 |
| 空间参考系 | 确认 SRID 已定义且属于地理 SRS,不能只看列名。 |
| 坐标顺序 | 确认上游 WKT 是 lat-long 还是 long-lat,必要时显式写 axis-order。 |
| 函数选择 | 需要经度就用 ST_Longitude,需要第一轴才用 ST_X。 |
常见问题
ST_Longitude 返回 NULL 怎么处理
先确认传入表达式本身是否为 NULL。MySQL 对这类空间属性函数遵循 NULL 传播;如果对象不是 NULL 但报错,则继续检查几何类型、SRID 是否存在以及 SRS 是否为地理坐标系。
为什么读取出的经度像是第二个坐标
因为地理 SRS 有自己的轴定义。SRID 4326 默认按其 Lat、Long 轴解释 WKT;外部系统常用 Long、Lat,导入时应通过 axis-order=long-lat 明确告诉 MySQL 输入顺序,再使用 ST_Longitude()读取经度。
记住一条边界即可:ST_Longitude()回答的是“这个地理 Point 的经度是多少”,而 ST_X()回答的是“这个 SRS 的第一轴数值是多少”。先确认 SRID 和轴顺序,再读取结果,后续的空间计算才不会从输入阶段开始偏移。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
430 收藏
-
289 收藏
-
264 收藏
-
279 收藏
-
330 收藏
-
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次学习