登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  MySQL

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。表字段已经保存空间对象时,也可以直接把列名传给函数。

Point、SRID 4326、Latitude、Longitude 与 ST_Longitude 的关系说明图
图1:Point 与地理 SRS 的关系说明图,不是 MySQL 截图或运行证据。

用 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()就能证明数据是经纬度。

地理 SRS、笛卡尔 SRS、ST_Longitude、ST_X 与 axis-order 的边界说明图
图2:经度读取与坐标轴边界说明图,不是软件截图或运行证据。

落地前的检查清单

检查项建议
对象类型确认输入是有效 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 和轴顺序,再读取结果,后续的空间计算才不会从输入阶段开始偏移。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>